可视化水平表面

时间:2011-01-12 21:57:51

标签: algorithm math equation-solving

我正在尝试使用这种方法开发一个水平表面可视化器(不知道这是标准方法还是有更好的方法):

    1.取任何函数f(x,y,z)=k(其中k是常数),并绑定x,y和z。同时接受两个网格参数stepX和stepZ。
      2.要减少到水平曲线问题,请使用stepZ间隔从zMin迭代到zMax。所以f(x,y,z)=k => f(x,y,fixedZ)=k
        3.使用stepX执行相同的过程,将问题减少到f(fixedX, y, fixedZ)=k
          4.求解f(fixedX, y, fixedZ) - k = 0得到满足该等式的y的所有值(使用某种根寻找算法)。
            5.对于生成的所有点,将它们绘制为水平曲线(内部循环在给定的z处生成水平曲线,然后对于不同的z值,只有水平曲线的堆叠)
              6(可选)。从属于级别集的这些级别曲线/点生成网格。

              我遇到的问题是第4步。我无法事先了解y有多少可能的y值满足该等式(更具体地说,y的唯一值和实数值)。

              另外,我试图保持程序尽可能通用,所以我试图不将原始函数f(x,y,z)=k限制为任何约束,例如平滑度或除k以外的多项式必须是常量,如水平表面。

              是否有算法(不使用CAS /符号求解)可以识别函数的根,即使它有多个根?我知道二分法很难用于此,因为区域内没有任何符号变化的可能性,但割线/牛顿法的表现如何?使用割线/牛顿方法可以使用哪些函数集,并且可以检测并找到两个给定边界内的所有唯一真实根?或者是否有更好的方法来生成/可视化水平面?

3 个答案:

答案 0 :(得分:2)

我想我找到了解决问题的方法。我做了一些研究,发现水平表面是等值面的同义词。因此,在理论上,像行进立方体方法应该有效。

答案 1 :(得分:2)

如果您需要Marching Cubes算法的示例,请查看

http://stemkoski.github.com/Three.js/Marching-Cubes.html

(使用JavaScript / Three.js作为图形)。

有关理论的更多详情,请查看

上的文章

http://paulbourke.net/geometry/polygonise/

答案 2 :(得分:1)

一种简单的方法,

2D:以灰度为单位绘制颜色= floor(q * f(x,y))的图(x,y),其中q是某个任意因子。 3D:绘图(x,y,floor(q * f(x,y))

等效函数的有效高度将表示在同一水平面上。

如果要获得水平曲线,可以使用2D方法和边缘检测/区域分类来获得同一水平上的点(x,y)。