【问题标题】:Check parallel lines in line-line collsion检查线-线碰撞中的平行线
【发布时间】:2021-12-25 13:41:47
【问题描述】:

P1(x1,x2)、P2(x2,x2)等坐标定义了两条线。

如何检查两条线是否平行?在纸上你可以评估den 的值,当它为 0 时,线是平行的,但我如何在浮点算术中做到这一点?

bool Tema1::lineLine(float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4)
{
    
    float den = (y4 - y3) * (x2 - x1) - (x4 - x3) * (y2 - y1); 
   

    float numA = (x4 - x3) * (y1 - y3) - (y4 - y3) * (x1 - x3);
    float numB = (x2 - x1) * (y1 - y3) - (y2 - y1) * (x1 - x3);

    float uA = numA / den;
    float uB = numB / den;

    return uA >= 0 && uA <= 1 && uB >= 0 && uB <= 1;
}

如果我尝试将短线与长线进行比较,den 仍然会很大。

【问题讨论】:

  • 当您必须将两个数字相除并且分母可能为零或非常接近时,建议检查该条件以避免除以零NaN为结果。实际上,在这种特殊情况下,我会尽量避免除法重写std::signbit(numA)==std::signbit(den) &amp;&amp; std::fabs(numA)&lt;=std::fabs(den) &amp;&amp; ... 之类的条件。顺便说一句,所有这些局部变量都可以是const

标签: c++ math geometry 2d glm-math


【解决方案1】:

den 与两个段的长度平方和进行比较

float den = (y4 - y3) * (x2 - x1) - (x4 - x3) * (y2 - y1); 
float cmp = (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1) + 
            (x4 - x3) * (x4 - x3) + (y4 - y3) * (y4 - y3); 
if (abs(den)/cmp < 1e-10) //or another eps value
     parallel  

【讨论】:

  • 嗯,这是为什么呢?我真的无法理解。
  • 想象线段的初始点确实重合。在这种情况下,den 是由线段形成的三角形面积的两倍。如何显示角度接近零且三角形太窄?将面积与直角三角形的两倍面积进行比较 - 段长度的乘积。为了避免平方根计算,我们可以取平方长度的总和——它具有相同的数量级(不是精确值)。但是您可以根据需要计算段长度的乘积。
猜你喜欢
  • 1970-01-01
  • 2014-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-09
  • 2010-11-07
  • 1970-01-01
相关资源
最近更新 更多