在工作中經常遇到判斷一個點在另一個點的那個方位的問題,如,這裡需要確定p2在p1的那個方位,也就是求p2相對於p1落在地區1,2,3,4那個中,注意此處p1不是座標原點,座標原點在螢幕的左上方(此處為螢幕座標)。這個問題的解決方案有很多,可以使用向量夾角來做,使用該夾角的方法涉及到向量的乘除,速度上會有影響。此處給出的方法只需判斷點的座標值即可。
具體演算法描述如下:
1.將p1,p2轉換為以p1為座標原點,也即平移座標系。給出的就是轉換後的座標系
2.由可以看出:
地區1中有:|x| > |y|, x > 0
地區2中有:|x| < |y|, y < 0
地區3中有:|x| > |y|, x < 0
地區4中有:|x| < |y|, y > 0
代碼如下:
bool GetDirect(<br />POINT p1,<br />POINT p2,<br />int& nRegion)<br />{<br />float fDis = (float)sqrt((double)((p2.x - p1.x) * (p2.x - p1.x) + (p2.y - p1.y) * (p2.y - p1.y)));<br />if (fDis < 0.001)<br />{<br />// 亮點重合<br />nRegion = 0;<br />return false;<br />}</p><p>// 將p2轉換為以p1為座標中心的座標系中<br />p2.x -= p1.x;<br />p2.y -= p1.y;</p><p>if (abs(p2.x) > abs(p2.y) && p2.x > 0)<br />{<br />nRegion = 1;<br />}<br />else if (abs(p2.x) > abs(p2.y) && p2.x < 0)<br />{<br />nRegion = 3;<br />}<br />else if (abs(p2.x) < abs(p2.y) && p2.y < 0)<br />{<br />nRegion = 2;<br />}<br />else if (abs(p2.x) < abs(p2.y) && p2.y > 0)<br />{<br />nRegion = 4;<br />}</p><p>return true;<br />}
總結:通過該方法可以判斷其它地區的情況,只需將判斷條件修改一下即可