高三数学学习方法 一道解析几何题目 请问我的方法哪里错么了?为什么算出来的结果是错的?谢谢!

豆丁微信公众号
君,已阅读到文档的结尾了呢~~
一道高考解析几何题的求解及其推广
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
一道高考解析几何题的求解及其推广
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='http://www.docin.com/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口问三道高中数学题,一道解析几何一道立体几何一道数列。谢谢!_百度知道
问三道高中数学题,一道解析几何一道立体几何一道数列。谢谢!
1.直线x+y=a与圆x²+y²=1交于不同的两点A、B,O为坐标原点,若向量OA·向量OB=a,则a的值为多少。
2.空间四面体ABCD,两对 对棱 互相垂直,求证:余下的另一对 对棱也互相垂直。
3.题目见下面这个链接里面的图片,只用做第二小问,第一小问知道,第一...
第3道数列题说错了,是只用做第三小问,第一二小问都知道了,第二小问的答案是a_n=n,第二小问不要做了啊!
我有更好的答案
OA*OB=|OA|*|OB|*cos2@所以cos2@=a同时,cos@=a/根号2cos2@=2cos@*cos@-1所以a=a*a-1a=(1±根号5)/2因为cos2@=a=(1+根号5)/2&1,所以舍去。 第二题,假设AB垂直CD, AD垂直BC作BE垂直CD交CD于E, DF垂直BC交于F, BE交DF于O, 连接AO,COBC垂直DF, BC垂直AD, BC垂直面ADF, 则BC垂直AOCD垂直AB,CD垂直BE, CD垂直面ABE,则CD垂直AOAO垂直BC, AO垂直CD, AO垂直BCD, 则AO垂直BD因为三垂线交于一点,所以BD垂直CO,BD垂直AO, BD垂直CO, BD垂直面ACO,则BD垂直AC 第三题,2Sn=an*an+an,
2Sn-1=an-1*an-1+an-1两式想减得到2an=an*an+an-an-1*an-1-an-1整理得到an+an-1=(an+an-1)(an-an-1)各项都是正,所以an+an-1&0, 所以an-an-1=1, 所以是等差数列
那个 不好意思 第三道数列题问的是第三小问,前面两个小问已经会了 ,谢谢!
把an=n代入,其实就是要证明2*4*6*8*...*2n&=M根号(2n+1)*1*3*5*7*...*(2n-1)整理得到f(n)=1*3*5*7*...*(2n-1)/[2*4*6*8*...*2n]&=1/[M根号(2n+1)]用数学归纳法,假设n时成立,现在证明n+1时也成立只要证明f(n+1)=f(n)*(2n+1)/(2n+2)&=(2n+1)/[(2n+2)*M根号(2n+1)]&=1/[M根号(2n+3)]整理得到,只要证明:根号(2n+1)*根号(2n+3)&=2n+2两边平方易得,3&=4成立,所以只要f(1)=1/2&=1/[M根号3]得到M&=2根号3/3同时M因为是正数,还要&0
第三小问有没有不用数学归纳法的方法,这个是我们高一期末考试题,能不能直接求出K=(2*4*6*8*...*2n)/[根号(2n+1)*1*3*5*7*...*(2n-1)]的最小值?还是必须要用函数思想,不一定要提到“数学归纳法”。
可以使用函数的单调性,设f(n)=1*3*5*7*...*(2n-1)/[2*4*6*8*...*2n]则f(n+1)=f(n)*(2n+1)/(2n+2)&f(n)所以最大值就是f(1)
采纳率:77%
1.设A(x1,y1)
B(x2,y2)则x1+y1=ax2+y2=ax1^2+y1^2=1x2^2+y1^2=1将前两个式子带入后两个式子消去y1,y2,再做差化简得到x1+x2=a再结合前两式得到y1+y2=ax1x2+y1y2=【(x1+x2)^2+(y1+y2)^2-(x1^2+x2^2+y1^2+y2^2)】/2即a =【a^2+a^2-2】/2即a^2-a-1=0所以a=(1±根号5)/2
那个 第一题的答案貌似只有一个 ,当初我们考试我写的也是(1±根号5)/2,但是打了错号....
哦 只有一个(1-根号5)/2
因为要使直线与圆相交 a的绝对值应该小于根号2
把(1+根号5)/2舍去
为您推荐:
其他类似问题
高中数学题的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。高中数学一道几何题求解在线等第五题我要解析不是对或错,谢谢_百度知道
高中数学一道几何题求解在线等第五题我要解析不是对或错,谢谢
如图所示,连结BD,设BD∩AC=O,连结BD1,在△BDD1中,E为DD1的中点,O为BD的中点,∴OE为△BDD1的中位线.∴OE∥BD1.又平面ACE,OE平面ACE,∴BD1∥平面ACE.故平行
太感谢你了😭
采纳率:71%
来自团队:
为您推荐:
其他类似问题
几何题的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。高三数学复习方法总结
高三数学复习方法总结
  高考状元谈高三数学复习  【主动寻求解题思路法】  山西理科 陈 敏  毕业:山西省运城市康杰  总分:689分  单科:124分、135分、144分、理综286分  考入:北京元培实验班  在过程中,我曾有这样的经历,有时见到一道题目一时找不到思路,就迫不急待去翻看答案,看答案时往往觉得答案的每一步都顺理成章,该用哪个定理,该用,非常简单,就自认为把题目已经理解透了。过几天再做这道题,还是无从下手。我觉得出现这种情况主要是因为我对这道题的接受是一个被动的过程。在这个过程中我只是机械地看到了具体解题过程,而没有真正理解解题思路。  主动寻求解题思路法与这种被动接受的正好相反,这种方法强调从简单习题入手,因为做简单的习题会比较轻松一些,简单的做出来之后再由浅入深。当在练习过程中遇到了难一点的题目时,有意识强迫自己不看答案、不看书套公式、不求助于别人(这些都是被动方法),而是静下心来,积极调动自己的库,主动寻求解题思路。这样由浅入深地训练自己,加上对常见题型的归类分析,再见到数学、习题时就会在第一时间反应出该题所考查的点和方式,有得心应手的感觉。  【知识点网络总结法】  山东理科状元 张 振  毕业中学:山东省枣庄八中  高考总分:717分(含20分加分)  单科成绩:语文125分、数学133分、146分、理综293分  考入:清华大学数理基础科学  我数学的第一个方法是知识点网络总结法。平时做数学题时,一些题目往往会让我们感觉到无从下手,这个时候如果我们能联想到这道题目所考察的知识点,就可以以此为线索对症下药,找到解题的突破口。所谓的知识点网络总结法就是在平时做题时,如果遇到解答中出现困难的题目,就将与这道题目有关的解题方法和所考查的知识点在题目的旁边列出来,然后在本子上总结出来。这样经过一段时间的训练,在的时候看到题目就能联想到有关的知识点,并迅速找到相应的解题方法。使用这种方法一方面可以提高解题速度,为考生节约不少时间,另一方面做题的正确率很高,提高了解题命中率。  【适当放弃法】  河南文科状元 杨楠楠  毕业中学:河南省驻马店  高考总分:662分  单科成绩:语文127分、数学138分、英语143分、文综254分  考入:北京大学元培实验班  “舍得,舍得,有舍才有得”,这是大家常说的一句话。对于数学这门学科来说,我认为要根据自己的实力,为自己准确定位,保证基础题全部答对,并适当放弃自己力不从心的高难题,这样达到资源的优化配置,才能取得较好的成绩。  每个人都有自己的长处和短处,扬长补短应该是一种比较有效的应试方法。俗话说“狗熊嘴大啃地瓜,麻雀嘴小啄芝麻&rdquo 高二;,我这个小嘴“麻雀”,在数学学习中没有多大的优势。在平时考试中,数学最后一道题对我而言难度就挺大的,我经常只是做出第一问,第二问基本上是无可奈何、屡战屡败。在高考中,我一看最后一道题的第二个问题挺难的,于是很快决定放弃了这个难啃的“地瓜”,并立刻回头检查前面已经做过的,幸运的是检查出做错的一道5分的选择题。或许,正是由于这样量力而行的战术,我保住了“芝麻”——基础题,只在较难题目上失去了12分,题全部做对,做到了数学考试的超水平发挥。  数学其实不难  很难吗?至今仍然有诸多的志士仁人仍陷入其中而不能自拔,虽然本人并不出众,但论水平还说的过去,下面是本人的一点小小的经验,希望能够助你有所提高。  一、畏惧尽量不要去学  我们说,做什么事情都要有一个良好的心态。据科学家们分析,人在有心态问题时是断然不能发挥其平时百分之一百的水平,如果是在甚至是在的考场当中,心态出现了严重的问题,那十年的光阴一瞬间就要功亏一篑了,这岂不是让众多考生无颜见江东父老了吗。其实,你绝对没有必要对数学有任何的心理抵触。举一个简单的例子,如一些应用题,虽然看上去文字描述比较多,但实际分析实用的数据仅仅有那么几个而已,然后通过建立数学模型而列出方程,进而得出答案。等完成后你会觉得数学最难的也不过如此的时候,顿时你的自豪感就会由然而生,这时你对数学的抵触情绪便云开雾散,灰飞烟灭了。  二、上课听讲很重要,45分钟要实效  你不要以为我在开玩笑,上课听讲谁还不会啊!其实并不然,我说的听讲则是完完全全、认认真真、仔仔细细……来听讲。对于上所讲的每一个公式,每一条定理都要深究其源,这样即便在当中忘了公式,也可以很好的解决问题,不至于内心的慌乱和紧张。另外要充分利用好这短短的45分钟的时间,尽量在课上将所学习的吸收,这样回到家后才能进一步展开接下来的学习,节约时间。  三、看书写作业的顺序  看书和写作业要注意顺序。有的老师说先写作业再,其实经过证明这是完全不对的。因为在下课之后到你回家时又经过了一段时间,这段时间难免你会把老师所讲的重点或细节忘记,这种情况下写作业难免会有一些问题。其实,我们要养成良好的,尽量回家后先一下当天学习的知识,特别是所记的笔记要重点关照,然后在写作业,这样效果更佳。  四、注重课本上的例题  也许你会这样说:那些例题太简单了,我一看就会了。其实,如果你不注意那些“过于简单”的例题的话,在考试当中就会吃大亏。大家都知道,近几年来不论是中考、高考等各种数学考试的解答试题基本上都是经过例题改编而成,如果你平时养成了对例题不重视的习惯,那么到考试时候,它的特殊气氛会使你处处都感到紧张,进而对这样简单的试题束手无策。所以,我们一定要在平时的学习中养成注重例题的习惯,这样会在考试当中多一分胜算。  五、面对高考,平时要弥补漏洞  对于平时的测验和考试不要注重于成绩,一定要找到自己的漏洞。考试的功能就是要检验自己平时的学习上还有那些漏洞,有些过于注重成绩,怕在朋友面前丢面子。如果是这样,我劝你还是多丢面子为好。错题是你的宝贵经验,错一次并不可怕,下一次做对不就可以了。俗话说:久病成医,说一句白话,你错的越多,考试再做这样的试题正确率就会比别人更高,笑到最后的才笑得最好。  六、准备错题本,积累宝贵经验。  学习数学,错题不可避免。对错题的心态人人各异,处理好反而会促进你的学习热情,但处理不好会使你学习数学的动力进一步减退。对于错题,希望大家准备一个本,将错题都写到这个本上,特别要写出此题所考的知识点,自己的想法,正确答案,而自己怎么不能往正确的方向上想等等。日积月累,这个本便是你宝贵的财富,也是你的“小辫子”。它是你的弱点,但攻克它虽然要费一些时间,但要相信你会在考试当中充分地体现你自己的优势的。  七、课外辅导书的购买  现今社会,不买辅导书是绝对不可能的。但就数学而言,买书却很有一套科学的方式。数学辅导书主要分为讲解书和试题书两大类,首先在买书时你一定要知道自己需要哪一方面的参考书,买要买的精,要买的有价值。买书多是绝对不值得提倡的,书多了自己不知道该看哪本,这反而会徒增你的烦恼。所以,课外辅导书大家在购买时一定要有针对性,这样才会真正体现它自身的价值。  以上便是我学习数学的一点点,希望对你学习有所帮助,大家一起交流,一起学习,毕竟取得好的成绩才是我们最终的追求目标。  几何鼻祖----欧几里得  欧几里得---古希腊家。  以其所著的《几何原本》(简称《原本》)闻名于世。他的生平,现在知道的很少。早年大概就学于雅典,深知柏拉图的学说。公元前300年左右,在托勒密王(公元前364~前283)的邀请下,来到亚历山大,长期在那里。  高中学习方法 他是一位温良敦厚的家,对有志数学之士,总是循循善诱。但反对不肯刻苦钻研、投机取巧的作风,也反对狭隘实用观点。  据普罗克洛斯(约410~485)记载,托勒密王曾经问欧几里得,除了他的《几何原本》之外,还有没有其他几何的捷径。欧几里得回答说:“在几何里,没有专为国王铺设的大道。”这句话后来成为传诵千古的箴言。  斯托贝乌斯(约500)记述了另一则故事,说一个才开始学第一个命题,就问欧几里得学了几何学之后将得到些什么。欧几里得说:给他三个钱币,因为他想在学习中获取实利。  欧几里得将公元前 7世纪以来希腊几何积累起来的丰富成果整理在严密的逻辑系统之中,使几何学成为一门独立的、演绎的科学。除了《几何原本》之外,他还有不少著作,可惜大都失传。《已知数》是除《原本》之外惟一保存下来的他的希腊文纯粹几何著作,体例和《原本》前6卷相近,包括94个命题,指出若图形中某些元素已知,则另外一些元素也可以确定。《图形的分割》现存拉丁文本与阿拉伯文本,论述用直线将已知图形分为相等的部分或成比例的部分。《光学》是早期几何光学著作之一,研究透视问题,叙述光的入射角等于反射角,认为视觉是眼睛发出光线到达物体的结果。还有一些著作未能确定是否属于欧几里得,而且已经散失。  高二数学曲线和方程教学简案  教学目标  (1)了解用坐标法研究几何问题的,了解解析几何的基本问题.  (2)理解曲线的方程、方程的曲线的概念,能根据曲线的已知条件求出曲线的方程,了解两条曲线交点的概念.  (3)通过曲线方程概念的教学,培养数与形相互联系、对立统一的辩证唯物主义观点.  (4)通过求曲线方程的教学,培养学生的转化和全面分析问题的,帮助学生理解解析几何的思想方法.  (5)进一步理解数形结合的思想方法.  教学建议  教材分析  (1)结构  曲线与方程是在轨迹概念和本章直线方程概念之后的解析几何的基本概念,在充分讨论曲线方程概念后,介绍了坐标法和解析几何的思想,以及解析几何的基本问题,即由曲线的已知条件,求曲线方程;通过方程,研究曲线的性质.曲线方程的概念和求曲线方程的问题又有内在的逻辑顺序.前者回答什么是曲线方程,后者解决如何求出曲线方程.至于用曲线方程研究曲线性质则更在其后,本节不予研究.因此,本节涉及曲线方程概念和求曲线方程两大基本问题.  (2)重点、难点分析  ①本节内容教学的重点是使学生理解曲线方程概念和掌握求曲线方程方法 高一,以及领悟坐标法和解析几何的思想.  ②本节的难点是曲线方程的概念和求曲线方程的方法.  教法建议  (1)曲线方程的概念是解析几何的核心概念,也是基础概念,教学中应从直线方程概念和轨迹概念入手,通过简单的实例引出曲线的点集与方程的解集之间的对应关系,说明曲线与方程的对应关系.曲线与方程对应关系的基础是点与坐标的对应关系.注意强调曲线方程的完备性和纯粹性.  (2)可以结合已经学过的直线方程的知识帮助学生领会坐标法和解析几何的思想,解析几何的意义和要解决的问题,为求曲线的方程做好逻辑上的和上的准备.  (3)无论是判断、证明,还是求解曲线的方程,都要紧扣曲线方程的概念,即始终以是否满足概念中的两条为准则.  (4)从集合与对应的观点可以看得更清楚:  设 表示曲线 C上适合某种条件的点 M的集合; 表示二元方程的解对应的点的坐标的集合.  可以用集合相等的概念来定义“曲线的方程”和“方程的曲线”,即  (5)在学习求曲线方程的方法时,应从具体实例出发,引导学生从曲线的几何条件,一步步地、自然而然地过渡到代数方程(曲线的方程),这个过渡是一个从几何向代数不断转化的过程,在这个过程中提醒学生注意转化是否为等价的,这将决定第五步如何做.同时不要生硬地给出或总结出求解步骤,应在充分分析实例的基础上让学生自然地获得.教学中对课本例2的解法分析很重要.  这五个步骤的实质是将产生曲线的几何条件逐步转化为代数方程,即  文字语言中的几何条件 符号语言中的等式 符号语言中含动点坐标 X, Y的代数方程 简化了的 X, Y的代数方程  由此可见,曲线方程就是产生曲线的几何条件的一种表现形式,这个形式的特点是“含动点坐标的代数方程.”  (6)求曲线方程的问题是解析几何中一个基本的问题和长期的任务,不是一下子就彻底解决的,求解的方法是在不断的学习中掌握的,教学中要把握好“度”.  名师高考数学学习方法:突破猜证结合法  破选择题:四大猜想是法宝  很多考生对选择题和填空题的低正确率感到困惑。提高这两种题型的正确率,主要要突破猜证结合的。他说,猜想的应该练习下列四个猜想:第一是举特殊值法、考察特例、检验特例、举反例等等,就是把这个题目用特殊的问题进行检验,然后进行猜想,这是特殊化猜想。第二是要学会一般化猜想。第三是要学会类比法。第四是归纳猜想。这四大猜想是解选择题和填空题的法宝。  另外要会精明演绎,主要是会反例排除,数形结合,比如用图解会比较快,还有先猜后证。掌握这些方法就可从整体上掌握填空题的法宝,然后再深入练习一下,不要满足于把这个题解完就没事了。  解应用题:联系实际  今年的应用题和往年一样,仍然保持做题的难易程度,但注意,应用题通常是在选择题和填空题各有一个大众题,这种题目即使没有的,会联系实际就能解出来,所以解题时要注意联系实际,运用实际经验来解答。  解答应用题要注意提高新四大:阅读、探究、应用能力、思考学科的综合能力。在应用题中主要考察这四个能力,所以要注意会组题、会研究、会思考和综合,并能够应用。  三角函数:学会三角化归通法  三角函数主要要掌握好三角化归思想,三角公式不要死记硬背,要学会高速化归,能够记住几个基本公式,就能快速推出所需要的任何公式,这是现在三角学习的方向。  第二,要学会三角化归的通法,三角化归的通法叫做“三变”:(一)变角;(二)变函数;(三)变式。掌握这三变,就能够解决任何问题,解题时观察三种基本矛盾,第一种基本矛盾是角的矛盾,如果角的矛盾是主要的就变角。第二种基本矛盾是三角函数的矛盾 高中政治。第三种主要矛盾如果是在三角函数基础之上的式的矛盾,就用代数方法或者是三角方法来变式。  全面:优化基础最重要  现在可以适当做一点新题,但重要经验是优化基础,把知识结构化、系统化、程序化,在优化的基础上,适当地做一些新题。因为整个有120分的基础题,是150分,其中120分都是基础,所以优化基础是最重要的,基础好了,才能够做到解题活,才能综合知识,有较快的解题速度,所以应该把主要精力放在优化解题过程,浓缩提炼知识的机构,优化解题方法。同时模拟不要做得太多,要减轻压力,树立自信心。  高中数学学习方法  1一本书  就是教科书,这是基础的基础,但是被中等生最忽视的。笔者高中时,先看教科书再做题,所以往往同学做到第5题,我才刚开始,但当我做了20题时,反过来发现同学做到第17题,这就是磨刀不误砍柴工。最后不仅省时,而且比同学多巩固了书本,然后从书本原理到题目及从题目到原理走了一个来回,培养了以理论解决实际问题的,提高了以不变应万变的。一句话,省时又高效。为摆脱题海打下了基础。  2两方法  1)找到已知与求解的“桥梁”。主要针对中等题及难题,利用已知,推一步或几步,完成转化,从求解往后推几步,看看还缺什么,再去回忆脑袋里的知识点及解过的经典题,把已知与求解的差距补上,这个就是“桥梁”原理。  2)有些题按上述方法还遇到困难,可能需要另辟蹊径,如从定义出发或需要再审视已知条件,可能还未用尽已知条件或有些暗含的已知条件未挖掘出来。  3三部曲:  1)先看教科书,真正搞懂课本例题,并做课后练习(虽然看上去很简单,但是实质上就是要你检查自己是否真的掌握这些基本知识点.),  2)利用历年真题, 这些题很有价值,先掩着答案,根据你之前课本学的基础内容,尝试自己亲自动手做一下,再对答案,明白其原理.,真正弄懂它,看看能否举一反三,可问及同学,也可请家教,最后达到触类旁通。  3)同步练习,必须紧跟课程,不能赖下来的,一步一个脚印去做.  数学知识点较多,容易忘记,但以上的步骤你都能做到的话,那么就不那么容易遗忘,即使忘记,你也可以翻阅以前的内容重新巩固一遍.  4四层次  1)  基本知识点。含概念、定义、定理、公式等,这是基础,这个不过关,其他免谈。笔者平时先看教科书,就是这个道理。--这部分,虽然重要,但笔者辅导不作重点,只是检查与提醒,因为可自学及问自己老师同学。会这个的人太容易找到了。  2)  数学思想与数学技能。数学思想如方程函数思想、数形结合思想、对称思想、分类讨论思想,化归思想;数学技能如配方、待定系数法等。笔者由于这方面强,故多年不做题或见到陌生题均不慌,因为这些思想能力是深入骨髓的。  3)  数学模型与中间结论。数学模型就是具体题目的解题套路,中间结论可使减少解题步骤,加快解题速度,减少出错机会。这些有了2数学思想与数学技能,就能自己推导出来,但要注意总结与积累。  4)  特殊解题技巧。这个要求以上3方面都较强,加,平时善于总结与归纳,看透事物本源,熟能生巧,触类旁通。故对中等生不作过高要求,所谓可遇而不可求。笔者对高考实考的选择与填空,特别是选择,有相当部分 高二,有的甚至一半以上可在题读完后,几秒得出正确答案。凭的就是这个本事。  名师指导二模后高效复习建议--数学  科学地训练当然是必须把握的教学理念,具体设想是:  1、科学地建构知识体系:----“回归课本”  能力的考查是以数学知识为载体的。因此高考数学复习很重要的工作是准确、系统的掌握高中数学的基础知识,考生应根据自身学习的特点科学地建构知识体系。知识体系的建构要突出重点,揭示联系,简洁实用。回归课本就是要形成知识体系,知识网络。对考生来讲这是一个知识“内化”的过程,只有这样在考试时知识才能用得上,用得好。  2、科学地训练:  在认真分析总结“一摸”、“二摸”试卷的基础上,还要关注知识交叉点的训练。知识的交叉点,即知识之间纵向、横向的有机联系,既体现了数学高考的能力立意,又是高考命题的“热点”,而这恰恰是学生平时学习的“弱点”。  在练习时要注意以下几点:解题要规范。俗话说,“不怕难题不得分,就怕每题都扣分”,所以务必将解题过程写得层次分明,结构完整。重要的是解题质量而非数量,要针对学生的问题有选择地精练。不满足于会做,更强调解题后的反思常悟,悟出解题策略、思想方法的精华,尤其是一些高考题、新题、难度稍大的题,这种反思更为重要,“多思出悟性,常悟获精华”。  几种有用的提法:  (1)、“快步走,多回头”。  (2)、“会做的可以不做”,课后的作业布置五条题,让学生至少做三题,会做的可以不做,这样做可以把主动权让给学生,提高了复习的效率,而且锻练了学生高考对题目能否会做的判断能力。  (3)“八过关,分层推进,分类突破”。  (4)“紧盯尖子生,狠抓临界生,关心后进生”。  (5)“抓基础,抓重点,抓落实,”  (6)“重组教材,夯实基础,有效训练,及时反馈。”  总之,高考备考工作没有捷径可走,要让学生“知情”,并让学生“领情”,就是走了直径。计算几何及其应用——解析几何
