【问题标题】:Intersection between ray and rectangle射线与矩形的交点
【发布时间】:2012-02-26 03:00:20
【问题描述】:

在 C++ 中,在 2D 中,如何找到射线(由一个点和一个方向矢量定义)和一个矩形(由 x、y、w、h 定义)之间的交点?

                   ________
                  |        |
                  |        |
------------------|        |
                  |________|

这是一个基于非帧的模拟,所以我不太确定如何解决这个问题。

【问题讨论】:

    标签: c++ geometry


    【解决方案1】:

    您的光线由y=px+q 定义。将您的框定义为{R,B,L=R+w,T=B+h},这意味着右边缘与y=pR+q 相交; y=pL+q 的左边缘,x=(B-q)/p 的底部和 x=(T-q)/p 的顶部。

    要检查这些交点是否与定义框的线段一致,您必须分别检查 R <=x && x <= LB <= y && y <= T

    【讨论】:

      【解决方案2】:

      2D 矩形 = 4 条线段。

      所以你的问题实际上是:How do I determine whether or not two lines intersect, and if they do, at what x,y point?

      您计算所有线段的交点,然后根据|A-Xi| 选择闭合一个,其中A矢量原点Xi 是交点,|| 表示矢量的长度(sqrt(A.x*Xi.x + A.y*Xi.y),如果你只需要比较距离而不需要确切的数字,你实际上不需要使用sqrt())。

      【讨论】:

      • 链接的问题略有不同;线不是线段。此外,这显然是一个特殊情况,矩形没有与 w.r.t 成角度。主轴,即它不是♢
      • @MSalters 也许这不是他需要的确切答案,但我认为将矩形视为 4 线绝对是 2D 的方式(只要他不需要内部坐标只是边界/外部交点),这是他开始的好地方。如果您有更好解决方案的链接,我很乐意更新我的答案。
      • @MSalters 如果我的字典是正确的line = infinite line segment(或者如果你想要line segment = line with boundaries)并且检查真的很容易:if( (((p1.x >= x.x) && (p2.x <= x.x)) || ((p1.x <= x.x) && (p2.x >= x.x))) && (((p1.y >= x.y) && (p2.y <= x.y)) || ((p1.y <= x.y) && (p2.y >= x.y)))(我希望我得到了正确的索引),其中p1p2 是矩形线的端点,x 是交点。
      • 哦,这个解决方案行得通;这不是最有效的。
      • @MSalters 如果您有任何增强功能或您自己的解决方案,我将很高兴编辑或阅读您的答案,因为我现在无法想象更快的方法。也许当您使用参数线定义时,例如:y = px + q 但恐怕它会是一样的......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-14
      • 2014-12-06
      • 2014-07-27
      • 1970-01-01
      • 1970-01-01
      • 2014-06-09
      • 1970-01-01
      相关资源
      最近更新 更多