gpt4 book ai didi

algorithm - 胶囊 - 射线(线段)相交,2D

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:09:09 26 4
gpt4 key购买 nike

我正在我的游戏中编写 C++ 碰撞检测程序,并试图提出一种算法:我有一个由两个中心点(C1、C2)、长度和半径定义的胶囊。然后我有一条用两点(R1,R2)定义的射线。我已经知道它们相交了。我只需要找到包含在胶囊 (H1-H2) 中的射线的内部部分。预先感谢您提供的所有帮助。

image

最佳答案

首先我们来看一张图,以供引用:

enter image description here

计算H1的程序和 H2如下:

  1. 计算射线 R 之间的交点(如果有的话)和线段 P1P2 .我们只对位于的十字路口感兴趣在 P1P2 的内部.同样对于 P3P4 .积分P1P4可以很容易地从圆心计算,C1C2和一些矢量数学。例如。 P1 = C1 + r*nC , 其中nC是来自 C1 的单位向量的法线 (CCW)至 C2 .这 answer在 SO 上提供了必要的数学来确定是否两条线段之间存在交点,如果存在,则计算参数 h , 这样的那H=R1+h(R2-R1) , 其中H是交点。此步骤可以产生 0、1 或 2 个有效 h值,取决于光线是否不与 P1P2 相交,与一个或两个相交, P3P4 .
  2. 计算射线和 2 个中的每一个之间的交点(如果有的话)界。同样,SO answer提供必要的数学射线到圆形交点。每个圆圈可以产生 0、1 或 2交叉点,再次以参数化方式表示。
  3. 如果没有有效 h值是从步骤 1 和 2 生成的,然后射线不与胶囊相交。否则,计算hMinhMax ,所有有效的最小和最大参数值在步骤 1 和 2 中标识的交叉点。请注意,hMin==hMax 可能是, 在光线与其中一个圆相切且不相交的情况下 P1P2P3P4 .所需的交叉点现在可以计算为 H1=R1+hMin(R2-R1)H2=R1+hMax(R2-R1) .

恐怕我选择的语言是 Java 而不是 C++,但希望您会发现我整理的代码 ( IDEOne ) 作为引用很有用。请注意,我们没有努力处理因 double 的舍入而导致的稳健性问题。计算期间的值。

关于algorithm - 胶囊 - 射线(线段)相交,2D,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52460308/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com