向相反方向移动点

时间:2017-12-09 20:49:25

标签: java geometry

我正在开发一个Java项目。我正在尝试将点p2p3p4移动到圆的圆周之外,与点p1的方向相反。下面是图像,描述了我正在努力解决的问题。

Moving Points to the edge of the circle

//given two points, calculates the angle
public static double calcAngle(Point2D.Double p1, Point2D.Double p2) {
    double deltaX = p2.x - p1.x;
    double deltaY = p2.y - p1.y;
    return (Math.atan2(deltaY, deltaX) * 180 / Math.PI);
}

//calculates a point on a circle given the angle, center of the circle and the radius
public static Point2D.Double pointOnCircle(Point2D.Double point, double radius , double angle) {
    double x = Math.abs(point.x + (radius * Math.cos(angle  * Math.PI / 180F)));
    double y = Math.abs(point.y + (radius * Math.sin(angle  * Math.PI / 180F)));
    return new Point2D.Double(x,y);
}

如何计算每个点p2p3p4的Java坐标系和目标坐标的角度?

我还没有尝试上面的代码,想知道我的方法在继续之前是否正确,因为它是更大项目的一部分。提前谢谢!

1 个答案:

答案 0 :(得分:1)

你的总体想法似乎可行,但过于复杂。无需将x / y-vector转换为角度然后返回。只需缩放矢量即可。

Point2D p = p2; // likewise for p3, p4
double factor = radius / p.distance(p1);
p.setLocation(p1.getX() + (p.getX() - p1.getX())*factor,
              p1.getY() + (p.getY() - p1.getY())*factor);

这会将向量(p - p1),即从p1指向p的向量,按factor进行缩放,并将其添加到p1的位置。选择factor以使新距离等于radius

如果p1p相同,则所有这些都会失败,因为在这种情况下,您将除以零。如果这对您来说可能有问题,您可能需要确保factor是有限数字,例如使用Double.isFinite(double)