2017-02-23 30 views
1

我給出了一個正方形的兩個相對點的座標(比如方形ABCD中的點A和C),我需要將正方形繪製爲ASCII每個字符代表2D矩陣中的一個點:''(空格)爲空,'X'爲滿,'\ n'顯然是行結尾和下一行的開始。廣場可能會旋轉。我怎樣才能做到這一點 ?如何在給定兩個相反點的2d矩陣中畫一個正方形

現在,感謝@ avysk在SoftwareEngineering Question中的回答,我可以確定這個廣場的兩個缺失點(我顯然是在問題擱置時在錯誤的論壇中提出要求)。

現在,我想因爲這個模型不應該是太大,我將通過矩陣的每個點進行迭代,並有一個條件,如

for (y = 0; y < height; y++) { 
    for (x = 0; x < width; x++) { 
     matrix[y][x] = (in_square(x, y, array_of_4_points)) ? 'X' : ' '; 
    } 
} 

我錯過了邏輯in_square函數。

+0

請參閱[如何編寫一個C程序來檢查一個點是否位於給定其對角線的一個端點的正方形內部](http://stackoverflow.com/q/42407174/2521214) – Spektre

回答

1

你可以用點的產品做到這一點,而且也沒有必要找B和D.

如果你的項目點(稱之爲P)到對角線,那麼如果從點到對角線的距離小於或等於從投影點到最近角(A或C)的距離,那麼它在方塊內。這假定「在線上」。

首先,找出距離A有多遠,該點位於AC方向。該值必須是正或者對角線上的投影點爲A和C.

bool in_square(Point P, Point A, Point C) 
{ 
    float dot1 = ((P.x - A.x) * (C.x - A.x)) + ((P.y - A.y) * (C.y - A.y)); 
    if(dot1 < 0.0f) 
     return false; 

接着之間的段的外側,找出如何遠離C中的點是在CA和測試的方向同樣:

float dot2 = ((P.x - C.x) * (A.x - C.x)) + ((P.y - C.y) * (A.y - C.y)); 
    if(dot2 < 0.0f) 
     return false; 

現在從在對角線上(例如A)至點P的點計算的矢量,然後取它的點積與垂直於對角線的向量。這給出了P與對角線的距離。比較到最小DOT1和DOT2的這個距離:

float dot3 = ((P.x - A.x) * (C.y - A.y)) + ((P.y - A.y) * (A.x - C.x)); 
    if(dot3 < 0.0f) 
     dot3 = -dot3; // abs value 
    if(dot1 < dot2) 
     return dot3 <= dot1; 
    else 
     return dot3 <= dot2; 
} 

有沒有必要正常化這些載體,因爲我們只是在做比較和載體(AC,CA,垂直於AC)的長度是每次都一樣。

相關問題