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

Math 如何确定两个移动点何时彼此可见?,math,computational-geometry,Math,Computational Geometry,假设我有两点,点1和点2。在任何给定的时间,这些点可能位于不同的位置——它们不一定是静态的 点1位于时间t的某个位置,其位置由给出时间t的x和y坐标的连续函数x1(t)和y1(t)定义。这些函数是不可微的,它们是由线段分段构造的 点2是相同的,具有x2(t)和y2(t),每个函数具有相同的属性 可能妨碍可见性的障碍物是简单(且不可移动)多边形 如何找到可见性的边界点 i、 有两种边界:一种是点可见的边界,另一种是不可见的边界 对于变得可见的边界i,存在一些ϵ>0,这样对于任何实数a,a∈ (i-

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

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

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

可能妨碍可见性的障碍物是简单(且不可移动)多边形

如何找到可见性的边界点

i、 有两种边界:一种是点可见的边界,另一种是不可见的边界

对于变得可见的边界i,存在一些ϵ>0,这样对于任何实数a,a∈ (i-ϵ,i)、点1和点2不可见(即连接
(x1(a)、y1(a))
(x2(a)、y2(x))
的线段穿过一些障碍物)

为了b∈ (i,i+ϵ)它们是可见的

这是另一种让人看不见的方式

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

很容易找到。使用此选项检查直线(p1、p2)和每个多边形边的交点。如果有任何交叉点,线(p1,p2)会被一些障碍物阻挡


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

只有当障碍物顶点位于点1-2线段上时,才能发生可见性变化。因此,计算所有此类顶点碰撞的时间。(直观地说,这应该是一个相对简单的测试,因为端点是线性移动的,但我需要实际完成它以进行检查。我稍后会尝试并返回。)

您现在有了一组有限的碰撞时间。对于每个障碍物,检查线段是否与任何其他障碍物边相交。如果是,则该边控制可见性,而时间不是可见性边界。如果没有,可以检查(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位于连接点的线段上的时间(如有)由^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 或多个,那么这一点就在整个时间线上,在这种情况下,你必须考虑你的策略。

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

您提到了
p1
p2
沿直线段移动。我不知道这些段是否对齐,使得
p1
p2
始终同时启动新段。但是,始终可以将一条线段切割为两条线段(具有相同的坡度),以便
p1
p2
始终同时启动新线段

假设
p1
沿着线
A-B
移动,
p2
沿着线
C-D
移动(同时),因为参数
t
从0变为1。(即,时间<代码> t=0.5 < /代码>,<代码> p1 < /代码>位于<代码> -Ab和<代码> P2 < /代码>中的代码> C-D )

通过让
Ax
Ay
表示点
A
的x和y坐标(同样对于
B
C
D
),我们可以用以下方式将
p1
p2
表示为
t
的函数:

p1(t) = (Ax + t*(Bx - Ax), Ay + t(By - Ay))
p2(t) = (Cx + t*(Dx - Cx), Cy + t(Dy - Cy))
(例如,当
t=0
时,
Ax+t*(Bx-Ax)
计算为
Ax
,当
t=1
时计算为
Bx

要查找p1和p2之间的每个“a顶点”经过时间,请执行以下操作:

对于每个障碍物顶点
v=(Vx,Vy)
我们需要找到一个
t
,以便
p1(t)
p2(t)
v
彼此一致

这可以通过求解以下方程(两个方程和两个未知,
t
k
)来实现:

如果
k
介于0和1之间,则多边形顶点
v
实际上位于(扩展的)
A-B
线和(扩展的)
C-D
线之间。如果
t
Vx=p1(t).x + k*(p2(t).x - p1(t).x)
Vy=p1(t).y + k*(p2(t).y - p1(t).y)`