2010-11-28 83 views
2

創建一個益智遊戲,我希望形狀根據用戶輸入變形。用戶點擊頂點並拖動改變形狀的點。例如,如果用戶點擊A並向下拖動(縮短段AG),則點B將下降等量(縮短BC),點F向左移動縮短AF和FG,最後點E也移動到左側與F點保持一致。二維線段變形算法

有一個線段數組,每個線段本身就是一個包含兩個端點的數組。當移動我有一個循環搜索所有的平等點。這些都不願意做任何必要的改變來實現它的工作。

我一直在爲此工作兩天,並完全難住。

   A 
    B-------------\ 
    |   | \ 
    |   | \ 
    |   | \ 
    |   | \ 
    C------------------\F 
    |   G  | 
    |     | 
    |     | 
    D-------------------E 
+0

此問題已被約束。這意味着可能有方法來改變這個數字並保持所有的角度都一樣。例如,你可以延長B,E和G十英里。告訴我們你想要做什麼。 (並標記頂點,而不是段) – Beta 2010-11-28 18:34:09

+0

好的redid,希望這有助於 – John 2010-11-28 18:44:42

回答

3

聯立方程,innit?

我假設每條線都應該保持其斜率。然後你的身材滿足這些方程(或接近這些公式,我不是100%肯定的AF線的斜率):

Bx的= = CX DX

通過=好哦

CY =戈瑞= Fy的

的Dy =安永

組Ax =的Gx

Fx的防爆=

(A.y - F.y)= 2(F.X - A.x)

當玩家被拖動,然後A.y和A.x是有效恆定的,所以你有十一方程和十二個未知數。 (Beta有一些限制,正如Beta指出的那樣,因爲三個方程式Bx = Cx = Dx與其他任何方程式都沒有關係,Dy = Ey也沒有)

你可能想要的是改變變量的最少量。我不知道該怎麼做。但是因爲這是一場比賽,所以如果偶爾不會得到相當於的最小變化集合,那也許並不重要。所以,也許貪婪的算法會起作用,像這樣:

  • 讓S是我們保持不變的變量的集合。將其初始化爲空集。
  • 對於每個變量V,如果方程組可以保持S∪{V} Contant中的變量,則將V加到S.
  • 您找到的最後一個解決方案就是您使用的最後一個解決方案。
0

我的第一個想法是用單純形算法進行線性規劃,但我認爲這是錯誤的或至少是不完整的。基本上,大多數(如果不是全部)規則都是線性的,這個規則就是線性規劃處理這種規則的(或者是規則)。

修復可能是統一的。也就是說,儘可能少地表達您的規則WRT。如果你有一個規則f(a)= g(b),你可以通過定義b = g'(f(a))來有效地消除b,並在其他地方代替你找到b。由於實際替代效率低下,您可以只記下a和b之間的關係。

由於併發症較少,基本方法是聯合查找。在完全平等的情況下,您可以通過添加從b到a的鏈接來消除b。當'找到'b時,你就可以識別一個(或者它所鏈接的任何東西)。因此,在任何時候,您都可以高效地將任何規則轉換爲僅使用未消除變量的表單。在這種情況下的複雜 - 你需要保持g'(f(a))風格的東西的運行軌跡,因爲你遵循鏈接。由於這一切都是線性的,它不應該是一個大問題,但也不是微不足道的。

您可能需要能夠回溯統一 - 記下您在堆棧上設置的鏈接,以便在展開堆棧時以正確的順序再次將它們清零。

我不確定你是否有任何相對條件(小於或等於),但如果是這樣,一旦你已經消除了儘可能多的變量,你仍然需要一些線性編程。如果你有兩個剩餘的變量,這在概念上很簡單。對於這兩個變量的每個線性條件,請在2D圖上繪製一條線,以便線的一邊代表有效區域。這些條件傳統上是「標準化的」,所以有效的一方總是包含原點。基於交點,最靠近原點的線段形成凸多邊形。一個最佳解決方案在其中一個角落,並且使用線性評分規則(您正在優化的東西)進行評估,在您的情況下,該評分規則將被定義爲給出「最佳」形狀,其中存在某些不明確或優先級衝突你的規則 - 例如你不能一直推線一個點,所以在某些點上會被阻塞。

如果您剩下兩個以上的變量,則需要多維等價的凸多邊形 - 這就是所謂的單純形。單純形算法的實際實現涉及矩陣。

這已經過於簡單化了,它可能在某些細節上是錯誤的,而且就我所能解釋的事情而言。 IIRC你可以在Sedgewick中獲得這些組件技術的很好的描述,儘管現在維基百科可能一樣好。

單純形求解器有時用於窗口布局 - 例如,我認爲wxWidgets使用一個來調整窗口中的控件的大小。統一是邏輯編程的一個定義特徵(Prolog等),但底層的聯合發現原則很簡單。關鍵技巧是弄清楚如何將2D圖形翻譯成一系列表達如何改變的規則,並理解如何表達和操縱這些規則,特別是以矩陣形式。

+0

酷,thx。我會看看你說的一切。 WRT代表什麼? – John 2010-11-28 19:10:14

0

這個怎麼樣?你的謎題只有三角形,長方形和正方形嗎?在這種情況下,您可以根據哪個頂點被移動以及哪個形狀受到該頂點的移動影響來開發處理每個形狀的方法......在您的示例中,移動頂點A將影響方形ABCG和三角形AGF。所以,當A移動時,頂點C保持不受影響......你只需要「重新定位」B和G.除非我明白你的例子錯了,否則我不會看到移動A如何影響F。 HTH。