我尝试找到" Line Segment Crossings"。所以我希望下面的函数只有在两条线真正相互交叉时才返回true,而不是它们在相同的点上开始/结束。从我读到的内容来看,似乎有一种琐事"数学上的解决方案,但无论如何提到这一点,它并没有真正以我能理解的方式解释。
以下是正确检测细分交叉的功能,包括"触摸"点。有没有一种简单的方法可以根据我的需要进行修改?
真的很感谢你的帮助!
inline double Dot(sf::Vector2f a, sf::Vector2f b) { return (a.x*b.x) + (a.y*b.y); }
inline double PerpDot(sf::Vector2f a, sf::Vector2f b) { return (a.y*b.x) - (a.x*b.y); }
static bool LineCollision(const sf::Vector2f A1, const sf::Vector2f A2,
const sf::Vector2f B1, const sf::Vector2f B2,
double* out = 0)
{
sf::Vector2f a(A2 - A1);
sf::Vector2f b(B2 - B1);
double f = PerpDot(a, b);
if (!f) // lines are parallel
return false;
sf::Vector2f c(B2 - A2);
double aa = PerpDot(a, c);
double bb = PerpDot(b, c);
if (f < 0)
{
if (aa > 0) return false;
if (bb > 0) return false;
if (aa < f) return false;
if (bb < f) return false;
}
else
{
if (aa < 0) return false;
if (bb < 0) return false;
if (aa > f) return false;
if (bb > f) return false;
}
if (out)
*out = 1.0 - (aa / f);
return true;
}
答案 0 :(得分:0)
要排除细分受众群结束,请将所有内部<
中的严格比较>
和if's
更改为<=
和>=
,如下所示:
if (aa >= 0) return false;