Silverlight数学引擎(16)——图形工厂
在此之前呢我们实现了尺规作图的所有图形元素,这就好比有了各种原材料,而且在上一节实现了数据保存和读取,就好比我们的图形产品能够进行储存和流通了;这一节我们就以工厂为概念来介绍我们复合图形的创建,就好比用原材料生产各种配件,然后用各种配件再组装成各种产品,也来过过老板瘾!
管理工厂可不是那么简单的,特别是管人,特别是管90后,哎……,好在我们实现了全机械化操作,所有的生产活动都有计算机完成,呵呵。 首先来看看生产车间如何布局,因为我们工厂刚起步,业务不能太复杂,我们就选择几种主打产品吧,有:
1. 线 2. 中垂线 3. 中点 4. 圆 5. 三角形外接圆 6. 点
其中点、线、圆属于基础产品,我们已经实现了,为了方便管理,我们把它们全部移到ShapeFactory类中并且进行一下整合。我们再从依赖的角度将以上图形分一下类:
1. 依赖于两个点的有:线、中垂线、中点。
2. 依赖于三个点的有:圆、外接圆。
3. 点的依赖视其类型而定。
其中,1和2比较有规律,我们就分别建立两个相应的车间BaseOnTwoPointsCreator和BaseOnThreePointsCreator;3不好确定我们就保持现有的逻辑不变,来看一下整合后的结构图,是不是比以前清晰多了?:

有了这种分类,工厂的生产就能够有条不紊啦,看看各种产品的制造工艺就知道了:
//中垂线 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; }
OK,由此看来复合图形的创建是十分简单而自然的事情。最主要的工作恐怕也是和新产品的研发相类似的过程吧,如何创建出美妙而有趣味的复合图形是需要花一番功夫的,不过总体来说,我们的工具已经实现了,剩下的主要工作就交给富有创造性的大脑去完成了。
本节运行效果如图:

http://www.diyuexi.com/webpages/query/ShareRes.aspx
上图中图形不多,但是你如果选中一个红点进行拖拽的话可能会有一点卡,这是明显的性能问题,也是我们以前一直没有太关注的问题,下节我们着重就性能方面进行一些优化!
浙公网安备 33010602011771号