摘要: 深圳又到了一年中最为尴尬的天气,盖被子又热不盖又冷,带伞又不下雨不带的话可能就成落汤鸡,就连夏天觅不找踪影的蚊子,这个季节也纷纷出来劫色了,不禁回忆起老家那种四季分明的气候,春花秋月夏雨冬雪…我们继续来研究下交点,由于线和圆的交点相对比较简单我们就只讨论圆和圆相交的情况吧,其实也不是很难就是代数太多太繁琐,只要一步步理清了就好了。看看圆的方程:(x-a)2 - (y-b)2 = r2其中(a,b)就是圆心,r就是半径,很直观。计算两圆交点就是解这样的方程组,首先,我们按照这个公式定义一个圆: //圆:(x-a)2+(y-b)2=r2 public class LogicalCirc... 阅读全文
posted @ 2012-11-30 15:59 地月银光 阅读(1438) 评论(0) 推荐(3)
摘要: 前面总结了尺规作图的三大元素(点、线、圆),而且得出其结论——所有图形也最终是依赖于一些自由点(FreePoint)。自由点是没有依赖的,可以在屏幕上随意绘制,因此除了基本的坐标转换(数学坐标系与屏幕坐标系)外没有复杂的数学计算,所以我们也就不讨论了。本节主要讨论线与线交点的坐标计算,本来想把三种交点(线与线,线与圆,圆与圆)放在一节介绍,后来写演示代码的时候发现工程量有点大,所以这一节还是只是介绍下线与线的交点(这叫做小步快跑,是TDD编程的推荐方法,因为步子迈太大容易扯着蛋啦,寡人这两天就觉得有点蛋疼)。线与线的交点必须要有两条线,我们在后台计算坐标需要用到平面解析几何(就是代数与几何的结 阅读全文
posted @ 2012-11-29 19:18 地月银光 阅读(1168) 评论(2) 推荐(3)
摘要: 本系列(Silverlight数学引擎)的几何部分的不少思想是参考了微软的工程师Kirill Osenkov的开源项目“livegeometry”,大家有兴趣可以去参与该项目的讨论,项目地址是:http://livegeometry.codeplex.com。尺规作图就是用直尺(没有刻度哦)和圆规,当然还有笔啦,来绘制几何图形从而解决纯几何方面的数学问题,我们来总结一下笔尺规这三大元素:笔:用来画点(包括任意点、交点、图形上的点)和命名。尺:用来画线(两点确定一线,所以线直接依赖于两个点)。规:用来画圆(由一个线段(半径)和一个点(圆心)确定,所以圆直接或者间接地依赖于三个点)。简单吧,一切都 阅读全文
posted @ 2012-11-27 11:45 地月银光 阅读(1411) 评论(1) 推荐(0)
摘要: 以上四节,我们实现了一个混合表达式的解析和求值过程,效果很不直观,所以这节我们做一个简单的动画来演示整个过程吧,以显得工作不那么虎头蛇尾:)这里有两个过程需要演示,解析过程和求值过程。先说解析过程吧,我们已经按解析的顺序把Nodes存入了Calculator的FoundNodes里面,常量和者变量(x)是最底层的Node,所以没有依赖到更底层的Node,其他的Node则依赖于其他的一些Nodes。如果把这种依赖关系画成图,则是一个树形结构,树的根节点就是我们最后解析出来的Node。树的类型可以根据拥有最大依赖节点数的节点确定,如果只有二元的,则树是二叉树,如果用到了多个参数的函数如(Max(1 阅读全文
posted @ 2012-11-26 16:57 地月银光 阅读(1750) 评论(1) 推荐(4)
摘要: 在表达式中加入变量有什么用呢?看看下图就知道了:含有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... 阅读全文
posted @ 2012-11-24 11:37 地月银光 阅读(1512) 评论(2) 推荐(4)
摘要: 这才写了几行代码就要重构啊?不错,子曰:小洞不补大洞一丈五,记住,时间可能会使你丧失重构的勇气。一:FinderBase.Find()的bug: public INode Find(string expression) { Match = Regex.Match(expression); INode node = null; if (Match.Success) { node = GenerateNode(expression, Match.Valu... 阅读全文
posted @ 2012-11-23 09:25 地月银光 阅读(421) 评论(0) 推荐(0)
摘要: 四则混合运算已经实现,变成五则(例如加入幂)是小Kiss啦,这里就不再阐述了。这节中,我们在表达式中混入System.Math中定义的一些数学函数,如Sin(),Abs()等,要求在不改变原有节点和节点解析类的情况下加入新的函数节点和函数节点解析类,以此来检测我们之前的设计是否稳健,首先还是测试用例: [TestMethod] public void TestCalculator2() { //数学函数与混合运算 var calculator = new Calculator(); va... 阅读全文
posted @ 2012-11-22 12:55 地月银光 阅读(473) 评论(0) 推荐(0)
摘要: 现在我对C#编程已经无法不Linq了,因为它能将我从无数的机械代码中解脱出来,使得写代码和阅读代码变得更像是在创造艺术和欣赏艺术。这里分享一下以前学Linq的经验。一:LinqPad:LinqPad是一个专业的学习Linq的工具,同时也是一个IDE啦,从Linq2SQL到Linq2Xml都提供了很多实例;LinqPad还提供了Linq代码的IL语言代码,对于想研究Linq底层原理的人来说绝对是个难得的好东东。对于LinqPad的使用这里就不做介绍了,园子里和网上都有很多相关文章。下载地址:http://www.linqpad.net/二:ReSharper:ReSharper是Visual S 阅读全文
posted @ 2012-11-21 14:39 地月银光 阅读(922) 评论(0) 推荐(1)
摘要: 四则混合运算的程序相信大家在学习编程的时候都写过,这里采用面向对象的方式重新设计一下这个程序,作为数学引擎的第一个功能模块。本文用到的相关技术细节主要有以下几点,读者如果没有涉及到的话,可以先参考一下相关的技术资料:TDD(测试驱动开发):本文只是将其作为一个完整的项目开发的一部分简单提及。设计模式:真正的面向对象设计必然遵循了一种或几种模式,本文会适当地方加以注释。正则表达式:仅用到非常简单的正则式用于表达式解析,如果对正则表达式不了解,花20分钟速成一下即可掌握:)LINQ:寡人已经无法不用Linq了,如果不熟悉,给你推荐两个学习工具:LinqPad和ReSharper.Reflector 阅读全文
posted @ 2012-11-21 12:07 地月银光 阅读(970) 评论(5) 推荐(3)
摘要: 异常消息:Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.被测项目(MathEngine)是Silverlight窗体项目,MathEngine.App和MathEngine.MainPage分别是默认的应用程序类和主窗体类,因此包含了System.Windows的引用。而测试项目(MathEngineTests)默认为非窗体项目,并没有添加对System.Windows的引用。添加引用:C:\Program Files 阅读全文
posted @ 2012-11-20 14:48 地月银光 阅读(212) 评论(0) 推荐(0)