如何检查两条用户绘制的(波浪形)线是否相交?
How to check if two user-drawn (squiggly) lines intersect?
我正在考虑制作游戏的在线版本 Sprouts,可能会使用 JavaScript 网络浏览器图形库 p5.js
你可以阅读更多关于它的内容,但基本上有 2 名玩家用鼠标在点之间画线。线条可以是直线或以任何方式弯曲。规则之一是两条线不能交叉。
我还没有开始制作游戏,但提前计划,除了一个问题外,一切似乎都比较容易完成:
当用户画一条线时,我需要判断这条线是否与另一条线相交。但是,由于这些线不是线性的,也不是我习惯的任何数学方式,因此似乎没有一种简单的数学方法可以检查交叉点。
如果我知道线上每个像素的位置,我如何检查两条这样的线是否交叉?
很抱歉没有代码,我还没有开始。如果您希望在答案中包含代码,可以使用伪代码或您可能熟悉的任何图形用户界面编程。但是,我更喜欢一个纯粹假设的答案,因为一切都在这个阶段。
以下是我的一些想法:
- 对于线上的每个像素,我可以检查其他线上是否有相同位置的像素,在这种情况下它们会重叠。这似乎效率低下,所以下面的点是我想出的其他东西,它更有效但不那么严格和可靠。
- 在画线之前,如果你确定所有的线都是一种颜色,对于线上的每个像素,你可以检查这个像素是否已经被着色为与线的颜色相同的颜色,使用一些东西像
getPixel()
如果是这样,中止画线。这个解决方案似乎容易出现很多问题并且有点脆弱。
这两种解决方案要么以效率换取可靠性,要么以效率换取可靠性。您知道其他解决方案吗?请记住,这将 运行 在浏览器中,因此效率很重要。
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 条线的交点更相关,但它可能适用于您的问题。
我正在考虑制作游戏的在线版本 Sprouts,可能会使用 JavaScript 网络浏览器图形库 p5.js
你可以阅读更多关于它的内容,但基本上有 2 名玩家用鼠标在点之间画线。线条可以是直线或以任何方式弯曲。规则之一是两条线不能交叉。
我还没有开始制作游戏,但提前计划,除了一个问题外,一切似乎都比较容易完成:
当用户画一条线时,我需要判断这条线是否与另一条线相交。但是,由于这些线不是线性的,也不是我习惯的任何数学方式,因此似乎没有一种简单的数学方法可以检查交叉点。
如果我知道线上每个像素的位置,我如何检查两条这样的线是否交叉?
很抱歉没有代码,我还没有开始。如果您希望在答案中包含代码,可以使用伪代码或您可能熟悉的任何图形用户界面编程。但是,我更喜欢一个纯粹假设的答案,因为一切都在这个阶段。
以下是我的一些想法:
- 对于线上的每个像素,我可以检查其他线上是否有相同位置的像素,在这种情况下它们会重叠。这似乎效率低下,所以下面的点是我想出的其他东西,它更有效但不那么严格和可靠。
- 在画线之前,如果你确定所有的线都是一种颜色,对于线上的每个像素,你可以检查这个像素是否已经被着色为与线的颜色相同的颜色,使用一些东西像
getPixel()
如果是这样,中止画线。这个解决方案似乎容易出现很多问题并且有点脆弱。
这两种解决方案要么以效率换取可靠性,要么以效率换取可靠性。您知道其他解决方案吗?请记住,这将 运行 在浏览器中,因此效率很重要。
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 条线的交点更相关,但它可能适用于您的问题。