2009-07-28 206 views
1

否則稱爲硬邊緣,這是鼠標無法穿過的線條。在遊戲等中很有用。實現鼠標邊界的邊緣

目前,我有一個函數返回,如果我的鼠標光標是在屏幕上繪製的多邊形。如果不是,則將光標移動到多邊形中最後一個存儲的點。

if (!PointInPolygon(local, polyGon)) 
    { 
     Cursor.Position = safePoint; 
    } 
    else 
    { 
     safePoint = Cursor.Position; 
    } 

我不喜歡這樣的一對夫婦的原因:

  • 由於緩慢的更新時間或出於某種原因,我有時能打破開箱。然後將該位置作爲safePoint存儲在多邊形之外。然後我的鼠標卡在這個位置。

  • 傾斜的邊緣應該在斜坡方向上猛擊鼠標。再次將鼠標向右推,一個「/」形牆應該在光標在右上角。但由於這種方法的性質,通過該行將重置光標到以前的位置。繼續向右推只會繼續重新設置光標,並且不會將其推上「斜坡」。

是否有任何其他方法來解決這個問題?我主要擔心最後一個問題:這種斜率橫向行爲是我的程序的主要目標,我需要讓它工作。即使我使用這種基本方法,對於特定行爲的優化有什麼想法?


編輯:

已經由Reed,我反而回到最接近當前出界外點的點建議。考慮到四邊形的四個角點,我將如何找到形狀中/上的最近點?

回答

0
  1. 查找使用的兩個端點的邊緣直線的方程。
  2. - (1 /斜率)給出了垂直線的斜率。
  3. 使用已知點跨越邊緣(真實鼠標的位置)求解垂直線的線方程
  4. 求解邊緣線與垂直線的交點。
  5. 將假光標置於該位置。
2

而是跟蹤「還原點」,我會做到以下幾點:

如果你發現你的多邊形之外,而不是恢復到一個已知的安全點,把鼠標上/最近點在多邊形到當前鼠標位置。這也將有助於感覺,因爲光標傾向於(緩慢)跟隨多邊形邊緣上的斜坡等。

它也消除了在調用(安全點)之間保存狀態的需要。

+0

嗯,好主意。現在我只需要弄清楚,考慮到四邊界限制四邊形,那麼找到最近點的最佳/最簡單的方法是什麼? – cksubs 2009-07-28 01:42:00

+0

這裏有一些適合你的算法:http://www.devmaster.net/forums/archive/index.php/t-103.html對於小多邊形(取決於你的情況,但通常少於10個部分),只是強力搜索點 - >段通常是最快的方法。 – 2009-07-28 15:11:37

-1

最近的點:

if(mouse.x > maxX) 
    mouse.x = maxX; 
else if(mouse.x < minX) 
    mouse.x = minX; 

// same for Y. 
2

如何限制點P一個多邊形內部(非凸是有點困難)在2- d(假定順時針纏繞順序):

對於每個邊緣(Pi,Pj)的多邊形...

查找法線矢量邊緣ñ(從單位矢量指向點Pj,旋轉90度)

從邊緣尋找位移d指向P沿ñd =(P - PI)點ñ

如果d是正(或負爲逆時針纏繞順序),然​​後P = - N * d

結束循環:)