我制作了以下图片以帮助可视化问题:
您可以通过旋转猴子来控制猴子。您可以进入neigbour字段,但是在计算哪个字段时需要解决问题。
猴子有一个角度,从0到360度下降,0表示头朝上。我想从这个角度计算近场。 (基本上,该字段是猩猩“看”的地方)。 我存储了neigbours,也存储了每个多边形的顶点。
我尝试了以下想法:
从猩猩开始半条线,然后计算与多边形各边的交点。如果我们有一个交集,那么我们知道两个端点。然后搜索neigbour字段,如果其中之一在其顶点上都具有两个点,那么这是个好地方。
这是我编写的代码:
public Field getNeighbourByAngle(double angle) {
// Field center
Point2D c = center;
// New point initial coordinates
double x = c.getX(); double y = c.getY()+1;
// Rotate the point by the angle
Point2D rotatedPoint = new Point2D(
-(x*Math.cos(Math.toRadians(angle)) - y*Math.sin(Math.toRadians(angle))),
y*Math.cos(Math.toRadians(angle)) + x*Math.sin(Math.toRadians(angle)) );
// Get the vector from the center to the roteted point
Point2D v = rotatedPoint.subtract(c);
// Iterate over the vertex arraylist
for (int i = 0; i<verts.size(); i++) {
// Get the two endpoints
Point2D p1 = verts.get(i);
Point2D p2;
if (i == verts.size() - 1) {
p2 = verts.get(0);
} else { p2 = verts.get(i+1);}
// Calculate the intersection
// Using the formula:
// x = c.x + v.x * t
// x = p1.x * (1-t) + p2.x * t
// These two are equals, get t from the equation:
double t = ( p1.getX() - c.getX( )) / (v.getX() + p1.getX() - p2.getX() );
// t has to be between [0, 1] because p1 <-> p2 is just a line segment
if (0 <= t && t<= 1) {
// Iterate over the neigbours
for (int j = 0; j<neighbours.size(); j++) {
// If the neigbour has both p1 and p2 in its vertices list, then we found the correct neigbour.
if (neighbours.get(j).getVerts().contains(p1) &&
neighbours.get(j).getVerts().contains(p2)) {
return neighbours.get(j);
}
}
}
}
return null;
}
但是我没有得到正确的结果,我不知道问题出在哪里。