多边形算法

时间:2015-01-14 16:47:38

标签: algorithm math geometry polygon

Circle Path

我试图编写一个通用算法,可以从一个已知路径(绿线)后面的圆圈(红线)扫描的区域中找到一个多边形,并且当它移动时圆圈变大沿着已知路径往下走。基本上,有人能指出我解决这个问题的方向吗,拜托?我无法确定哪条切点是路径上任何点(也就是圆圈)的多边形的一部分。

感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

嗯,最简单的方法是通过路径为线性的小段来近似路径,并使圆圈线性增长。

您的线段和角度可能很小,但为了示例,让我们采用更大(更明显)的角度。

points construction

浏览几何

多边形边缘的粗线是两个圆的切线。注意,并不总是接近由圆与路径的正交线之间的交叉所定义的线,尤其是具有更强的生长速度。参见下图,其中(AB)是路径,我们想要(OE)和(OF)线,但不是(MN)线,例如:

Tangentes common to 2 circles

第一步是确定点O.它是唯一一个在两个圆之间定义homothetic transformation的点,具有正比率。

因此ratio = OA/OB = (radius C) / (radius C')O = A + AB/(1-ratio)

现在让u成为从O到A的矢量归一化,v是与u正交的矢量(让我们从A到M的方向)。

让我们调用a从O到E的向量归一化,以及beta角度EOA。然后,因为(OE)和(AE)是垂直的,sin(beta) = (radius C) / OA。我们还有标量积a.u = cos(beta),因为a的范数为1,a = u * cos(beta) + v * sin(beta)

然后很容易就是b从O到F的向量归一化,b = u * cos(beta) - v * sin(beta)

由于beta是一个小于90°的角度(否则圆圈的增长会比它前进快得多,第二个圆圈完全包含第一个圆圈),我们知道{{1} }。

伪代码解决方案

对于第一个和最后一个圆圈,你可以做一些更接近它们的东西 - 为了简单起见,我只是想使用我正在构建的线条与正交于该圆线的圆的切线之间的交点。第一个(或最后一个)路径,如本文第一张图所示。

沿着路径,您可以通过缩小细分来使多边形任意接近真实扫掠区域。

另外,我假设你有一个函数cos(beta) > 0,给定两条线的两个参数方程,返回它们之间的交点。首先,看它们是否平行(它们永远不应该是平行的)是很容易的,它可以很容易地表示垂直线。

find_intersection

答案 1 :(得分:0)

假设中心沿着正x轴,并且包络线是y = mx且y = -mx,对于某些m> 0。 distance from (x,0) to y=mx是mx / sqrt(1 + m ^ 2)。因此,如果半径以沿m轴移动的距离的m / sqrt(1 + m ^ 2)倍的速率增加,则包络线为y = mx且y = -mx。

反过来,如果你把半径为cx的圆放在(x,0)的中心,那么c = m / sqrt(1 + m ^ 2)所以

m = c/sqrt(1-c^2). 

如果c = 1则得到一条垂直线,如果c> 1则平面中的每个点都包含在某个圆圈中。

这就是你如何判断一个超音速物体从受干扰介质的包络Mach angle移动的速度。

您可以将其旋转到非水平线。使用角度公式mu = arcsin(c)可能会有所帮助,其中mu是包络和路径之间的角度,马赫数是1 / c。