C# 获取三角形内的所有点会导致溢出

C# 获取三角形内的所有点会导致溢出,c#,triangulation,tessellation,clipperlib,C#,Triangulation,Tessellation,Clipperlib,我缺少统一的GraphicsPath(填充多边形,用图形绘制它们,用图形勾勒它们),所以我自己实现它。嗯,我们也可以讨论哪一个是最好的选择,但实际上,我更喜欢这个,因为我学到了很多 想法如下,给定一个多边形,我们用ClipperLib做一个偏移多边形(向内和向外),然后用LibTessDotNet对其进行三角化,输出如下: 绿色、蓝色和黄色像素是每个三角形的边。LibTessDotNet输出此形状的501个三角形 因此,感谢我所做的: 三角形中的公共静态IEnumerable点(T pt1、T

我缺少统一的GraphicsPath(填充多边形,用图形绘制它们,用图形勾勒它们),所以我自己实现它。嗯,我们也可以讨论哪一个是最好的选择,但实际上,我更喜欢这个,因为我学到了很多

想法如下,给定一个多边形,我们用ClipperLib做一个偏移多边形(向内和向外),然后用LibTessDotNet对其进行三角化,输出如下:

绿色、蓝色和黄色像素是每个三角形的边。LibTessDotNet输出此形状的501个三角形

因此,感谢我所做的:

三角形中的公共静态IEnumerable点(T pt1、T pt2、T pt3)
其中T:IPoint
{
/*
// https://www.geeksforgeeks.org/check-whether-triangle-valid-not-sides-given/
a+b>c
a+c>b
b+c>a
*/
浮点a=向量2.距离(新向量2(pt1.x,pt1.y),新向量2(pt2.x,pt2.y)),
b=向量2.距离(新向量2(pt2.x,pt2.y),新向量2(pt3.x,pt3.y)),
c=向量2.距离(新向量2(pt3.x,pt3.y),新向量2(pt1.x,pt1.y));
//(新[]{pt1,pt2,pt3}).Distinct(新指针比较器()).Count()==0

如果(a+bOk,我解决了这个问题,问题是面积等于或小于1的三角形正在溢出。通过检查Heron公式,我解决了这个问题:

    public static float TriangleArea(Point p1, Point p2, Point p3)
    {
        float a, b, c;

        if (!CheckIfValidTriangle(p1, p2, p3, out a, out b, out c))
            return 0;

        return TriangleArea(a, b, c);
    }

    public static float TriangleArea(float a, float b, float c)
    {
        // Thanks to: http://james-ramsden.com/area-of-a-triangle-in-3d-c-code/

        float s = (a + b + c) / 2.0f;
        return Mathf.Sqrt(s * (s - a) * (s - b) * (s - c));
    }
然后:

        if (TriangleArea(pt1, pt2, pt3) <= 1)
            return;

if(三角形区域(pt1、pt2、pt3)你已经处理这项任务5个问题了。也许你必须把它分成几个类,并为它编写测试。你说的类是什么意思?如果你不能解决一个问题,也许你应该把它分成几个小部分。你可以为问题的每一小步编写测试,并确保你理解每一个边缘情况。然后你可以修复意外发生的问题。编写更小的方法,并将类似的方法移动到类中。这就是我实际所做的。首先我了解Clipper,然后我开始研究如何填充由此给出的偏移多边形。然后我发现了三角剖分,我尝试了几种解决方案,如Poly2Tri和Unity开发人员所做的一些,最后我找到LibTessDotNet,现在我正在尝试填充tesselation提供给我的三角形(填充偏移多边形)。我现在的主要问题是如何获取三角形中的所有点。但是,谢谢!^^^你能告诉我你在哪里调用此协同程序吗?你是在
Update
中的每一帧调用它吗?还是什么?确保只调用一次。
        if (TriangleArea(pt1, pt2, pt3) <= 1)
            return;