簡體   English   中英

C#中二維平面上對角線的線相交

[英]Line intersections for diagonals on a 2d plane in C#

假設一個2D網格的左上角單元格為(0,0)。 選擇任意兩個點/坐標,並在每個點上繪制對角線和反對角線。 它們可能在網格內部或外部相交。

在所附的圖片中,紅線是兩個點(300、200)和(700、800)的對角線。

如何找到對角線交叉點的坐標? 另外,如果直線的斜率為負,公式將如何變化?

我將在需要高度優化的算法中使用此算法,因此正確的答案將是最快的計算方法。 我不確定如果沒有三角學就可以做到這一點。

注意:請記住,紅線是真正的對角線/反對角線對。 換句話說,它們與矩形成45度角。 這可能會或可能不會幫助您選擇比矢量計算更優化的公式。

在此處輸入圖片說明

D為兩個邊長之差。 在您的圖中, D=200 這是兩個白色三角形(外部交點和矩形之間的斜邊)的斜邊的長度。 因此,這些三角形的邊長為D/sqrt(2) ,因此外部交點的坐標與矩形角的差為D/2

然后為你的圖,

(x1,y1) = 300-D/2, 200+D/2 = 200,300
(x2,y2) = 700+D/2, 800-D/2 = 800,700

您必須處理所有可能的方向( x1<x2x1>x2 ,...),但是它們都與此對稱。

這只是數學。 你有兩行方程

y1 = k1 * x1 + b1
y2 = k2 * x2 + b2
If they intersect then y1 == y2 and x1 = x2 so
k1 * x1 + b1 = k2 * x1 + b2
x1 = (b2 - b1) / (k1 - k2)

現在唯一的問題是如何找到k1,k2,b1,b2? 簡單! 每行有2個點(來自graphics.DrawLine(x1,y1,x2,y2))。 在這里使用它們。 對於第一行:

y1 = k * x1 + b
y2 = k * x2 + b
b = y1 - k * x1
y2 = k * x2 + y1 - k * x1 = k * (x2-x1) + y1
so
k = (y2 - y1) / (x2 - x1)

kb = y1-k*x1 ,您將獲得計算精確碰撞點所需的所有值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM