【问题标题】:What could be wrong with my function for finding a solution for circle-line collision?我的寻找圆线碰撞解决方案的功能可能有什么问题?
【发布时间】:2017-10-03 15:35:23
【问题描述】:

所以我正在研究一个简单的函数,在该函数中,您提供一个点和一个角度以及圆的半径,线相交,然后您返回一个交点。由于一些非常未知的原因,我没有得到预期的 x 位置? 我对 x 位置的计算基于:http://mathworld.wolfram.com/Circle-LineIntersection.html

根据 Desmos 的说法,如果你们中的任何人都能做到这一点,我会非常满意,但要让你的函数吐出在这种情况下预期的 x 位置,一种解决方案为 -27.386,另一种解决方案为 27.386图形计算器。

该点为 (-70, -40.415),角度为 PI/6,圆半径为 sqrt(1000)。使用此信息,您应该能够获得两个 x 解决方案。

我的代码:

function sgn(x) {
    return x < 0 ? -1 : 1;
}

function findPointOfCollision(p, t, r) { // p -> point, t -> theta, r -> radius
    p2 = [p[0] + 200*Math.cos(t), p[1] + 200*Math.sin(t)]; // Another point in the line given by point and angle

    let x1 = p[0];
    let y1 = p[1];

    let x2 = p2[0];
    let y2 = p2[1];

    let dx = x2 - x1;
    let dy = y2 - y1;

    let dr = Math.sqrt(dx*dx + dy*dy);
    let D = x1*y2 - x2*y1;

    let x = (D*dy + sgn(dy)*dx*Math.sqrt(r*r*dr*dr - D*D))/dr*dr;

    return [x]; // Only need the x position for the collision point atm
}



function start () {
    console.log(findPointOfCollision([-70, -40.415], Math.PI/6, 31.6227766017));
}

【问题讨论】:

  • 圆的中心在哪里? (0,0)p?
  • .../dr*dr -- 你想要.../(dr*dr).../dr/dr 这里。
  • @Michał 中心在 (0, 0) 是对的
  • @MOehm 我不知道如何感谢你只是帮助我意识到我知道的一些事情,但没有看到让我整整一周的沮丧......我很尴尬!谢谢!
  • 这些小东西你可以盯着看很久,直到第一个出现的人立即看到。 :) 同时我已经写了一个正确的答案,所以如果你想感谢我,你可以接受。

标签: algorithm line collision geometry intersection


【解决方案1】:

您的算法是正确的,但是当您除以 dr² 时,最后一个公式中有错误:A/dr*dr 表示 (A/dr)*dr,这实际上抵消了除法。您必须在此处的分母周围加上括号:A/(dr*dr)

当我将x 的公式更改为:

    let x = (D*dy + sgn(dy)*dx*Math.sqrt(r*r*dr*dr - D*D)) / (dr*dr);

我得到的期望值约为 27.386。

【讨论】:

  • 我得到了正确的结果老兄,再次非常感谢!给你声誉:)
猜你喜欢
  • 1970-01-01
  • 2023-01-13
  • 1970-01-01
  • 1970-01-01
  • 2012-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多