下面的代码是我尝试三角测量。它输出错误的角度(它读取方形角度为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;
}
抱歉,我不知道为什么前几行没有计入代码。
答案 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