曲线与没有明显方程的直线之间的碰撞检测

问题描述

我正在使用Perlin噪波创建2d景观。什么是最简单/最有效的方法来执行以下操作:

如果我在Perlin噪声线上方选择任意点,然后提供一个向量/方向,如何确定给定方向上是否有一条线从该点出来:

a。碰线?

b。如果它接触到直线,则从原始点到直线与Perlin噪声线碰撞的点的距离是多少?

如果它是直线,我知道该怎么做,但事实并非如此。顺便说一句,我正在使用pygame进行此操作,因此,如果可以使用任何pygame特定的功能,那将很棒。

图表:

很抱歉,我无法提供有关Perlin噪音细节的任何详细信息,但仍在开发中。

由于我在像素级上工作,因此我认为检查噪声的每个x值都不可行,因此可能会发生以下情况:

enter image description here

在这种情况下,粉红色代表我要测试的线,蓝色代表我的Perlin噪点的像素图。在这种情况下,检查每个值都将无法产生正确的结果

有人问了一个Perlin噪声的例子,一个点的x值是列表的索引,y的值是list[x]

噪音:

[0.0,1.2950474273729242,2.302306537551865,3.021777330536823,3.4534598063277975,3.597353964924789,0.0,3.910627653655182,6.952226939831434,9.124797858528757,10.428340409747152,10.862854593486615,3.9106276536551814,2.3925761696810253,4.253468746099601,5.5826777292557255,6.3802031191494,6.646044915780626,2.3925761696810257,-0.0,-1.3453317543307322,-2.3917008965879676,-3.1391074267717074,-3.5875513448819514,-3.7370326509187,-3.139107426771708,-1.345331754330732,1.9499487707658063,3.4665755924725437,4.549880465120213,5.199863388708816,5.4165243632383495,1.9499487707658059,2.025500578709133,3.6008899177051252,4.726168016987977,5.401334876557688,5.626390496414258,1.71832580933312]

例如,第一个点是(0,0),第二个点是(1,1),第三个点是(2,2)BTW我四舍五入到最接近的整数。

解决方法

通过线段相交检查进行二进制搜索似乎可行。

在角线的相对两侧绝对拾取两个点(如果需要对角线进行相同的操作,则在噪声的相对侧绝对拾取两个点)。确认两个线段相交。然后在这些点之间选择一个点(可能仅可以使用均值(X1+x2)/2,(Y1+Y2)/2)来检查线段,看它们是否也交叉。丢弃不相交的线段与角线相交的线段。对两个细分市场都执行此操作(这样您就可以越来越靠近双方)。

唯一的问题是,如果有多个相交点。尽管在这种情况下,您可以根据需要将单个二进制搜索分成两个二进制搜索,直到找到所有相交点,或者您觉得最有意义的东西。