Graphics 无效三角形

Graphics 无效三角形,graphics,3d,Graphics,3d,检测3D网格中无效三角形的最快方法是什么?我的意思是: 零区 三个共线点 两个重叠点 我们目前使用这种非常缓慢的方法: if (Area(p1,p2,p3) < 1e-3) Debug.WriteLine("Invalid triangle found!"); public double Area(Point p1, Point p2, Point p3) { double[,] m = new double[3, 3];

检测3D网格中无效三角形的最快方法是什么?我的意思是:

  • 零区
  • 三个共线点
  • 两个重叠点
我们目前使用这种非常缓慢的方法:

    if (Area(p1,p2,p3) < 1e-3)

         Debug.WriteLine("Invalid triangle found!");

    public double Area(Point p1, Point p2, Point p3)
    {

        double[,] m = new double[3, 3];

        m[0, 0] = p1.Y; m[0, 1] = p1.Z; m[0, 2] = 1;
        m[1, 0] = p2.Y; m[1, 1] = p2.Z; m[1, 2] = 1;
        m[2, 0] = p3.Y; m[2, 1] = p3.Z; m[2, 2] = 1;

        double det1 = Matrix.Determinant3(m);

        m[0, 0] = p1.Z; m[0, 1] = p1.X; m[0, 2] = 1;
        m[1, 0] = p2.Z; m[1, 1] = p2.X; m[1, 2] = 1;
        m[2, 0] = p3.Z; m[2, 1] = p3.X; m[2, 2] = 1;

        double det2 = Matrix.Determinant3(m);

        m[0, 0] = p1.X; m[0, 1] = p1.Y; m[0, 2] = 1;
        m[1, 0] = p2.X; m[1, 1] = p2.Y; m[1, 2] = 1;
        m[2, 0] = p3.X; m[2, 1] = p3.Y; m[2, 2] = 1;

        double det3 = Matrix.Determinant3(m);

        return Math.Sqrt(det1 * det1 + det2 * det2 + det3 * det3) / 2;


    }
if(区域(p1、p2、p3)<1e-3)
Debug.WriteLine(“找到无效三角形!”);
公共双区(p1点、p2点、p3点)
{
double[,]m=新的double[3,3];
m[0,0]=p1.Y;m[0,1]=p1.Z;m[0,2]=1;
m[1,0]=p2.Y;m[1,1]=p2.Z;m[1,2]=1;
m[2,0]=p3.Y;m[2,1]=p3.Z;m[2,2]=1;
双det1=矩阵行列式3(m);
m[0,0]=p1.Z;m[0,1]=p1.X;m[0,2]=1;
m[1,0]=p2.Z;m[1,1]=p2.X;m[1,2]=1;
m[2,0]=p3.Z;m[2,1]=p3.X;m[2,2]=1;
双det2=矩阵行列式3(m);
m[0,0]=p1.X;m[0,1]=p1.Y;m[0,2]=1;
m[1,0]=p2.X;m[1,1]=p2.Y;m[1,2]=1;
m[2,0]=p3.X;m[2,1]=p3.Y;m[2,2]=1;
双det3=矩阵行列式3(m);
返回数学Sqrt(det1*det1+det2*det2+det3*det3)/2;
}

谢谢。

获得零面积的唯一方法是,如果点都是共线的

请尝试以下操作:

p1_p2_slope = (p2.y - p1.y) / (p2.x - p1.x);
p2_p3_slope = (p3.y - p2.y) / (p3.x - p2.x);
if(p1_p2_slope == p2_p3_slope) {
 // points are collinear
}

if(p1.x == p2.x && p1.y == p2.y) {
  // p1 and p2 overlap
}
if(p1.x == p3.x && p1.y == p3.y) {
  // p1 and p3 overlap
}
if(p3.x == p2.x && p3.y == p2.y) {
  // p3 and p2 overlap
}

只有当所有点都是共线的,才能得到零面积

请尝试以下操作:

p1_p2_slope = (p2.y - p1.y) / (p2.x - p1.x);
p2_p3_slope = (p3.y - p2.y) / (p3.x - p2.x);
if(p1_p2_slope == p2_p3_slope) {
 // points are collinear
}

if(p1.x == p2.x && p1.y == p2.y) {
  // p1 and p2 overlap
}
if(p1.x == p3.x && p1.y == p3.y) {
  // p1 and p3 overlap
}
if(p3.x == p2.x && p3.y == p2.y) {
  // p3 and p2 overlap
}
我想这样就行了

abs(dot(sub(b,a), cross(sub(c,b)))) < epsilon
abs(dot(sub(b,a),cross(sub(c,b)))
如果你想扩展它,我想它的工作原理如下:

abs((b.x - a.x) * (c.y - b.y) + (b.y - a.y) * (b.x - c.x)) < epsilon
abs((b.x-a.x)*(c.y-b.y)+(b.y-a.y)*(b.x-c.x))
我想这就行了

abs(dot(sub(b,a), cross(sub(c,b)))) < epsilon
abs(dot(sub(b,a),cross(sub(c,b)))
如果你想扩展它,我想它的工作原理如下:

abs((b.x - a.x) * (c.y - b.y) + (b.y - a.y) * (b.x - c.x)) < epsilon
abs((b.x-a.x)*(c.y-b.y)+(b.y-a.y)*(b.x-c.x))
零区域应由共线点或重叠点(如您所述)形成。那么为什么不检查这两种情况呢?我想要便宜得多。零面积应该是由共线点或重叠点形成的(正如你提到的)。那么为什么不检查这两种情况呢?我想便宜多了。
abs(dot(sub(b,a),cross(sub(c,b)))
对我来说似乎不正确,你能检查一下吗?
abs(dot(sub(b,a),cross(sub(c,b)))
对我来说似乎不正确,你能检查一下吗?我们不能使用所有这些精确的比较,斜率也可以是相反的,仍然表示一个无效的三角形。通过这些添加,代码的行数会增加,速度会变慢……我们不能使用所有这些精确的比较,斜率也可以相反,仍然表示无效的三角形。通过这些添加,这段代码的行数会增加,速度会变慢。。。