6

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

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

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

可能妨碍可见性的障碍是简单的(和固定的)多边形。

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

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

(x1(a), y1(a))对于变得可见的边界 i,存在一些 ϵ>0,因此对于任何实数 a,a ∈ (i-ϵ, i) ,Point1 和 Point2 不可见(即连接到的线段(x2(a), y2(x))穿过一些障碍物)。

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

而对于变得不可见,情况正好相反。

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

4

3 回答 3

2

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

您提到了这一点p1p2沿着直线段行驶。我不知道这些段是否以某种方式对齐,使得两者p1总是同时p2开始新的段。但是,您始终可以将一条线段切割成两条线段(具有相同的斜率),以便它们始终p1同时p2开始新的线段。

假设p1沿线行进A-B,并且p2(同时)随着C-D参数t从 0 到 1 行进。(即,在时间t=0.5p1在 的中间A-Bp2中间C-D。)

通过让AxAy表示点的 x 和 y 坐标A(类似地对于B,CD),我们可以将p1和表示为以下方式的p2函数: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-is-passing-by-between-p1-and-p2”时间,我们执行以下操作:

对于每个障碍物顶点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线和(延伸)C-D线之间。如果t也介于 0 和 1 之间,则在点沿这些线段行进期间,顶点v实际上是通过线的(从什么时候开始,例如,1.3,点将已经在新线段上)。p1-p2t

一旦计算了所有“a-vertex-is-passing-by-between-p1-and-p2”-times,找出其余部分是一项简单的任务。(也就是说,弄清楚它是“看不见”、“看不见”还是“两者都不是”的传球类型):

对于所有对t0t1连续的顶点通过时间,您检查该线p1((t1-t0)/2)-p2((t1-t0)/2)是否与多边形边缘没有交点。如果没有交点,则这些点将在整个周期内都在视线内(t0-t1),否则它们将在整个周期内都看不见(因为在此时间段内没有经过其他顶点)。

于 2010-05-05T13:55:13.810 回答
1

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

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

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

更新

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

只考虑一个时间段,并将 t 缩放到 [0,1] 范围内。每个位置函数在 t 中是线性的,因此定义x1(t) = x10 + x1m * t(即,x10是起始值,x1m是梯度),对于y1(t),x2(t)和也是类似的y2(t)。对于顶点V = (vx, vy),V 位于连接点的线段上的时间(如果有)由方程 给出At^2 + Bt + C = 0,其中:

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

(或类似的东西。考虑到信封背面的转录错误的可能性,我强烈建议您在实施之前自行解决!)

如果这在 [0,1] 范围内有一个真正的解决方案,那么 Bob 就是你的叔叔。如果它减少到0 = 0或某种程度,那么问题就一直在线,在这种情况下,您必须考虑您的政策。

于 2010-05-05T12:00:07.603 回答
1

很容易检查两条线是否相交。使用它来检查线 (p1, p2) 和每个多边形边缘的交点。如果您有任何交叉点,则 (p1, p2) 线被一些障碍物阻挡。

如果您需要一个时间间隔(此时 p1 和 p2 不在视线范围内),您可以执行上述检查不同的 t 值(最好具有相对较小的差异),以及“可见 t”和“不可见”之间-t" 您可以进行二分搜索,直到达到足够小的阈值,例如 eps。

于 2010-05-05T10:38:47.853 回答