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個贊
高效的解決方案:
我假設您知道哪個點在正方形(也可以是矩形)內。
從所有其他點(第二個端點和四個角)中減去該點的坐標??紤]通過延伸正方形的邊而將平面細分為九個區域。需要進行四次符號測試才能知道另一個點位于八個外部區域中的哪一個。
然后,如果該點位于“邊”區域,您就隱含地知道穿過了哪邊。如果該點位于“角”區域,則必須在兩側之間做出決定,這是通過檢查角位于線段的哪一側來完成的。這需要計算三角形的有符號面積(兩次乘法和一次減法)。
當你知道穿過哪條邊時,使用比例找到交點就很容易了。這需要一個部門。
最后,將其平移回內部點的原始位置。總成本是
四次減法,
四項標志測試,
對于角區域,兩次乘法和一次減法,
一個部門,
兩個補充
加上一點粘合邏輯。
這不能保證是絕對最小值,但必須接近。
添加回答
舉報