代码之家  ›  专栏  ›  技术社区  ›  NateS user1274193

圆内矢量圆上的交集

  •  3
  • NateS user1274193  · 技术社区  · 15 年前

    我有一个圆圈。圆圈内有一个点。我有一个从这一点开始的向量。我想知道这个向量与圆上的哪个点相交。这是一张图纸:

    http://n4te.com/temp/circle.png http://n4te.com/temp/circle.png

    红点是我试图确定的点。

    我知道这些东西:圆心,向量的原点,向量的方向。

    我知道这是基本的东西,但我还是有麻烦。大多数的谷歌给我带来了线圆碰撞,这是相关的,但不完全相同。感谢您提供的帮助!

    2 回复  |  直到 15 年前
        1
  •  11
  •   Anton Tykhyy    15 年前

    Elementary vector algebra .

    O — center of circle (vector)
    r — its radius       (scalar)
    A — origin of ray    (vector)
    k — direction of ray (vector)
    

    解决 (A + kt - O)² = r² 标量 t ,选择正根,然后 A + kt 这就是你的观点。

    进一步解释:

    . dot product ,对于向量,是向量与其自身的点积。扩展LHS

    (A + kt - O)² = (A - O)² + 2(k.(A - O))t + k²t².
    

    二次方是 k²t² + 2(k.(A - O))t + (A - O)² - r² = 0 . 就你的变量而言,这就变成了 (rayVX² + rayVY²)t² + 2(rayVX(rayX - circleX) + rayVY(rayY - circleY))t + (rayX - circleX)² + (rayY - circleY)² - r² = 0 .

        2
  •  7
  •   NateS user1274193    15 年前

    非常感谢Anton Tykhyy的详细回答。这就是由此产生的Java代码:

    float xDiff = rayX - circleX;
    float yDiff = rayY - circleY;
    float a = rayVX * rayVX + rayVY * rayVY;
    float b = 2 * (rayVX * (rayX - circleX) + rayVY * (rayY - circleY));
    float c = xDiff * xDiff + yDiff * yDiff - r * r;
    float disc = b * b - 4 * a * c;
    if (disc >= 0) {
        float t = (-b + (float)Math.sqrt(disc)) / (2 * a);
        float x = rayX + rayVX * t;
        float y = rayY + rayVY * t;
        // Do something with point.
    }