4

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

    1. 取任何函数f(x,y,z)=k(其中 k 是常数),以及 x、y 和 z 的界限。还要接受两个网格参数 stepX 和 stepZ。
    2. 减少到水平曲线问题,从 zMin 迭代到 zMax 与 stepZ 间隔。所以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 有多少唯一和真实的值)。

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

是否有一种算法(不使用 CAS/符号求解)可以识别函数的根,即使它有多个根?我知道二分法很难解决这个问题,因为该区域可能没有符号变化,但是割线/牛顿法的效果如何?割线/牛顿法可以用于哪组函数,它能否检测并找到两个给定范围内的所有唯一实根?还是有更好的方法来生成/可视化水平面?

4

3 回答 3

2

我想我已经找到了解决问题的方法。我做了更多的研究,发现水平面是等值面的同义词。所以从理论上讲,像行进立方体方法这样的东西应该可以工作。

于 2011-01-12T22:35:33.607 回答
2

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

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

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

有关该理论的更多详细信息,您应该查看文章

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

于 2012-08-27T20:41:30.163 回答
1

一个简单的方法,

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

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

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

于 2011-01-13T20:17:13.880 回答