Silverlight数学引擎(6)——尺规作图分析
本系列(Silverlight数学引擎)的几何部分的不少思想是参考了微软的工程师Kirill Osenkov的开源项目“livegeometry”,大家有兴趣可以去参与该项目的讨论,项目地址是:http://livegeometry.codeplex.com。
尺规作图就是用直尺(没有刻度哦)和圆规,当然还有笔啦,来绘制几何图形从而解决纯几何方面的数学问题,我们来总结一下笔尺规这三大元素:
- 笔:用来画点(包括任意点、交点、图形上的点)和命名。
- 尺:用来画线(两点确定一线,所以线直接依赖于两个点)。
- 规:用来画圆(由一个线段(半径)和一个点(圆心)确定,所以圆直接或者间接地依赖于三个点)。
简单吧,一切都是从一个点开始,一生二、二生三、三生万物,其精彩简直可以与现实的世界相媲美,从而使我们有兴趣以屏幕之方寸地,展现几何宇宙之精妙。所以这一节我们不写代码页不搞设计,只是来逛一逛几何世界,顺便取点心经回去——汝果欲写诗,功夫在诗外。
先来贴两张几何大牛的作品:


几何的世界与我们面向对象的编程世界一样,一切皆有规则,不按规则出牌必将产生不了期望的结果,遵循规则除了能达到期望之外,往往还会有意外的收获,从上面两张图,你看出了什么呢?量变才能体现质变,正如只有经历过千百遍的代码重构,才能总结出模式的精华一样,无数个圆的外接三角形的出现,在圆之外又造就了一片天。
好了,繁华阅尽,回归真纯吧,其实再复杂的图形都是最终都是依赖于一些微不足道的小点,那么我们就来归纳一下点的行为和属性,尺规作图中的点有三种:
- 任意点(FreePoint):用笔在纸上随意画的点,位置由笔指定。
- 交点(IntersectionPoint):比如线和圆的交点,最多有两个,位置由线和圆的位置来确定。
- 图形上点(PointOnFigure):比如圆上的点,属于半任意点,因为只要在圆上,位置可以不确定,
这三种基本的点之间没有直接的依赖关系,其他的点如中点(MidPoint)等都是扩展点,是这三个点中的一种,例如通过作图可以知道中点其实就是一个交点。
从一开始的分析我们就知道,任何复杂的图形最终都是依赖于点的,所以交点也是间接依赖于任意点的,任意点的位置是画的时候确定的(不过在屏幕上画图时我们要允许它能够通过鼠标移动,也就是说其位置由鼠标指定),这些都比较容易理解也容易实现。
下面来说说那个半拉子任意点(PointOnFigure),这个就有点头痛了,任何模棱两可的东西都让寡人头痛,这类东西就像是社会上不安分守纪的爱钻法律空子的分子,你不能说它不遵循规则,但是它就是让你不爽。对于这种东西,我们除了完善法律法规来治它别无他法,总不能以暴制暴对吧,非暴力不合作也解决不了什么问题,我们要依法治国,以德服人。
好了,法律也是分门别类的,但是根是根本大法,来总结一下PointOnFigure的规律,以找出共同点和不同点,从而为我们制定根本法和专门法寻找依据,尺规作图只有线和圆(当然还有圆弧,其他不用圆弧也行的),我们有两种PointOnFigure:
- PointOnLine:如果Line依赖于两个自由点AB,当A的位置变化时,线也会跟着变化,这个时候PointOnLine(C)的位置该怎么变化呢?当然有多种选择,例如
(一):使得其与Line的第一个点A的距离保持不变;
(二)使其分线段AB的比例(即AC:CB)不变。
很明显,选择(二)更合适一点。
- PointOnCircle:如果P在圆O上,当圆O的大小发生变化时,P的位置如何?也可以有多种选择方案,例如
(一):使其与水平线X轴正向的夹角(角POX)不变,
(二):如果圆O是以MN为直径的圆,可以使P分弧PM、PN的比例不变。
这两点各有所长,应用的场景也不一样,其实MN就是将水平轴X转了个角度而已,所以选(二)更灵活一点。

至此规则就已经明了了,我们的根本大法是“比例不变”,专门法律根据具体图形确定,对于线是“距离比例不变”,对于圆是“角度比例不变”。法律在面向对象编程的世界里有个专门名词,不错,它就是接口(Interface),熟悉接口编程的应该都知道它的强大了,因为它制定了法规,实现了人人平等。
好了,以上分析了点的一些特征,归根结底就是讨论点的位置的确定,由此坐标系这个玩意又出现了(我们在前面已经实现了CoordinateSystem了),虽然实际的尺规作图不会用到坐标的概念,但是我们需要将它展示在屏幕上,自然还是少不了坐标系。再说,我们之前实现的坐标系是个Canvas,在此完全可以将其作为一个画板来画我们的点了,否则皮之不存毛将焉附呢!
好啦,这节没有代码,就不提供下载了!
下一部分我们将分析一下一些数学计算,比如圆和线的交点的坐标如何计算、数学极值问题(如两线由相交变平行,其交点无穷远不存在了)等等。
因为以后涉及到大量的UI操作,就类似于游戏编程一样,涉及到大量的屏幕元素的相关数学计算,我们先把要用的东西归纳下,磨刀不误砍柴工嘛!
浙公网安备 33010602011771号