随笔-341  评论-2670  文章-0  trackbacks-0
    今天终于把雏形给做出来了。主要的方法是牛顿迭代法,把屏幕上的所有点都收敛到函数图像上面。为了提速,我是用了ThreadTool.QueueUserWorkItem和Parallel.For,还把那颗函数的语法树用Linq.Expression编译成了机器码。下面的这些图都是二十秒钟左右就可以画出来的了。代码仍然在Vczh Library++3.0的Candidate\Games\FunctionVisualizer里面。直接F5太慢,要编译后在资源管理器打开。

    下面几个图来自于博客园的这篇新闻(http://news.cnblogs.com/n/106212/)。因为我还没做绝对值函数,所以只画了一半。结果还是有点瑕疵,再想想办法优化一下。











posted on 2011-08-10 22:36 陈梓瀚(vczh) 阅读(5843) 评论(10)  编辑 收藏 引用 所属分类: .NET

评论:
# re: 函数图像(二) 2011-08-10 23:34 | 土豆
太帅了  回复  更多评论
  
# re: 函数图像(二) 2011-08-11 01:00 | bennycen
Orz 膜拜大神!
保持队形啊~~~~  回复  更多评论
  
# re: 函数图像(二)[未登录] 2011-08-11 01:06 | diryboy
@bennycen
OrOrOrz!!  回复  更多评论
  
# re: 函数图像(二) 2011-08-11 08:13 | 陈昱(CY)
膜拜大神  回复  更多评论
  
# re: 函数图像(二) 2011-08-12 08:30 | Gezidan Studio
仰望  回复  更多评论
  
# re: 函数图像(二) 2011-08-26 02:22 | Junfeng
这个跟我做的那个http://www.cnblogs.com/rufi/archive/2011/06/28/GraphPlot.html
在算法上主要的区别是什么呀?  回复  更多评论
  
# re: 函数图像(二) 2011-08-26 10:28 | 陈梓瀚(vczh)
@Junfeng
我是求解了方程的根的,你那个不是。当然如果是不等式的话就没必要这么麻烦了,你那种方法处理不等式是好的,但是处理等式精度的问题会比较大(我只是根据你的博客的字,不知道你真实做法是怎么干的)。我猜你等式还是给了个阈值的。而我用了牛顿迭代法,阈值带来的问题不会很大。

不过GrafEq的做法是终极做法(可以找到论文),它的软件理解了表达式,然后对于一个任意的rectangle,它的软件内部给出了证明(但是没显示出来),说是不是rectangle整个都是黑的,或者白的,或者不知道。不知道的话就分为两个继续搞。这样做的精度是无限的(当然时间也是无限的,但是得到人眼能接受的结果非常迅速,因为最小的rectangle是一个pixel。如果你继续划分下去,还可以做antialias——GrafEq它就试图这么干)  回复  更多评论
  
# re: 函数图像(二) 2011-08-26 10:32 | 陈梓瀚(vczh)
@陈梓瀚(vczh)
哦,看到了,你的这个阈值隐含在了lua的==操作符的实现里面。  回复  更多评论
  
# re: 函数图像(二) 2011-08-26 10:36 | 陈梓瀚(vczh)
@Junfeng
我用我的那个东西画了“sin(x*sin(y)+y*sin(x))”。你给的结果是<0.0001的图,不过我是==0了。这样我就可以验证我的做法是不是准确的产生了边缘而不是色块。结果是好的。你可以试试。  回复  更多评论
  
# re: 函数图像(二) 2011-09-07 07:28 | Junfeng
用牛顿迭代法求根,精度高但是计算慢,GrafEq的算法我也看了一下,可能是用微分学的方法判断是不是根。另外一个结论是处理等式和不等式最好用不同的策略。  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理