2017-07-06 36 views
0

我有帆布與此PARAMS: width = 400height = 400獲取線的交點的COORDS在平面

和具有線通過點cursor[x1,y1]以一角度Q傳遞(以度)

我需要獲取平面中該線的交點的所有座標並將其寫入數組。現在我使用這個等式:y - y1 = k * (x - x1)

檢查所有點我使用此代碼:

變種拉德= Q * Math.PI/180;

for (ctrY = 0; ctrY < 400; ctrY += 1) { 
    for (ctrX = 0; ctrX < 400; ctrX += 1) { 

     if ((ctrY - cursor.y) === 
       ~~(Math.tan(rad) * (ctrX - cursor.x))) { 

      z.push([ctrX, ctrY]); 
     } 

    } 
} 

例如,當0 < Q < 90和光標[X1,Y1] = [200200] z.length = 0和它的不正確的。

我在哪裏錯了?也許有更方便的算法?

P.S.對不起,我的英語

+0

路口與哪一行的? – MBo

+0

@MBo與座標平面相交的線。 400 * 400的飛機上有哪些點。 –

+0

如果線位於平面內,則不能與該平面相交。但是,也許我明白你需要什麼,並給出了答案 – MBo

回答

0

我想象一個像這樣的算法。 (我只考慮當時的情況)。首先我要計算線與Ox和Oy軸相交的點,考慮原點(0,0)指向左上角,如果我們想象負x和y值分別位於左側和這一點的頂部。令x2y2爲線將與Ox和Oy相交的值。我們想要計算這些值。我們現在有一個帶有2個未知變量(x2和y2)的系統:Math.tan(rad) = (y1 -y2)/x1Math.tan(rad) = y1/(x1-x2)。我們可以通過在座標系上畫線並分析一下來推導出這些方程。如果我們解出方程組,我們會發現如下:x2 = (x1*y1 -x1 * x1 * Math.tan(rad)/(2 * y1-x1))y2= y1- x1 * Math.tan(rad)(這些需要驗證,我沒有仔細檢查過我的微積分)。線性方程可以用公式y = a*x + b定義,在我們的例子中爲a = x2b = y2。然後,我們可以計算出點這樣的:

for (xIdx = 0; xIdx < 400; xIdx += 1) { 
    var ctrX = xIdx; 
    var ctrY = x2 * ctrX + y2 //todo: replace with the respective calculated variables x2 and y2(we could also define two functions in js) and proper rounding 
    z.push([ctrX, ctrY]); 
} 

我不知道如果我是100%準確的,但我希望你明白我的想法。

+1

如果你用另一個變量x(t)= cos(Q)* t + x0來表示參數化的x和y,那麼問題就更簡單也更穩健。 Y(T)= SIN(Q)* T + y0'。例如。將更好地處理垂直線的情況,其中y = a * x + b將慘敗 –