随笔分类 - Silverlight数学引擎
摘要:在Win7上装了个IE10,虽然有不少诱人的新特性,但是在调试SL项目的时候却发现它对SL的支持有不少的问题,看来哥也要紧跟时代潮流了。本节应该是该系列的封篇之作了,哪天有空了再实现一个Html5版本吧,不过这个SL代码我会不经意地去维护的,比如Bug修复、易用性改善等等都不需要不断地完善。在前面我们已经实现了基本的画图功能,如点、线、圆等,这些已经是尺规作图的全部功能了。但是要实现快速方便的作图,仅仅靠这三大件是非常低效的,因此我们需要提供更为复杂的一些画图技能,比如多边形、平行线、对称点之类的,我们称为复合图形。本节的主要工作就是对每个复合图形提供一个画图练习题,用户完成了该练习题后就获得
阅读全文
摘要:曾经有个很有意思的面试题,题目是要求写一个程序,求1到100的累加值。不少人写出来的都是这个样子的: int sum = 0; for (int i = 1; i <= 100; i++) sum += i;但是参考答案却是这样的:int sum = (1 + 100)*50; 这道题没有难度,只是告诉你一个问题:不要把所有的工作都交给电脑,那样你的脑子就要生锈了,从另外一个方面讲,如何才能节省CPU时间提高程序的性能,是我们要常常动脑子去考虑的。当发现程序存在性能问题时,首先要做的工作当然是找出...
阅读全文
摘要:在此之前呢我们实现了尺规作图的所有图形元素,这就好比有了各种原材料,而且在上一节实现了数据保存和读取,就好比我们的图形产品能够进行储存和流通了;这一节我们就以工厂为概念来介绍我们复合图形的创建,就好比用原材料生产各种配件,然后用各种配件再组装成各种产品,也来过过老板瘾!管理工厂可不是那么简单的,特别是管人,特别是管90后,哎……,好在我们实现了全机械化操作,所有的生产活动都有计算机完成,呵呵。 首先来看看生产车间如何布局,因为我们工厂刚起步,业务不能太复杂,我们就选择几种主打产品吧,有:1. 线 2. 中垂线 3. 中点 4. 圆 5. 三角形外接圆 6. 点其中点、线、圆属于基础产品,我们已
阅读全文
摘要:这几天年终绩效考核,琐事比较多所以更新得没有以前快了,绝对不是因为网上说的什么微软关闭Silverlight网站的影响啦,就算微软说现在马上抛弃SL,我也要把这个游戏写完,对于那些一边玩着Windows系统,一边大骂.net framework是微软的骷髅的人我一般也没有什么可说的。说到游戏,数据存取这个功能是必须的,不管是游戏设置还是状态什么的,都是可以存成数据文件,然后可以从文件加载。本节就来实现将我们画的图形存成Xml文件,然后可以从Xml文件中加载图形,也只有这样,我们的过关游戏才能实现。要实现数据保存就要现有文件的内容格式,对于我们的坐标系上各个图形元素而言,就是要把他们按照依赖顺序
阅读全文
摘要:目前为止,我们画的图形都没有名字,这给人的感觉就是每个图形都是哑巴,虽然会动但是还无法正常地跟我们交流,这节开始我们就给他们取名字,使其能够表现自己。要命名并且显示在坐标系上,理所当然需要TextBlock了,但是我们以前创建的图形都是基于Shape的,这下就有点小麻烦了,如果在WPF中,我们还可以很方便地继承Shape去画自己的图形,但是在Silverlight中我还没有找到相关的资料可以做到这一点。在此我们只能给原有的CoordinateBase类做点小手术了:我们在该类中增加两个虚方法: protected virtual void ShapeAttached(){} ...
阅读全文
摘要:上节我们实现了属性编辑器,并且遗留了两个主要问题,这节我们实现两个新的功能(掩框和右键菜单)来Fix这两个问题,并且新增一些新的特性。第一个主要问题是【选择】的功能(请注意我将【拽】改成了【选】,因为我们增加了选择以进行属性编辑,以前的拖拽只能选中可移动对象所以不适用了),当我们选中了一个对象,除了属性编辑器有反应外,对象本身无任何反应,如果对象很多,当我们眨了一下眼可能就不记得选中的是哪个对象了,就像在下围棋,不记得刚才下的是哪个子儿,岂不悲乎?解决这个问题,方式不要太多了,例如可以改变对象的样式等,但是这种方式可能与我们的样式编辑器相冲突,所以我们采取另外一种,通过掩框(MaskFrame
阅读全文
摘要:顺便透露一下,我的一个目的就是做一个几何作图的过关游戏,根据过关的等级显示不同的技能,比如初始技能只有【笔】、【尺】、【规】,当你过了用这些初始竟能画平行线这一关,就会多一个技能【平行线】,所以以后就可以更方便地去画平行线了,嘿嘿,是不是挺有趣!如果只讲理论,前面介绍的那些基本已经足够了,但是要做成一个有趣的可玩的游戏,那还是相当低路漫漫其修远啊…,首先要考虑的就是清晰、整洁、美观。所以这一节我们就来实现一个样式编辑器,给我们画的图形化化妆,肉可不吃,色不可戒,哈哈。总结一下我们画的图形,都有哪些视觉上的属性需要考虑呢:线条颜色。填充颜色。线条粗细。线条虚实。透明度。巧的是,我们目前的图形只有
阅读全文
摘要:我们在上一节已经在理论上实现了尺规作图的各个功能,并通过代码创建了示例,如何脱离代码使我们的鼠标能够肩负起尺、规、笔三者的重任呢。这涉及到界面交互事件处理很多繁杂的事情,因此一般纯代码下不需要太注意的细节问题,在界面编程时就必须特别注意,细节决定成败。其实我们之前已经有了一个鼠标行为——拖拽,如果不考虑鼠标右键的话,那么鼠标的委托有三个(MouseUp、MouseDown、MouseMove),我们在拖拽的行为中就是将拖拽行为托付给这些委托来实现的。其他的行为如画点、画线的原理也是如此,如何将这些行为封装使其互不干扰是我们要考虑的。行为不多,其结构也十分简单,如图:在IBehavior中我们提
阅读全文
摘要:前面的分析被总结为两个字——依赖,我们的设计就从依赖开始。如果将相互依赖的各个元素画成一幅图,这种图就有两种形式,一种是树(像我们前面做的表达式解析),另一种就是网。很明显几何作图各个元素之间的关系是一张网,因此我们很难用一个树状的职能型的组织结构来类比地说明它,或者用人际关系之网来比如更恰当一点。不少人都会谈网色变,因为即是网就必然存在闭路,我们的网络短路或者程序死循环大多都拜他所赐,所以首先我们就要注意这个问题。举个例子,比如我们屏幕上有两个自由点A和B,以及依赖于它们的线段AB,我们用鼠标可以拖动自由点A,然后线段AB会跟着发生变化。如果我们用鼠标拖动线段,则A也会跟着移动,A的移动又带
阅读全文
摘要:线上点,这个线可以是直线也可以是曲线,这里统称为线了,因为尺规作图无外乎这两种。按照我们前面对点的分析,线上点是半自由点:它可以随着鼠标拖动始终位于所在的线上这就出现一个问题:比如当线的长度或者圆的大小放生变化时,自由点的位置如何变化?我们前面给出的方案是,比例保持不变:对于直线是“距离比例不变”(严格说是向量CA:BA不变,因为点可能在线段延长线上)对于圆是“角度比例不变”(即圆上点C与参照直径PQ的起点P相对圆心的夹角不变)如下图所示:上图中红色点即为鼠标拖动线上点C(黄色)时,鼠标的位置,因为我们不控制鼠标的移动,所以鼠标可以移动到线外,那么要确定C的Ratio,就需要计算了,从上图可以
阅读全文
摘要:深圳又到了一年中最为尴尬的天气,盖被子又热不盖又冷,带伞又不下雨不带的话可能就成落汤鸡,就连夏天觅不找踪影的蚊子,这个季节也纷纷出来劫色了,不禁回忆起老家那种四季分明的气候,春花秋月夏雨冬雪…我们继续来研究下交点,由于线和圆的交点相对比较简单我们就只讨论圆和圆相交的情况吧,其实也不是很难就是代数太多太繁琐,只要一步步理清了就好了。看看圆的方程:(x-a)2 - (y-b)2 = r2其中(a,b)就是圆心,r就是半径,很直观。计算两圆交点就是解这样的方程组,首先,我们按照这个公式定义一个圆: //圆:(x-a)2+(y-b)2=r2 public class LogicalCirc...
阅读全文
摘要:前面总结了尺规作图的三大元素(点、线、圆),而且得出其结论——所有图形也最终是依赖于一些自由点(FreePoint)。自由点是没有依赖的,可以在屏幕上随意绘制,因此除了基本的坐标转换(数学坐标系与屏幕坐标系)外没有复杂的数学计算,所以我们也就不讨论了。本节主要讨论线与线交点的坐标计算,本来想把三种交点(线与线,线与圆,圆与圆)放在一节介绍,后来写演示代码的时候发现工程量有点大,所以这一节还是只是介绍下线与线的交点(这叫做小步快跑,是TDD编程的推荐方法,因为步子迈太大容易扯着蛋啦,寡人这两天就觉得有点蛋疼)。线与线的交点必须要有两条线,我们在后台计算坐标需要用到平面解析几何(就是代数与几何的结
阅读全文
摘要:本系列(Silverlight数学引擎)的几何部分的不少思想是参考了微软的工程师Kirill Osenkov的开源项目“livegeometry”,大家有兴趣可以去参与该项目的讨论,项目地址是:http://livegeometry.codeplex.com。尺规作图就是用直尺(没有刻度哦)和圆规,当然还有笔啦,来绘制几何图形从而解决纯几何方面的数学问题,我们来总结一下笔尺规这三大元素:笔:用来画点(包括任意点、交点、图形上的点)和命名。尺:用来画线(两点确定一线,所以线直接依赖于两个点)。规:用来画圆(由一个线段(半径)和一个点(圆心)确定,所以圆直接或者间接地依赖于三个点)。简单吧,一切都
阅读全文
摘要:以上四节,我们实现了一个混合表达式的解析和求值过程,效果很不直观,所以这节我们做一个简单的动画来演示整个过程吧,以显得工作不那么虎头蛇尾:)这里有两个过程需要演示,解析过程和求值过程。先说解析过程吧,我们已经按解析的顺序把Nodes存入了Calculator的FoundNodes里面,常量和者变量(x)是最底层的Node,所以没有依赖到更底层的Node,其他的Node则依赖于其他的一些Nodes。如果把这种依赖关系画成图,则是一个树形结构,树的根节点就是我们最后解析出来的Node。树的类型可以根据拥有最大依赖节点数的节点确定,如果只有二元的,则树是二叉树,如果用到了多个参数的函数如(Max(1
阅读全文
摘要:在表达式中加入变量有什么用呢?看看下图就知道了:含有x的表达式无法直接求值,需要先对x进行赋值,例如对于(y=x*x)不断的赋值、取值,可以绘制出一一列点(x,y),从而可以绘制出平滑的抛物线。所以,XNode节点必须有个可赋值的属性:XValue,而且应该是静态的,以下是XNode的定义(超级简单,是不是?): public class XNode : NodeBase { public static double XValue { get; set; } public XNode(int index, string data, string expr...
阅读全文
摘要:这才写了几行代码就要重构啊?不错,子曰:小洞不补大洞一丈五,记住,时间可能会使你丧失重构的勇气。一:FinderBase.Find()的bug: public INode Find(string expression) { Match = Regex.Match(expression); INode node = null; if (Match.Success) { node = GenerateNode(expression, Match.Valu...
阅读全文
摘要:四则混合运算已经实现,变成五则(例如加入幂)是小Kiss啦,这里就不再阐述了。这节中,我们在表达式中混入System.Math中定义的一些数学函数,如Sin(),Abs()等,要求在不改变原有节点和节点解析类的情况下加入新的函数节点和函数节点解析类,以此来检测我们之前的设计是否稳健,首先还是测试用例: [TestMethod] public void TestCalculator2() { //数学函数与混合运算 var calculator = new Calculator(); va...
阅读全文
摘要:四则混合运算的程序相信大家在学习编程的时候都写过,这里采用面向对象的方式重新设计一下这个程序,作为数学引擎的第一个功能模块。本文用到的相关技术细节主要有以下几点,读者如果没有涉及到的话,可以先参考一下相关的技术资料:TDD(测试驱动开发):本文只是将其作为一个完整的项目开发的一部分简单提及。设计模式:真正的面向对象设计必然遵循了一种或几种模式,本文会适当地方加以注释。正则表达式:仅用到非常简单的正则式用于表达式解析,如果对正则表达式不了解,花20分钟速成一下即可掌握:)LINQ:寡人已经无法不用Linq了,如果不熟悉,给你推荐两个学习工具:LinqPad和ReSharper.Reflector
阅读全文
浙公网安备 33010602011771号