繁体   English   中英

可视化水平表面

[英]Visualizing Level surfaces

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

    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的所有y值(使用某种根寻找算法) f(fixedX, y, fixedZ) - k = 0
    5.对于生成的所有点,将它们绘制为水平曲线(内部循环在给定的z处生成水平曲线,然后对于不同的z值,只有水平曲线的堆叠)
    6(可选)。 从属于级别集的这些级别曲线/点生成网格。

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

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

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

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

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

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

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

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

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

一个简单的方法,

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM