二维多边形三角剖分

时间:2010-05-30 15:23:40

标签: c++ windows geometry 2d

下面的代码是我尝试三角测量。它输出错误的角度(它读取方形角度为90,90,90,176)并绘制错误的形状。我做错了什么?

//use earclipping to generate a list of triangles to draw
std::vector<vec> calcTriDraw(std::vector<vec> poly)
{
    std::vector<double> polyAngles;
    //get angles
    for(unsigned int i = 0;i < poly.size();i++)
    {

        int p1 = i - 1;
        int p2 = i;
        int p3 = i + 1;

        if(p3 > int(poly.size()))
            p3 -= poly.size();
        if(p1 < 0)
            p1 += poly.size();

        //get the angle of from 3 points
        double dx, dy;
        dx = poly[p2].x - poly[p1].x;
        dy = poly[p2].y - poly[p1].y;
        double a = atan2(dy,dx);

        dx = poly[p3].x - poly[p2].x;
        dy = poly[p3].y - poly[p2].y;
        double b = atan2(dy,dx);
        polyAngles.push_back((a-b)*180/PI);
    }
    std::vector<vec> triList;
    for(unsigned int i = 0;i < poly.size() && poly.size() > 2;i++)
    {
        int p1 = i - 1;
        int p2 = i;
        int p3 = i + 1;

        if(p3 > int(poly.size()))
            p3 -= poly.size();
        if(p1 < 0)
            p1 += poly.size();

        if(polyAngles[p2] >= 180)
        {
            continue;
        }
        else
        {
            triList.push_back(poly[p1]);
            triList.push_back(poly[p2]);
            triList.push_back(poly[p3]);
            poly.erase(poly.begin()+p2);
            std::vector<vec> add = calcTriDraw(poly);
            triList.insert(triList.end(), add.begin(), add.end());
            break;
        }
    }

    return triList;
}

抱歉,我不知道为什么前几行没有计入代码。

2 个答案:

答案 0 :(得分:0)

如果是&gt; = poly.size(),则需要减少p3,而不仅仅是&gt;。

编辑:要测试的python代码

#!/usr/bin/python
import math
p = ((0,0),(0,1),(1,1),(1,0))
for i in xrange(4):
   p1 = (i + 3) % 4
   p2 = i
   p3 = (i + 1) % 4
   a = math.atan2(p[p2][1] - p[p1][1], p[p2][0] - p[p1][0])
   b = math.atan2(p[p3][1] - p[p2][1], p[p3][0] - p[p2][0])
   print (a-b)*180/math.pi

并运行它:

$ ./tmp.py 
90.0
90.0
90.0
-270.0

答案 1 :(得分:0)

您没有正确评估角度。

查看代码中的代码段以及此图片。

在图片中有两种不同的情况。 第一个,当多边形位于点P1,P2,P3(然后角度= 135度)之上,第二个情况是它在这些点之下(然后角度= 225度),但是你的代码将评估相同的角度在这两种情况下。

    //get the angle of from 3 points
    double dx, dy;
    dx = poly[p2].x - poly[p1].x;
    dy = poly[p2].y - poly[p1].y;
    double a = atan2(dy,dx);

    dx = poly[p3].x - poly[p2].x;
    dy = poly[p3].y - poly[p2].y;
    double b = atan2(dy,dx);
    polyAngles.push_back((a-b)*180/PI);

alt text http://www.freeimagehosting.net/uploads/28a3a66573.png