这是 3D 实体凹面或凸面的边缘吗?
Is this Edge of a 3D solid Concave or Convex?
给定一个 3D 实体模型和一条边,我正在测试该边是凹的还是凸的。
最好的方法是什么?我想尽量减少关于输入几何的假设。我在这个问题上的第一遍采用两个相邻面的顶点的平均值来生成中心点,将其中一个点偏移到该点的面法线,并测试偏移点是更接近还是更远离相对的面原本的。这适用于大小大致相同的成对简单面孔。它失败了,例如,小脸远离大脸的中心。
我在 Revit 中这样做,但我想这个问题在 Rhino、Catia 和任何实体建模器中都是一样的。从边缘我可以提取相邻的面孔。我知道面孔的方向正确,因此法线指向外。我可以将 3D 点投影到面部,计算这些点处的面部法线等。
这是原始版本的代码:
public static Boolean AreFacesConcave(Face face_0, Face face_1, Document doc)
{
UV uvMid_0 = VertexAverageUV( face_0 ); //3D average of the vertices
UV uvMid_1 = VertexAverageUV( face_1 ); // approximates the center of the face
XYZ pt_0 = face_0.Evaluate(uvMid_0);
XYZ pt_1 = face_1.Evaluate(uvMid_1);
// normals at those points
XYZ normal_0 = face_0.ComputeNormal(uvMid_0);
XYZ normal_1 = face_1.ComputeNormal(uvMid_1);
// third point, offset from face 2 by normal
XYZ pt_2 = pt_1.Add(normal_1.Normalize());
Double d0 = pt_0.DistanceTo(pt_1);
Double d1 = pt_0.DistanceTo(pt_2);
return (d1 < d0);
}
如果您知道法向量总是向外的,请在两个相邻面内获取两个点 A 和 B(三个非共线顶点的平均值或您的 'center points')。
然后检查向量 AB 和 nA(垂直于包含点 A 的面)的点(标量)积的符号。
Result = DotProduct(AB, nA)
负号表示 'convex' 边,正号 - 'concave' 一个。
二维示例:nA 向外法线,CDF 的 D 边是凹的,CDE 的 D 边是凸的
给定一个 3D 实体模型和一条边,我正在测试该边是凹的还是凸的。
最好的方法是什么?我想尽量减少关于输入几何的假设。我在这个问题上的第一遍采用两个相邻面的顶点的平均值来生成中心点,将其中一个点偏移到该点的面法线,并测试偏移点是更接近还是更远离相对的面原本的。这适用于大小大致相同的成对简单面孔。它失败了,例如,小脸远离大脸的中心。
我在 Revit 中这样做,但我想这个问题在 Rhino、Catia 和任何实体建模器中都是一样的。从边缘我可以提取相邻的面孔。我知道面孔的方向正确,因此法线指向外。我可以将 3D 点投影到面部,计算这些点处的面部法线等。
这是原始版本的代码:
public static Boolean AreFacesConcave(Face face_0, Face face_1, Document doc)
{
UV uvMid_0 = VertexAverageUV( face_0 ); //3D average of the vertices
UV uvMid_1 = VertexAverageUV( face_1 ); // approximates the center of the face
XYZ pt_0 = face_0.Evaluate(uvMid_0);
XYZ pt_1 = face_1.Evaluate(uvMid_1);
// normals at those points
XYZ normal_0 = face_0.ComputeNormal(uvMid_0);
XYZ normal_1 = face_1.ComputeNormal(uvMid_1);
// third point, offset from face 2 by normal
XYZ pt_2 = pt_1.Add(normal_1.Normalize());
Double d0 = pt_0.DistanceTo(pt_1);
Double d1 = pt_0.DistanceTo(pt_2);
return (d1 < d0);
}
如果您知道法向量总是向外的,请在两个相邻面内获取两个点 A 和 B(三个非共线顶点的平均值或您的 'center points')。
然后检查向量 AB 和 nA(垂直于包含点 A 的面)的点(标量)积的符号。
Result = DotProduct(AB, nA)
负号表示 'convex' 边,正号 - 'concave' 一个。
二维示例:nA 向外法线,CDF 的 D 边是凹的,CDE 的 D 边是凸的