时间: 00:22:57
&&&& 阅读:800
&&&& 评论:
&&&& 收藏:0
& 写在前面:刚学专业课的时候,记得有天突发奇想,心说高三数学的压轴题能不能写个程序跑出答案,这样岂不是解放了数万苦逼高三生的双手?但是当时也仅仅是停留在想法上面,因为高中的解析几何虽然步骤程序化,但是有时候需要灵巧的因式分解,感觉以目前的编程水平还是写不出来,但是了解到数学有一个分支&&计算几何,专门利用计算机来进行几何计算的一门科学,并且还与计算机图形学、计算机视觉和图像处理、机器人、计算机辅助设计和制造等高深学科有着联系(摘自《计算几何与应用》导言),所以今天怀着激动的心情开始了这个专题的学习。&
& 数学的一大功用就是计算,而计算的前提便是把自然界中的数据抽象成数学语言,数轴、坐标系都是为了更好的计算而引入的工具,同样,向量&&也是这个作用。& 众所周知,向量有两个必不可少的因素&&大小、方向。而在实际问题中,向量即作为有大小、有方向的具有实际物理意义的载体,也是进行代数运算的重要载体,而计算几何中则充分体现了向量的这一特点。& 我们就一个题目来初涉计算几何这个领域:关于n边形的面积求解的问题。
&&&如果给出你n边形的n个顶点的坐标,你能求出这个n边形的面积么?&& 如果想要编程实现,显然我们需要让这个求解的过程变得自动化、规律化。我们可以考虑,将其依次分割成多个三角形,然后依次求出处三角形的面积。而如何分割呢?我们考虑,从某个点出发,然后依次连接多边形的两个顶点,然后就可以把图形分割成多个三角形。& 这个点可以在多边形内部,可以是多边形的顶点,可以某个顶点。& 像下面这几种分割方法。
& 我们来看图3.3,显然,现在我们的目标是依次求出所有的三角形然后加和即可,这在编程上也很好实现,但是现在问题是,给出的是点的坐标,我们如何更方便快捷的计算出三角形的面积呢?& 这里的方法涉及向量叉积的概念了。
& 向量的叉积:
& 我们知道,向量是既有大小又有方向的,对于确定的两个向量a,向量b,通过平移,是可以组成一个确定的三角形的(SAS,其详细证明笔者认为《几何原本》可能会给出)。而我们再根据三角形的面积计算公式s&= 1/2*a*b*sin&(&是向量a、b的夹角,这里公式不予证明),以及高中学到的向量的点积公式,我们可以做出如下推导。
& 那么我们可以得出结论,三角形的面积实际可以通过任意两个边所形成的向量a、b通过叉积运算得来。& 然而我们看到,如果分割过程没有将n边形分成标准的三角形怎么办?如图3.4(b),显然上面的方法是存在不足的。& 从叉积的定义我们可以看出,叉积运算也是有符号的。通过简单的证明,我们可以找到叉积运算的符号规律。(这个探讨好像偏离了问题,但是是对后面探索的一个铺垫)
& 我们可以得出这样一个规律&&如果向量b的方向在向量a的逆时钟旋转&的范围里,那么向量a&向量b的值是大于零的。& 我们再回到刚刚的论证当中,显然我们会考虑到,如果这多边形是凹的,就可能出现不完全分割的情况,而在编程过程中我们给出的算法显然要呈现出一般化的规律,因此无法保证能否找到一个合适的点进行分割,所以我们猜测,是否完全分割和不完全分割对于面积的计算是遵循一个公式呢?&&让我换一个简单的模型来探究一下 这种不完全分割是怎么来的,这里有个误区&&认为凹多边形一定会不完全分割,其实不然,图3.4的a、b的对比就佐证了这个观点。
& 这个模型是这样来的,我们规定了AB的斜率不动,然后让顶点o可以随意移动。& 在情况1中,我们看到,S△AOB被&挤&成了一条直线。& 在情况2中,AO的斜率是小于AB的,此时可以完全分割,计算面积只需依次就出三角形的面积再加和即可。而S△AOB=&向量AB&&&向量OA恰好是正值,这也呼应了前面的过程。& 在情况3中,情况则大不相同,这里S△AOB一部分是被掏空的,一部分被计算了两次,因此在面积求和的时候应该减掉一个S△AOB,而此时向量AB & 向量OA也恰好是符号,再次呼应,这也为给出不规则多边形面积公式奠定了基础。& 这是一个最简单的模型,推广以后(精髓所在),便可以得到上图给出的公式,再编程实现即可,由于笔者很懒,这里就不贴代码了。& 关于线段相交问题。
& 题目大意:给你n条线段(给你两端点的坐标以确定这条线段),然后让你确定共有多少个不同的交点。& 数理分析:显然这里想得到全部的交点个数,我们需要设置穷举,然后一组一组的进行运算看能不能交到一起,那么现在的问题就是,两条已知的线段,你如何计算出二者是否相交。& 我们想可以想到他们不相交的情况,通过做图不难发现。
& 也就是说,一旦满足上面的条件,那么一定是不存在交点的,可以直接进行下一组的判断。& 随后我们再思考两线段相交需要满足怎样的条件。& 这里通过作图,我们发下,当A、B分别在线段CD的两边,且C、D分别在线段AB的两边的时候,两个线段是相交的。& 而既然满足了这种关系,我们再借助向量这一有用的工具,给线段赋予向量的含义,然后再结合向量的叉乘,我们不难得出点坐标之间的代数运算式,于是,线段与线段之间的位置关系,就转化成了线段的端点的点坐标之间的代数关系,这一步重要的转化也为编程的实现做出了奠定了基础。&&简略的证明如下(定义向量的方法是不唯一的,因子后面的代数运算式也会呈现出多样性)
& &&&有了以上的数理分析,我们可以写出代码。&&
#include&stdio.h&
#include&math.h&
using namespace
const double eps=1e-10;
struct point { double x, };
double find_max(double a , double b)
return a & b ? a :}
double find_min(double a , double b)
return a & b ? a :}
bool if_intersect(point a ,point b , point c , point d)
if(find_min(a.x , b.x) & find_max(c.x , d.x)
find_min(a.y , b.y) & find_max(c.y , d.y)
find_min(c.x , d.x) & find_max(a.x , b.x)
find_min(c.y
,d.y) & find_max(a.y , b.y))
double h , i , j ,
h = (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x);
i = (b.x - a.x) * (d.y - a.y) - (b.y - a.y) * (d.x - a.x);
j = (d.x - c.x) * (a.y - c.y) - (d.y - c.y) * (a.x - c.x);
k = (d.x - c.x) * (b.y - c.y) - (d.y - c.y) * (b.x - c.x);
return h * i &= eps && j * k &=
int main()
point p[105][2];
while(scanf("%d",&n) != EOF && n)
int sum = 0;
for(i = 0;i &i++)
scanf("%lf%lf%lf%lf", &p[i][0].x, &p[i][0].y, &p[i][1].x, &p[i][1].y);
for(i = 0;i &
n - 1;i++)
for(j = i + 1;j &j++)
if(if_intersect(p[i][0] , p[i][1] , p[j][0] , p[j][1]))
printf("%d\n",sum);
有关三角形和圆的结合。
& 题目大意,让你给出三角形的三个顶点,然后让你计算出该三角形的外接圆的周长。& 这里我们需要推导一下计算外接圆半径的公式。根据正弦定理我们知道,c/sinc&=2r,而s&= 1/2a*b*sinc,我们可以得到r&=a*b*c / 4s。& 这里求三角形的面积s的时候,我们常用s&=&sqrt(p*(p-a)*(p-b)*(p-c))这个公式,其中p&= 0.5(a + b + c)。& 有了明确的公式,算法是实现上非常容易。&&代码如下。
#include&stdio.h&
#include&math.h&
#define PI 3.793
typedef struct point
double x ,
double distance(Point a ,Point b)
return sqrt((a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y - b.y));
int main()
double a , b , c , p
, r , s , c_of_
Point v[3];
while(scanf("%lf %lf %lf %lf %lf %lf",&v[0].x , &v[0].y , &v[1].x ,&v[1].y , &v[2].x , &v[2].y) != EOF)
a = distance(v[0] , v[1]);
b = distance(v[1] , v[2]);
c = distance(v[2] , v[0]);
p = (a + b + c)/2.0;
s = sqrt(p * ( p - a ) * ( p - b ) * ( p - c ));
r = (a*b*c) / (4.0*s);
c_of_circle = 2*PI*r;
printf("%.2lf\n",c_of_circle);
& 我们再来看一道关于求解三角形外接圆的题目。(Problem soure : poj 1329)&
&&题目大意:基础三个点的坐标,让你输出对应外接圆的顶点式和一般式。& 数理分析:这里我们假设给出的三点坐标为(x1,y1),(x2,y3),(x3,y3)根据外心的定义,我们需要找到两条中垂线的交点。& 拿出两个点p1(x1,y1),p2(x2,y2)来说,中垂线过p1p2的中点,并且斜率与p1p2所成直线的斜率的乘积是-1,通过简单的解析几何的知识,我们可得到一条中垂线的参数方程。& (x-(x1+x2)/2)(x1-x2) = -(y1-y2)(y-(y1+y2)/2)。& 同理再得到一条这样的方程,两个方程进行连理,既可以一个三角形外心通用的计算公式。& 知道了圆心的坐标,我们只需计算圆心到某个顶点的距离,即可得到半径r。
& 编程实现:题目给出的格式比较繁琐,这里注意分情况讨论一下处理一下符号即可。
& 参考代码如下。
#include&stdio.h&
#include&cmath&
using namespace
struct point
double x ,
double dis(point a , point b)
return sqrt((a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y));
void get_C(point p1,point p2,point p3)//求圆心
double t1,t2,t3;
t1=p1.x*p1.x+p1.y*p1.y-p2.x*p2.x-p2.y*p2.y;
t2=p1.x*p1.x+p1.y*p1.y-p3.x*p3.x-p3.y*p3.y;
t3=2*(p1.x-p2.x)*(p1.y-p3.y)-2*(p1.x-p3.x)*(p1.y-p2.y);
o.x=((p1.y-p3.y)*t1-(p1.y-p2.y)*t2)/t3;
o.y=-((p1.x-p3.x)*t1-(p1.x-p2.x)*t2)/t3;
int main()
while(scanf("%lf %lf %lf %lf %lf %lf",&p[0].x , &p[0].y , &p[1].x ,&p[1].y , &p[2].x , &p[2].y) != EOF)
get_C(p[0],p[1],p[2]);
double r = dis(p[1],o);
double t=r*r-o.x*o.x-o.y*o.y;
if(o.x&0&&o.y&0)
printf("(x + %.3lf)^2 + (y + %.3lf)^2 = %.3lf^2\n",-o.x,-o.y,r);
printf("x^2 + y^2 + %.3lfx + %.3lfy - %.3lf = 0\n",-2*o.x,-2*o.y,t);
printf("x^2 + y^2 + %.3lfx + %.3lfy + %.3lf = 0\n",-2*o.x,-2*o.y,-t);
else if(o.x&0)
printf("(x + %.3lf)^2 + (y - %.3lf)^2 = %.3lf^2\n",-o.x,o.y,r);
printf("x^2 + y^2 + %.3lfx - %.3lfy - %.3lf = 0\n",-2*o.x,2*o.y,t);
printf("x^2 + y^2 + %.3lfx - %.3lfy + %.3lf = 0\n",-2*o.x,2*o.y,-t);
else if(o.y&0)
printf("(x - %.3lf)^2 + (y + %.3lf)^2 = %.3lf^2\n",o.x,-o.y,r);
printf("x^2 + y^2 - %.3lfx + %.3lfy - %.3lf = 0\n",2*o.x,-2*o.y,t);
printf("x^2 + y^2 - %.3lfx + %.3lfy + %.3lf = 0\n",2*o.x,-2*o.y,-t);
printf("(x - %.3lf)^2 + (y - %.3lf)^2 = %.3lf^2\n",o.x,o.y,r);
printf("x^2 + y^2 - %.3lfx - %.3lfy - %.3lf = 0\n",2*o.x,2*o.y,t);
printf("x^2 + y^2 - %.3lfx - %.3lfy + %.3lf = 0\n",2*o.x,2*o.y,-t);
printf("\n");
& 我们再来看一些关于最小面积覆盖的问题。(Problem source : hdu 1859)
& 读完题后其实不难发现,这道题目的本质其实就是找到这些点的最大的横坐标和纵坐标(右上角的点),和最小的和坐标和纵坐标(左下角的点),编程实现上也基本没有什么难度。& 这道题似乎有点简答的弱智了,然是在简短的代码中其实还是体现了计算几何问题在编程实现时代码的规整之美,计算几何其实就是基于计算机自动化、程序化的特点来解决一些繁琐计算的几何问题,而自动化的背后往往呈现出简单的原理,掌握到背后简单的原理,解决计算几何问题是将会更加游刃有余。& 由于其实规整的矩形覆盖,所以问题非常好解决,但是如果是圆形呢?那其实就是计算几何里面的一类问题&&最小圆覆盖。在后面的文章中我们将继续详细的介绍。& 参考代码如下:
#include&stdio.h&
using namespace
int main()
int maxx , maxy , minx ,
while(scanf("%d %d" , &x , &y) != EOF)
if(x == 0 && y == 0)
maxx = x , minx = x , miny = y , maxy =
scanf("%d %d" , &x , &y);
if(x == 0 && y == 0)
printf("%d %d %d %d\n" , minx , miny , maxx , maxy);
if(x & maxx) maxx =
if(x & minx) minx =
if(y & maxy) maxy =
if(y & miny) miny =
& 我们再来看一道平面解析几何中最基础的问题,关于点的对称、直线交点的计算。(Problem source : hdu2857)
&&& 题目大意:这里先给出两个点得到一条直线,当做镜子。然后给定入射点和出射点,让你计算出这条光线与镜子的交点。&&& 数理分析:很基础的几何题目,只需做出入射点关于镜子的对称点,对称点和出射点构成的直线与镜子的交点便是所求作的点。&&& 编程实现:数理思维虽然不难,但是体现到编程上还是需要解决很多问题的。就比如:& ①给定直线的两点,我们如何得到一条直线?& ②给定两条直线,我们又如何求其交点?& ③这里的对称点怎么找?& 这些问题虽然不难,但是还是需要比较巧的推理技巧。& 关于给定两点求直线,这里我们借助解析几何中常见的斜截式y = kx + b,然后将其转化成一般式ax + by+ c = 0,简单的推导如下。
& 关于给定两条直求其交点,我们采取一样的方法。
& 而对于找对称点,我们先找到互为对称点的这两个点组成的线段的中点,然后再进行计算。而这个中点恰好又是过入射点且垂直于镜子的直线与镜子的交点,这里的计算也很简单。简单的推导如下。
& 编程实现:有了以上推导,编程实现上就显得容易很多。在编程实现的时候需要注意,我们求出交点,显然有多个返回值,所以在将各种操作(对称、求交点)写成函数的时候,可以用到指针或者引用。& 参考程序如下。(注:在推导过程中一般式按照ax+by+c=0推导,在编程的时候按照ax+by=c,这体现在代码上可能有正负号的微小差异,本质是相同的)&
#include&stdio.h&
void Intersect(double a1,double b1,double c1,double a2,double b2,double c2,double &x,double &y)
x = (b2*c1 - b1*c2)/(a1*b2 - a2*b1);
y = (a2*c1 - a1*c2)/(a2*b1 - a1*b2);
//计算两直线的交点
void line(double x1,double y1,double x2,double y2,double &a,double &b,double &c)
a = y1 - y2;
//计算两点构成直线的参数a,b,c
b = x2 - x1;
c = x2*y1 - x1*y2;
int main()
double x1,x2,y1,y2,x0,y0,x3,y3,a1,a2,b1,b2,c1,c2,x,y,a3,b3,c3;
scanf("%d",&T);
while(T--)
scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&x0,&y0,&x3,&y3);
a1 = x1 - x2;
b1 = y1 - y2;
c1 = x0*x1 - x0*x2 + y0*y1 - y0*y2;
line(x1,y1,x2,y2,a2,b2,c2);
Intersect(a1,b1,c1,a2,b2,c2,x,y);
x += x - x0;
y += y - y0;
line(x,y,x3,y3,a3,b3,c3);
Intersect(a3,b3,c3,a2,b2,c2,x,y);
printf("%.3lf %.3lf\n",x,y);
& 我们再来看一道关于求解多边形重心的问题。(Problem source:hdu1115)
& 题目大意:顺次给你n个顶点的坐标,让你找出n多边形的重心。& 数理分析:有了上面关于求解多边形面积的思维铺垫,这道题目将会轻松很多。& 我们知道,重心是来源于物理学中的概念。这里我们给出求几何体重心普适性的公式:& ①如果质量集中在顶点上,&&& n个顶点坐标为(xi,yi),质量为mi,则重心  X = &( xi&mi ) / &mi  Y = &( yi&mi ) / &mi& 而特殊地,若每个点的质量相同,则  X = &xi / n  Y = &yi / n& ②质量分布均匀(这里没有给出普适性的公式,因为在此算法中不需要)  特殊地,质量均匀的三角形重心:  X = ( x0 + x1 + x2 ) / 3  Y = ( y0 + y1 + y2 ) / 3& 有了这些公式,我们下面要做的就是找到公式中字母在实际问题中代表的意义。& 先从整体的思路开始,秉承计算几何惯有的思维,这里还是要将n多边形分割成n - 2个三角形,基于三角形求重心的简便性,我们可以套用质量均匀分布情况下的三角形重心求解公式,此时,n多边形就转化成了质量集中在n - 2个三角形重心的图形了,此时我们再套用质量集中在顶点情况下的普适性公式。& 那么公式中的m代表什么呢?它是三角形的面积。我们立体化的看这些平面几何图形,假设他们有密度、厚度,肯定是一样的,那么这里质量就与平面中图形的面积成正比了。而对于三角形面积的计算,在上面也有所推导证明。&&编程实现:有了以上数理思维做铺垫,在编程实现的时候只需设置穷举正确的将n多边形分割成三角形即可。&&参考代码如下。&
#include&stdio.h&
using namespace
struct point
double x ,
double area(point p1 , point p2 , point p3)
return ((p2.x - p1.x) * (p3.y - p1.y) - (p3.x - p1.x)*(p2.y - p1.y))/2;
int main()
point p1,p2,p3;
double temp , sumarea , xg ,
scanf("%d",&t);
while(t--)
scanf("%d",&n);
sumarea = xg = yg = 0;
scanf("%lf%lf%lf%lf",&p1.x , &p1.y , &p2.x , &p2.y);
for(int i = 2;i &i++)
scanf("%lf%lf",&p3.x , &p3.y);
temp = area(p1 , p2 , p3);
xg += (p1.x + p2.x + p3.x) *
yg += (p1.y + p2.y + p3.y) *
sumarea +=
xg = xg / sumarea / 3.0;
yg = yg / sumarea / 3.0;
printf("%.2lf %.2lf\n" , xg , yg);
& 再来看一道有关求多边形重心的问题(Problem source :pku 3855)
&&&题目大意:依旧是给出顶点数n,然后依次给出n个顶点的坐标,让你求解n边形的重心。& 编程实现:虽然方法是和上面一题一模一样的,但是在答案输出的时却对精度有着不同的要求。这里如果我们的精度是小数点后6位,而某个答案是-0.0000001,此时如果不作处理会输出-0.000000,而正确答案应该是0.000000,虽然大小没变,但是oj返回一个错误结果。& 所以我们在这里要随着精度的变化对代码做出相应的改动。这里要求小数点后6位的精度,我们设置一个常量为0.000001,如果|x|&0.000001,我们就令x = 0.0,这样就会输出0.000000而不是-0.000000。& 参考代码如下。
#include&cstdio&
#include&cmath&
using namespace
const double eps = 1e-6;
struct point
double x ,
double area(point p1 , point p2 , point p3)
return ((p2.x - p1.x) * (p3.y - p1.y) - (p3.x - p1.x)*(p2.y - p1.y))/2;
int main()
point p1,p2,p3;
double temp , sumarea , xg ,
int tt = 1;
while(scanf("%d",&n)!=EOF && n)
sumarea = xg = yg = 0;
scanf("%lf%lf%lf%lf",&p1.x , &p1.y , &p2.x , &p2.y);
for(int i = 2;i &i++)
scanf("%lf%lf",&p3.x , &p3.y);
temp = area(p1 , p2 , p3);
xg += (p1.x + p2.x + p3.x) *
yg += (p1.y + p2.y + p3.y) *
sumarea +=
xg = xg / sumarea / 3.0;
yg = yg / sumarea / 3.0;
if(fabs(xg) & eps)
if(fabs(yg) & eps)
printf("Stage #%d: %.6f %.6f\n" , tt++ , xg , yg);
& 考虑这样一个问题,给定含有有限个元素的点集,我们如何变成计算能够覆盖所有点的最小的圆的圆心和半径,这也就是所谓的最小圆覆盖问题。(Problem source: zoj 1450)
编程实现:对于计算几何的问题,难点多在于编程实现自动化计算,在数理思维上不是很困难。& 实现最校园覆盖的算法有很多,这里介绍一种随机增量法。& 我们将设置三层遍历,依次遍历点集。& 第一层遍历,用于我们判断该点是否在目前构造的圆内,否则的话,此点作为新的圆心。& 第二层遍历,用于我们判断该点是否在目前构造的圆内,否则的话,此时选出的两点形成一条线段,中点即为圆心。& 第三层遍历,用于我们判断该点是否在目前构造的圆内,否则的话,此时遍历选出的三点的形成的三角形的外心是圆心。
& 可能有人会疑惑这样编程的顺序,能否实现&最小&圆这一要求。& 进行第一层比较,两个点形成的圆必然比三个点(这三个点中包含前两个点)形成的圆要小,这是显而易见的。& 进行第二层比较,如果两个点形成了一个符合要求圆,那它是否是最小的呢?答案也是显然的,如果我们假设还存在另外一个更小的圆,那么此时开始的两个点将作为一条弦出现,如果这条弦是直径,那么这是个等大的圆;如果不是直径,那么这个圆的直径将大于这条弦,这与我们初始的假设相悖。& 所以我们得到结论,按照上述的过程,一旦构造出符合要求的圆,那么一定是最小的覆盖圆。
& 在真正编程实现的时候还需要考虑精度问题,其具体的方法就是尽量减少* /运算的出现,因为其会产生误差,虽然看似极小,但是数据量一大之后,聚会产生较为明显差值从而导致错误。& 这里对于中垂线段的确定,我们给出简略的证明(针对遍历三个点是确定外接圆圆心的情况)。
& 如图所示,我们在线段ab及其重点ua的基础上构造出矩形,我们可通过全等证垂直,这样,中垂线段就用+ - 的形式表示出来,随后只需求两条线断的交点即可求出三点确定的圆的圆心。这样做相比于通过确立直线方程坐标然后联立得到方程组,很好的减少了出现精度差的运算次数。
& 参考代码如下。
#include&stdio.h&
#include&cmath&
#include&iostream&
using namespace
const int maxn = 505;
const double eps = 1e-6;
struct point
double x ,
}p[maxn] ,
double dis(point a , point b)
return sqrt((a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y));
point Interesection(point u1,point u2,point v1,point v2)
point ans = u1;
double t = ((u1.x - v1.x) * (v1.y - v2.y) - (u1.y - v1.y) * (v1.x - v2.x)) /
((u1.x - u2.x) * (v1.y - v2.y) - (u1.y - u2.y) * (v1.x - v2.x));
ans.x += (u2.x - u1.x) *
ans.y += (u2.y - u1.y) *
//高精度求线段交点,即为外接圆的圆心。
point Circum(point a , point b , point c)
point ua,ub,va,
//求出两条中垂线段
ua.x = ( a.x + b.x ) / 2;
ua.y = ( a.y + b.y ) / 2;
ub.x = ua.x - a.y + b.y;
ub.y = ua.y + a.x - b.x;
va.x = ( a.x + c.x ) / 2;
va.y = ( a.y + c.y ) / 2;
vb.x = va.x - a.y + c.y;
vb.y = va.y + a.x - c.x;
return Interesection(ua,ub,va,vb);
point min_center()
int i , j ,
for(i = 1;i &i++)
//三层循环,因为3点将确定一个圆
if(dis(o,p[i]) - r & eps )
for(j = 0;j &j++)
if(dis(p[j],o) - r & eps)
o.x = (p[i].x + p[j].x)/2.0;
o.y = (p[i].y + p[j].y)/2.0;
r = dis(o,p[i]);
for(k = 0;k &k++)
if(dis(p[k],o) - r & eps)
o = Circum(p[i],p[j],p[k]);
r = dis(p[i],o);
int main()
while(scanf("%d",&n) , n)
for(int i = 0;i &i++)
scanf("%lf%lf",&p[i].x , &p[i].y);
min_center();
if(fabs(o.x) & 0.01)
o.x = 0.00;
if(fabs(o.y) & 0.01)
o.y = 0.00;
printf("%.2lf %.2lf %.2lf\n",o.x,o.y,r);
&&&那么基于对最小圆覆盖模型的认识,我们再来看一道与之有关的题目(Problem source : hdu4720)
& & 题目大意:给你四个点,用前三个点来确定一个最小覆盖圆,然后判断第四个点是否在这个圆内。& 数理分析:这里其实是最小圆覆盖模型的超级简单版,把覆盖的n多边形变成了三角形。这里我们很容易看到,对于直角三角形和锐角三角形,我们要求的圆是外接圆,而对于钝角三角形,我们要求的则是一个覆盖圆。但是综合起来,我们都可以讲它们看成求三个点的最小覆盖圆。& 编程实现上没有什么难度,可以直接使用上面我们学习过的关于最小圆覆盖的代码(虽然有点大材小用)。& 参考代码如下。
#include&stdio.h&
#include&cmath&
#include&iostream&
using namespace
const int maxn = 4;
const double eps = 1e-6;
struct point
double x ,
}p[maxn] ,
double dis(point a , point b)
return sqrt((a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y));
point Interesection(point u1,point u2,point v1,point v2)
point ans = u1;
double t = ((u1.x - v1.x) * (v1.y - v2.y) - (u1.y - v1.y) * (v1.x - v2.x)) /
((u1.x - u2.x) * (v1.y - v2.y) - (u1.y - u2.y) * (v1.x - v2.x));
ans.x += (u2.x - u1.x) *
ans.y += (u2.y - u1.y) *
//高精度求线段交点,即为外接圆的圆心。
point Circum(point a , point b , point c)
point ua,ub,va,
//求出两条中垂线段
ua.x = ( a.x + b.x ) / 2;
ua.y = ( a.y + b.y ) / 2;
ub.x = ua.x - a.y + b.y;
ub.y = ua.y + a.x - b.x;
va.x = ( a.x + c.x ) / 2;
va.y = ( a.y + c.y ) / 2;
vb.x = va.x - a.y + c.y;
vb.y = va.y + a.x - c.x;
return Interesection(ua,ub,va,vb);
point min_center()
int i , j ,
for(i = 1;i &i++)
//三层循环,因为3点将确定一个圆
if(dis(o,p[i]) - r & eps )
for(j = 0;j &j++)
if(dis(p[j],o) - r & eps)
o.x = (p[i].x + p[j].x)/2.0;
o.y = (p[i].y + p[j].y)/2.0;
r = dis(o,p[i]);
for(k = 0;k &k++)
if(dis(p[k],o) - r & eps)
o = Circum(p[i],p[j],p[k]);
r = dis(p[i],o);
int main()
while(~scanf("%d",&t))
int tt = 1;
while(t--)
for(int i = 0;i &i++)
scanf("%lf%lf",&p[i].x , &p[i].y);
scanf("%lf%lf",&p[3].x,&p[3].y);
min_center();
printf("Case #%d: ",tt++);
if(dis(p[3],o) & r)
printf("Safe\n");
printf("Danger\n");
&& 基于上面对最小圆覆盖问题的学习,我们再来看一道应用它的问题。(Problem source : hdu 3932)
&& 题目大意:给出你n个点的坐标,你任取一个点,这个点到到这n个点中的某个点的距离都是存在最大值的,那么现在需要你找到这个最大值最小时的情况。输出这个点的坐标,并输出最小的最大距离。& 数理分析:我们很明显的能够分析到这里需要用到最小圆覆盖的模型。我们定性的来分析这种最值问题。如果我们n只有2个,那么显然要求这两个点构成线段的中点。如果n=3,我们则取这三个点构成三角形的外心。如果这n个点组成的n多边形的外接圆是存在的,那么这个外接圆的圆心就是我们要找的点。我们看到,为了使这个最大距离尽量小,就使n个点到这个点的距离的差值尽量小些。因为我们发现,如果我们移动该点,使得它靠近了i点,那么相应的会远离j点(也不尽然,这里是定性的分析),为了使max(i,j)最小,我们就要一个&均衡受力&的点,所以,这个点应该是外接圆的圆心,因为它到各个点的距离都是一样的。& 那么如果不存在外接圆呢?那我们就要去相应的找最小覆盖圆了。& 有了这层数理分析,我们只要基于求解最小覆盖圆的模板,就可以很好的解决这个问题了。& 参考代码如下。(Ps:此题目对数据的要求是精确到小数点后一位,四舍五入,但是实际测评中并没有四舍五入,这里在代码中就没有体现四舍五入。)&
#include&stdio.h&
#include&cmath&
#include&iostream&
using namespace
const int maxn = 1005;
const double eps = 1e-6;
int n , x ,
struct point
double x ,
}p[maxn] ,
double dis(point a , point b)
return sqrt((a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y));
point Interesection(point u1,point u2,point v1,point v2)
point ans = u1;
double t = ((u1.x - v1.x) * (v1.y - v2.y) - (u1.y - v1.y) * (v1.x - v2.x)) /
((u1.x - u2.x) * (v1.y - v2.y) - (u1.y - u2.y) * (v1.x - v2.x));
ans.x += (u2.x - u1.x) *
ans.y += (u2.y - u1.y) *
//高精度求线段交点,即为外接圆的圆心。
point Circum(point a , point b , point c)
point ua,ub,va,
//求出两条中垂线段
ua.x = ( a.x + b.x ) / 2;
ua.y = ( a.y + b.y ) / 2;
ub.x = ua.x - a.y + b.y;
ub.y = ua.y + a.x - b.x;
va.x = ( a.x + c.x ) / 2;
va.y = ( a.y + c.y ) / 2;
vb.x = va.x - a.y + c.y;
vb.y = va.y + a.x - c.x;
return Interesection(ua,ub,va,vb);
point min_center()
int i , j ,
for(i = 1;i &i++)
//三层循环,因为3点将确定一个圆
if(dis(o,p[i]) - r & eps )
for(j = 0;j &j++)
if(dis(p[j],o) - r & eps)
o.x = (p[i].x + p[j].x)/2.0;
o.y = (p[i].y + p[j].y)/2.0;
r = dis(o,p[i]);
for(k = 0;k &k++)
if(dis(p[k],o) - r & eps)
o = Circum(p[i],p[j],p[k]);
r = dis(p[i],o);
int main()
while(~scanf("%d%d%d",&x,&y,&n))
for(int i = 0;i &i++)
scanf("%lf%lf",&p[i].x , &p[i].y);
min_center();
printf("(%.1lf,%.1lf).\n",o.x,o.y);
printf("%.1lf\n",r);
& 在了解了最小矩阵覆盖、凸包、最小圆覆盖等覆盖类问题后,我们在这里再来看一道有关图形覆盖类问题。(Problem source 1077)
& 题目大意:给出你n个平面内的点的坐标,然后让你用半径为1的圆去圈点,让你求出能够圈出的最大的点。
& 数理分析:这道题在大的思路上肯定是要暴力穷举,这不难看出来,剩下我们要解决的就是针对每次穷举我们应该怎样处理。& 我们穷举要选取的是两个点,为什么是两个点呢?因为我们通过这两个点,再加上圆的半径,就可以确定单位圆的位置。什么?你说可能有两边的?那么你想对了,这的确是这道题目需要着力思考的一个地方。& 我们先不纠结于细节,单纯的拿出一个图来进行分析。
& 通过画这一个图,我们可以简单的列出每次穷举的时候需要用到的计算公式,原理也十分简单,是最浅显的几何知识。& 那么现在的问题就是选取哪个半圆的问题。选取了半圆,我们用正余弦计算正负号的问题。这里做一个简单的思维铺垫,我们假定选取的两个点是有顺序的,即取的两个点A、B是有方向的,A-&B,这样的话,我们在选圆的时候只需要选一个即可,因为在后面遍历的时候还会出现B-&A,此时选出的圆将会对应着上次选择没有选到的那个圆,这要就做到了不重不漏。& 既然这样,我们开始基于一个点分析,加入我们选取的第一个点是A,那么就确立了关系A -& ? ,其中‘?‘就是我们下个要选取的字母。此时,其他字母相对于A有如下四种情况(之所以要分析这么详细是选取圆时,为了计算圆心,基于选取两点中点进行正余弦运算的正负号是不确定的)
& 其实细分到这,比较懒的一种做法就是四种情况分情况,对应四段代码,但是通常情况下呈现出的符号是有归纳性的规律的。& 这里答案其实呈现出多样性,我只就一种情况进行分析。& 在这四种情况中,dy / dx的正负我已标在图中。对于②③图,如果我们都选择直线AB左半平面的圆,此时取ang = arctan(-dy/dx),那么这两个图呈现出-x,+y的运算规律,考虑到第四象限角的正余弦值,显然我们基于AB中点o,要进行-操作。& 同理,我们分析①④,选取右平面,就会得到同上的结论。& 这样我们就很好的将四种情况统一到了一起,并且不会漏不会重复。
& 有了如上的数理思维,编程就很容易了。这里还有一个容易忽视的细节就是n = 1的临界情况分析,显然这种情况怎样都是可以圈出一个的,所以我们在进行暴力枚举的时候,应该注意比较大小的初始变量ans应该赋为1.& 参考代码如下。
#include&stdio.h&
#include&cmath&
using namespace
const int maxn = 305;
const double r = 1.0;
const double eps = 1e-6;
struct point
double dis(int a , int b)
return (p[a].x-p[b].x)*(p[a].x-p[b].x) + (p[a].y-p[b].y)*(p[a].y-p[b].y);
void get_centre(int a,int b)
double ox,oy,dx,dy,r,
ox=(p[a].x+p[b].x)/2;
oy=(p[a].y+p[b].y)/2;
dx=p[b].x-p[a].x;
dy=p[b].y-p[a].y;
p[n].x=p[n].y=
temp=dis(n,b);
r=sqrt(1.0-temp);
if(fabs(dx) & eps)//竖直的情况
p[n].x-=r;
double ang=atan(-dy/dx);
p[n].x-=r*sin(ang);
//这里给出的情况呼应上文的分析
p[n].y-=r*cos(ang);
int main()
scanf("%d",&T);
while(T--)
scanf("%d",&n);
for(i = 0;i &i++)
scanf("%lf%lf",&p[i].x,&p[i].y);
int Max , ans = 1;
for(i = 0;i &i++)
for(j = i + 1;j &j++)
if(dis(i,j) &= 4)
get_centre(i , j);
for(k = 0,Max = 0;k &k++)
if(n - k + Max &= ans)
double temp = sqrt(dis(k,n));
if(temp &= 1.0001)
if(Max & ans)
printf("%d\n",ans);
& 基于上面对于单位圆点覆盖的问题的探讨,我们再来看一道类似的题目。(Problem source : pku 1379)
&&& &题目阐述的很直接,就是给定一个含n个元素的点集,让你求找到用单位圆可以覆盖的最多的点是多少。&&&& 基于对上题模型的思考,这里就可以简单的修改一下上面代码来实现了,这里就不再累述。
&&参考系:《计算几何及应用》&金博&郭立
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 标签:原文地址:http://www.cnblogs.com/rhythmic/p/5202270.html
&&国之画&&&& &&&&chrome插件
版权所有 京ICP备号-2
迷上了代码!

我要回帖

更多关于 高三数学复习方法 的文章

 

随机推荐