地月银光 发表于 2013-1-2 23:18:29

Silverlight数学引擎(16)——图形工厂

<div id="cnblogs_post_body">在此之前呢我们实现了尺规作图的所有图形元素,这就好比有了各种原材料,而且在上一节实现了数据保存和读取,就好比我们的图形产品能够进行储存和流通了;这一节我们就以工厂为概念来介绍我们复合图形的创建,就好比用原材料生产各种配件,然后用各种配件再组装成各种产品,也来过过老板瘾!
管理工厂可不是那么简单的,特别是管人,特别是管90后,哎……,好在我们实现了全机械化操作,所有的生产活动都有计算机完成,呵呵。 首先来看看生产车间如何布局,因为我们工厂刚起步,业务不能太复杂,我们就选择几种主打产品吧,有:
1. 线 2. 中垂线 3. 中点 4. 圆 5. 三角形外接圆 6. 点
其中点、线、圆属于基础产品,我们已经实现了,为了方便管理,我们把它们全部移到ShapeFactory类中并且进行一下整合。我们再从依赖的角度将以上图形分一下类:
1. 依赖于两个点的有:线、中垂线、中点。
2. 依赖于三个点的有:圆、外接圆。
3. 点的依赖视其类型而定。
其中,1和2比较有规律,我们就分别建立两个相应的车间BaseOnTwoPointsCreator和BaseOnThreePointsCreator;3不好确定我们就保持现有的逻辑不变,来看一下整合后的结构图,是不是比以前清晰多了?:
http://pic002.cnblogs.com/images/2012/470264/2012121410242676.jpg
有了这种分类,工厂的生产就能够有条不紊啦,看看各种产品的制造工艺就知道了:
<div class="cnblogs_code">      //中垂线      public static LineShape DrawPerpendicularBisector(this CoordinateSystem cs, PointShape A, PointShape B)      {            var O1 = cs.FindCircle(A, A, B);            var O2 = cs.FindCircle(B, B, A);            var D = cs.DrawIntersectionPoint1(O1, O2);            var E = cs.DrawIntersectionPoint2(O1, O2);            var DE = cs.FindLine(D, E, true, true);            return DE;      }      //中点      public static PointShape DrawMidPoint(this CoordinateSystem cs, PointShape A, PointShape B)      {            var AB = cs.FindLine(A, B, true, true);            var PAB = cs.DrawPerpendicularBisector(A, B);            var MAB = cs.DrawIntersectionPoint(AB, PAB);            return MAB;      }      //外接圆      public static CircleShape DrawCircumscribedCircle(this CoordinateSystem cs, PointShape A, PointShape B, PointShape C)      {            var PAB = cs.DrawPerpendicularBisector(A, B);            var PBC = cs.DrawPerpendicularBisector(B, C);            var O = cs.DrawIntersectionPoint(PAB, PBC); //中垂线交点(外接圆圆心)            var circleABC = cs.FindCircle(O, O, A, true, false); //三角形ABC外接圆            return circleABC;      }
页: [1]
查看完整版本: Silverlight数学引擎(16)——图形工厂