如何检查两条用户绘制的(波浪形)线是否相交?

How to check if two user-drawn (squiggly) lines intersect?

我正在考虑制作游戏的在线版本 Sprouts,可能会使用 JavaScript 网络浏览器图形库 p5.js

你可以阅读更多关于它的内容,但基本上有 2 名玩家用鼠标在点之间画线。线条可以是直线或以任何方式弯曲。规则之一是两条线不能交叉。

我还没有开始制作游戏,但提前计划,除了一个问题外,一切似乎都比较容易完成:

当用户画一条线时,我需要判断这条线是否与另一条线相交。但是,由于这些线不是线性的,也不是我习惯的任何数学方式,因此似乎没有一种简单的数学方法可以检查交叉点。

如果我知道线上每个像素的位置,我如何检查两条这样的线是否交叉?

很抱歉没有代码,我还没有开始。如果您希望在答案中包含代码,可以使用伪代码或您可能熟悉的任何图形用户界面编程。但是,我更喜欢一个纯粹假设的答案,因为一切都在这个阶段。

以下是我的一些想法:

这两种解决方案要么以效率换取可靠性,要么以效率换取可靠性。您知道其他解决方案吗?请记住,这将 运行 在浏览器中,因此效率很重要。

Keep in mind this will run in a browser, so efficiency is important.

您需要让自己更好地了解哪种 "efficiency" 对您和您的用户很重要。您概述的两种方法对我来说似乎都是合理的。在您尝试解决方案并衡量其性能之前,我不会假设解决方案效率低下。

退一步说,通常您需要将这些行存储在某种数据结构中。你说线不是数学的,但你可以把线分解成单独的线段或点,数学的。这可以是线段数组、布尔值的二维数组、点图或四叉树。有很多选择。然后你需要检查这些线或点与其他玩家添加的新线或点之间的碰撞。

要考虑的另一个选择是降低输入的分辨率 space。例如,也许您的游戏 window 是 500x500 像素,但您实际上只需要游戏板是 100x100 个可能的点位置。您可以将 100x100 的游戏板放大,使其显示为 500x500。这将改善您提出的任何解决方案的"efficiency"。

不过,我现在不会担心 "efficiency"。您提到的任何一种解决方案似乎都不错。让它工作,然后在发现问题时对其进行迭代。祝你好运。

可能 this article 来自 Mike Bostock 关于 Sutherland-Hodgman 算法的内容可能会让您感兴趣。它与 2 个多边形的交点而不是 2 条线的交点更相关,但它可能适用于您的问题。