2 回答
TA贡献1891条经验 获得超3个赞
设内点为(x0, y0)
,外点为(ox, oy)
以参数形式表示线
vx = ox - x0
vy = oy - y0
//equations:
x = x0 + vx * t
y = y0 + vy * t
现在根据方向找到潜在的边界位置:
if vx > 0 then
ex = x2
else
ex = x1
if vy > 0 then
ey = y2
else
ey = y1
检查水平/垂直线方向的额外情况:
if vx = 0 then
return cx = x0, cy = ey
if vy = 0 then
return cx = ex, cy = y0
一般情况下查找与水平和垂直边缘线相交的参数
tx = (ex - x0) / vx
ty = (ey - y0) / vy
并获取较小参数值的交集
if tx <= ty then //meet vertical edge first
return cx = ex, cy = y0 + tx * vy
else
return cx = x0 + ty * vx, cy = ey
TA贡献1815条经验 获得超13个赞
高效的解决方案:
我假设您知道哪个点在正方形(也可以是矩形)内。
从所有其他点(第二个端点和四个角)中减去该点的坐标。考虑通过延伸正方形的边而将平面细分为九个区域。需要进行四次符号测试才能知道另一个点位于八个外部区域中的哪一个。
然后,如果该点位于“边”区域,您就隐含地知道穿过了哪边。如果该点位于“角”区域,则必须在两侧之间做出决定,这是通过检查角位于线段的哪一侧来完成的。这需要计算三角形的有符号面积(两次乘法和一次减法)。
当你知道穿过哪条边时,使用比例找到交点就很容易了。这需要一个部门。
最后,将其平移回内部点的原始位置。总成本是
四次减法,
四项标志测试,
对于角区域,两次乘法和一次减法,
一个部门,
两个补充
加上一点粘合逻辑。
这不能保证是绝对最小值,但必须接近。
添加回答
举报