如何确定两个移动点何时彼此可见?

时间:2010-05-05 10:28:36

标签: math computational-geometry

假设我有两个点,Point1和Point2。在任何给定时间,这些点可能处于不同的位置 - 它们不一定是静态的。

Point1位于时间t的某个位置,其位置由连续函数x1(t)和y1(t)定义,在时间t给出x和y坐标。这些函数不是可微分的,它们是从线段分段构造的。

Point2是相同的,x2(t)和y2(t),每个函数具有相同的属性。

可能阻碍能见度的障碍是简单(和不动)多边形。

如何找到可见度的边界点?

即。有两种边界:点变得可见,变得不可见。

对于变为可见的边界i,存在一些ε> 0,使得对于任何实数a,a∈(i-ε,i),Point1和Point2是不可见的(即连接的线段{ {1}} (x1(a), y1(a))跨越了一些障碍)。

对于b∈(i,i +ε),它们是可见的。

这是变得不可见的另一种方式。

但是我能找到一个精确的边界,如果是这样,怎么样?

3 个答案:

答案 0 :(得分:2)

好的,我现在对这个问题有一个更清晰的了解,并且受@walkytalky建议的启发,这是一个更精细的答案。

您提到p1p2沿直线段行进。我不知道这些细分是否以某种方式对齐,以至于p1p2始终同时启动新细分。但是,您始终可以将线段切割为两个线段(具有相同的斜率),以便p1p2始终同时启动新的线段。

假设p1沿着A-B行旅行,p2沿C-D行进(同时),因为参数t从0变为1 (即,在t=0.5时,p1位于A-B中间,p2位于C-D中间。)

AxAy表示点A的x和y坐标(同样适用于BCD )我们可以通过以下方式将p1p2表达为t的函数:

p1(t) = (Ax + t*(Bx - Ax), Ay + t(By - Ay))
p2(t) = (Cx + t*(Dx - Cx), Cy + t(Dy - Cy))

(例如,当t=0Ax + t*(Bx - Ax)评估为Ax时,t=1评估结果为Bx时。)

要找到每个“a-vertex-by-between-p1-and-p2”-time,我们会执行以下操作:

对于每个障碍物顶点v=(Vx, Vy),我们需要找到t,以便p1(t)p2(t)v相互对齐。

这可以通过求解以下等式(两个等式,两个未知,tk)来完成:

Vx=p1(t).x + k*(p2(t).x - p1(t).x)
Vy=p1(t).y + k*(p2(t).y - p1(t).y)`

如果k介于0和1之间,则多边形顶点v实际上是 <扩展的A-B行和(扩展的){{之间的 1}}行。如果C-D也介于0和1之间,则顶点t实际上是在点沿着这些线段行进时v线传递的(因为p1-p2时,比方说,1.3,积分已经在新的细分市场上了。)

一旦计算出所有“a-vertex-by-between-p1-and-p2”时间,就可以轻松搞清楚其余部分。 (也就是说,弄清楚它是否是“变得在视线中”,“变得不可见”或“既没有”传递类型):

对于连续顶点遍历时间的所有对tt0,检查线t1是否没有多边形边的交点。如果它没有交叉点,那么点将在整个周期(p1((t1-t0)/2)-p2((t1-t0)/2))内看到,否则它们将在整个周期之外看不见(因为在此期间没有其他顶点通过)。 / p>

答案 1 :(得分:1)

check if two lines intersect很容易。用它来检查直线(p1,p2)和每个多边形边的交点。如果你有任何交叉点,那么线(p1,p2)会受到一些障碍的阻碍。

如果您需要一个时间间隔(p1和p2不在视线范围内),您可以对t的不同值(最好是相对较小的差异)以及“visible-t”和一个“不可见的”你可以进行二进制搜索,直到达到足够小的阈值,例如eps。

答案 2 :(得分:1)

仅当障碍物顶点位于Point1-Point2线段上时,才会发生可见性的变化。因此,计算所有此类顶点碰撞的次数。 (直观地说,这应该是一个相对简单的测试,因为端点是线性移动的,但是我需要实际检查它。我稍后会给它一个回去并回来。)

您现在有一个有限的碰撞时间。对于每一个,检查该段是否与任何其他障碍物边缘相交。如果是,则该边缘控制可见性,并且时间不是可见性边界。如果没有,您可以检查(t-ε)和(t +ε)的可见性,以确定变化的性质。

您需要在某些边缘情况下制定策略,例如当顶点位于连接线上以进行连续拉伸时。我认为这些可能都归结为点(和观察到的边缘)是否不透明的问题。

<强>更新

识别顶点碰撞的过程确实相当简单,它只涉及在t中求解一个稍微繁琐的二次方程。你需要为每个分段运动的每个顶点做这个,所以我猜对于n个顶点和m个时间段,成本将是 O(n * m)。 (如果位置函数的时间段不同步,则需要将它们细分为这样。)

仅考虑一个时间段,并将比例t设置在[0,1]范围内。每个位置函数在t中是线性的,因此定义x1(t) = x10 + x1m * t(即x10是起始值,x1m是渐变),y1(t)类似{{1} }和x2(t)。对于顶点y2(t),V位于连接点的线段上的时间(如果有)由等式V = (vx, vy)给出,其中:

At^2 + Bt + C = 0

(或者类似的东西。考虑到信封后面可能存在转录错误,我强烈建议在实施之前自己完成!)

如果这在[0,1]范围内有真正的解决方案,Bob就是你的叔叔。如果它减少到A = x1m * y2m - x2m * y1m B = vx * (y1m - y2m) + vy * (x2m - x1m) + x10 * y2m - x20 * y1m + y20 * x1m - y10 * x2m C = vx * (y10 - y20) + vy * (x20 - x10) + x10 * y20 + x20 * y10 或某些,那么整个时间点都在线上,在这种情况下你必须考虑你的政策。