确定具有给定内角的多边形边

时间:2019-05-11 22:32:57

标签: java javafx

我制作了以下图片以帮助可视化问题:

Image

您可以通过旋转猴子来控制猴子。您可以进入neigbour字段,但是在计算哪个字段时需要解决问题。

猴子有一个角度,从0到360度下降,0表示头朝上。我想从这个角度计算近场。 (基本上,该字段是猩猩“看”的地方)。 我存储了neigbours,也存储了每个多边形的顶点。

我尝试了以下想法:

从猩猩开始半条线,然后计算与多边形各边的交点。如果我们有一个交集,那么我们知道两个端点。然后搜索neigbour字段,如果其中之一在其顶点上都具有两个点,那么这是个好地方。

Equations

这是我编写的代码:

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;
    }

但是我没有得到正确的结果,我不知道问题出在哪里。

0 个答案:

没有答案