假设我有两个点,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 +ε),它们是可见的。
这是变得不可见的另一种方式。
但是我能找到一个精确的边界,如果是这样,怎么样?
答案 0 :(得分:2)
好的,我现在对这个问题有一个更清晰的了解,并且受@walkytalky建议的启发,这是一个更精细的答案。
您提到p1
和p2
沿直线段行进。我不知道这些细分是否以某种方式对齐,以至于p1
和p2
始终同时启动新细分。但是,您始终可以将线段切割为两个线段(具有相同的斜率),以便p1
和p2
始终同时启动新的线段。
假设p1
沿着A-B
行旅行,p2
沿C-D
行进(同时),因为参数t
从0变为1 (即,在t=0.5
时,p1
位于A-B
中间,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
时。)
要找到每个“a-vertex-by-between-p1-and-p2”-time,我们会执行以下操作:
对于每个障碍物顶点v=(Vx, Vy)
,我们需要找到t
,以便p1(t)
,p2(t)
和v
相互对齐。
这可以通过求解以下等式(两个等式,两个未知,t
和k
)来完成:
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”时间,就可以轻松搞清楚其余部分。 (也就是说,弄清楚它是否是“变得在视线中”,“变得不可见”或“既没有”传递类型):
对于连续顶点遍历时间的所有对t
和t0
,检查线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
或某些,那么整个时间点都在线上,在这种情况下你必须考虑你的政策。