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

在此之前呢我们实现了尺规作图的所有图形元素,这就好比有了各种原材料,而且在上一节实现了数据保存和读取,就好比我们的图形产品能够进行储存和流通了;这一节我们就以工厂为概念来介绍我们复合图形的创建,就好比用原材料生产各种配件,然后用各种配件再组装成各种产品,也来过过老板瘾!

管理工厂可不是那么简单的,特别是管人,特别是管90后,哎……,好在我们实现了全机械化操作,所有的生产活动都有计算机完成,呵呵。 首先来看看生产车间如何布局,因为我们工厂刚起步,业务不能太复杂,我们就选择几种主打产品吧,有:

1. 线 2. 中垂线 3. 中点 4. 圆 5. 三角形外接圆 6. 点

其中点、线、圆属于基础产品,我们已经实现了,为了方便管理,我们把它们全部移到ShapeFactory类中并且进行一下整合。我们再从依赖的角度将以上图形分一下类:

1. 依赖于两个点的有:线、中垂线、中点。

2. 依赖于三个点的有:圆、外接圆。

3. 点的依赖视其类型而定。

其中,1和2比较有规律,我们就分别建立两个相应的车间BaseOnTwoPointsCreatorBaseOnThreePointsCreator;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

上图中图形不多,但是你如果选中一个红点进行拖拽的话可能会有一点卡,这是明显的性能问题,也是我们以前一直没有太关注的问题,下节我们着重就性能方面进行一些优化!

posted @ 2012-12-14 10:27  地月银光  阅读(1511)  评论(5)    收藏  举报