最佳拟合矩形来自Three.js中的共面点集

时间:2017-11-09 00:27:54

标签: javascript three.js aframe

首先,我道歉,如果有一个解决方案,但我已经做了很多挖掘Three.js和A-Frame文档以及Stack Overflow并且没有找到我的东西寻找。

我想要做的是从一组我已经知道的共面的Vector3创建一个最适合的A-Frame平面。如果平面的角度是90的倍数,这很容易做到,但是其他任何东西和Box3s的.setFromPoints()算法都不能按我需要的方式工作。

从Three.js转换为A-Frame我很可能会处理自己,但是如果有人想解决这个问题,我们非常欢迎他们。我只需要创建一个实际上有意义的矩形平面。

基本上,我想创建一个执行此操作的算法:

创建粗体平面,而不是浪费太多空间的打火机盒/平面。

Drawing Explanation

我不想创建完全符合要点的自定义几何体,这是我已经完成的。我实际上只想要一个只有高度,宽度,位置和旋转属性的A-Frame平面。我知道这不太精确,但它对我正在做的事情来说更为理想。

3 个答案:

答案 0 :(得分:2)

好的,也许我以前的答案难以实施。这是另一个想法:计算点的凸包(https://en.wikipedia.org/wiki/Graham_scan提供一个简单有效的伪代码算法)。内在点无关紧要。最佳矩形必须与凸包的至少一个侧面重合。随着凸包侧面的所有角度计算具有该角度的矩形的尺寸。然后采取最低限度。

答案 1 :(得分:1)

首先找到通过这些点的最佳线。这被称为" line fit",就像这里:http://stackoverflow.com/questions/2352256/fit-a-3d-line-to-3d-point-data-in-java一样,应该很容易在两个维度而不是三个维度中执行此操作。另见:https://en.wikipedia.org/wiki/Deming_regression 该线给出了角度,点的垂直距离的minmax是矩形的高度,垂直脚点到线的位置的minmax是矩形的宽度。 或者您通过线的负角度旋转所有点,并简单地计算矩形的宽度和高度的点的x和y分量的最小值。

答案 2 :(得分:0)

对于搜索在threejs中计算共面点的最佳拟合矩形的人来说,这里有一个简单的解决方案,实施起来相当快:

  • 在平面 A、B、C 上选择任意 3 个共面点并计算平面法线。

然后planeNormal = crossVectors(A-B, B-C);。或者,如果您有面孔,则取所有面孔的平均法线。

  • 旋转所有点,使平面法线为 Vector3(0,0,1)

对于所有点:point.applyMatrix4(new Matrix4().makeRotationFromQuaternion(new Quaternion().setFromUnitVectors(new Vector3(0,0,1), planeNormal).invert()))

  • 计算变换点的边界框大小

size = new BoundingBox().setFromPoints(points).getSize(new Vector3());

这将给出 xy 组件中的矩形宽度和高度。 z 应该是 0,如果所有点都共面。

现在我们有了足以创建平面几何的矩形法线、宽度和高度。