【问题标题】:Calculate if line, defined by 2 coordinates, intersects circle计算由 2 个坐标定义的线是否与圆相交
【发布时间】:2020-01-21 08:49:47
【问题描述】:

我正在尝试获取一个函数来计算由 2 个坐标定义的线是否与由坐标和半径定义的圆相交。我之前用过这两个函数

getLineEquation(point1, point2) {
    var lineObj = {
        gradient: (point1.latitude - point2.latitude) / (point1.longitude - point2.longitude)
    };

    lineObj.yIntercept = point1.latitude - lineObj.gradient * point1.longitude;

    return lineObj;
}

checkIntercept(y, m, circle) {
    // y: y intercept of line
    // m: gradient of line

    // get a,b,c values
    var a = 1 + (m * m);
    var b = -circle.longitude * 2 + (m * (y - circle.latitude)) * 2;
    var c = (circle.longitude * circle.longitude) + ((y - circle.latitude)* (y - circle.latitude)) - (circle.range * circle.range);

    // get discriminant
    var d = (b * b) - 4 * a * c;
    if (d >= 0) {
        // insert into quadratic formula
        var intersections = [
            (-b + Math.sqrt((b * b) - 4 * a * c)) / (2 * a),
            (-b - Math.sqrt((b * b) - 4 * a * c)) / (2 * a)
        ];
        if (d == 0) {
            // only 1 intersection
            return [intersections[0]];
        }
        return intersections;
    }
    // no intersection
    return false;
}

但这不起作用,因为它将 2 个点转换为一条无限线,我不希望这样做,因为它会为实际上不在 2 个点之间的圆返回错误的读数。

我怎样才能修复这些函数以使计算变成一条有限的线?

【问题讨论】:

  • 等等,上下文。我们是在谈论平面几何,还是在谈论球体,因为有两个点定义的不是一条线,而是无限个可能的圆。

标签: javascript math coordinates


【解决方案1】:

这是一种可能的方法。

  • 如果两个顶点中的一个在圆内,另一个在圆外,那么就会有一个交点。 (这意味着两次距离计算。)

  • 如果两个顶点都在圆内,则不存在交点。

  • 如果前两个步骤不是决定性的,则找到 s,即圆心到线 (p,q) 的 projection

    • 如果s到圆心的距离大于半径,则不存在交集。
    • 否则,如果 s 在 a 和 b 之间(所以 s_x 在 p_x 和 q_x 之间,还有 s_y 在 p_y 和 q_y 之间,以包括水平和垂直边缘的情况),则存在交集,否则不存在。李>

要在一条线上投影一个点,您基本上可以用dx = qx - pxdy = qy - py 为两个点(px,py)(qx,qy) 制作一个形式为(px,py) + t * (dx,dy) 的线方程。那么通过点(cx,cy) 的垂线是(cx,cy) + t * (-dy,dx)。设置两个方程相等可以找到交点。

或者,如果您更喜欢直接公式:

sx = (d*px + (px - qx)*((cx - px)*(px - qx) + (cy - py)*(py - qy)))/d
sy = (d*py + (py - qy)*((cx - px)*(px - qx) + (cy - py)*(py - qy)))/d
   with
d = (px - qx)^2 + (py - qy)^2

【讨论】:

  • 你是否成功地让它在你的情况下工作?
猜你喜欢
  • 2012-05-21
  • 1970-01-01
  • 1970-01-01
  • 2014-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多