【问题标题】:Area of adjacent triangles Three.js相邻三角形的面积 Three.js
【发布时间】:2015-10-15 19:59:59
【问题描述】:

我试图在 Three.js 的网格中找到与特定顶点相邻的三角形区域。

我知道 three.js 中的面表示网格中顶点的连接方式,但我还没有找到一种有效的方法来找到与特定顶点相邻的所有三角形的索引集。

下面的代码是我能想到的最好的代码,但是给定一个具有超过 16,000 个顶点(非重复)和超过 5,000 个面的大型网格,循环运行 > 80m 次,这需要的时间太长了。

此外,我的 if 函数用于检查面中的 a、b 或 c 位置是否与当前循环中的顶点的位置匹配。

var objectFace = object.geometry.faces;
var objectVertex = object.geometry.vertices;

    for( var m = 0; m < objectVertex.length; m++ ) {
        for( var q = 0; q < objectFace.length; q++ ) {

            fArray = objectFace[q];

            if ( fArray.a = m || fArray.b = m || fArray.c = m ) {
            var va = fArray.a;
            var vb = fArray.b;
            var vc = fArray.c;

            var v1 = objectVertex[va];
            var v2 = objectVertex[vb];
            var v3 = objectVertex[vc];

            var vec1 = [( v2.x - v1.x ), ( v2.y - v1.y ), ( v2.z - v1.z )];
            var vec2 = [( v3.x - v1.x ), ( v3.y - v1.y ), ( v3.z - v1.z )];

            //calculate area of triangle with Heron's equation
            //store area values in array

        }
    };
};

然后我通过交叉两个向量并将它们代入 Heron 方程来计算面积。

非常感谢任何帮助。

*ps 我知道我的 JS 技能不是很好,但这是我能想到的最好的。

【问题讨论】:

  • 是代码运行速度不够快的问题吗?或者它没有返回正确的结果?另外我认为` if ( fArray.a = m || fArray.b = m || fArray.c = m ) {` 是错误的。你的意思是 ` if ( fArray.a === m || fArray.b === m || fArray.c === m ) {` ?
  • 代码返回正确的结果,但运行速度太慢。就像我说的,使用我运行计算的模型,它必须循​​环 8000 万次。

标签: javascript algorithm three.js


【解决方案1】:

您似乎正在尝试对所有顶点执行此操作。因此,您不必循环遍历每个顶点、每个面,然后整理出非入射面,而是遍历面并累积相应顶点的结果:

[Pseudo code]
for each face
    a := calculate face area
    areas[facce.first vertex] += a
    areas[facce.second vertex] += a
    areas[facce.third vertex] += a
next

【讨论】:

  • 感谢 Nico,使用您的代码逻辑,我能够编写出更高度优化的函数。
猜你喜欢
  • 1970-01-01
  • 2021-12-21
  • 1970-01-01
  • 2014-12-06
  • 1970-01-01
  • 1970-01-01
  • 2019-09-08
  • 2023-01-31
  • 2018-02-11
相关资源
最近更新 更多