2013-02-14 76 views
5

我正在開發一個扭曲圖像的android應用程序。我使用opengl翻譯和縮放函數來扭曲圖像。圖像扭曲罰款。現在我想實現撤消功能。但是無法實現這些功能。任何人都可以幫助如何在opengl中實現撤消功能。任何建議或代碼都會有所幫助。 在此先感謝。如何在opengl中實現撤消功能android

+1

這與OpenGL無關。 OpenGL只是繪製你所描繪的圖畫。任何撤消功能都是關於改變你所說的繪製過去的內容。 – 2013-02-14 11:28:59

+0

@NicolBolas其實我在手指觸摸時會扭曲圖像。圖像縮小或隆起。問題是,我應該存儲什麼以及如何在視圖上反映它。 – 2013-02-14 13:02:12

+0

我相信你應該在每次觸摸開始時存儲當前圖像。然後,撤消完成後,只需放下當前圖像並將其替換爲隊列中的最後一張圖像。有些操作可能會使用opengl反轉,但我認爲你不應該在這裏使用這些功能。只需用手指存儲原始圖像和每個操作,或者每步執行圖像。 – Pihhan 2013-02-14 13:27:25

回答

0

Ray Tayek是對的。使用命令模式。也就是說,對於用戶執行的每個操作,都會在撤消堆棧上推送該操作(命令)以及與該操作相關的所有數據。

爲了簡單起見,我們來看看油漆程序。該過程直接適用於您的OpenGL應用程序。用戶從x1,y1到x2,y2繪製一條線。該命令可以表示如下:

command = DrawLine 
data = x1, y1, x2, y2 

您可能需要至少兩個類的撤消數據,但他們會很小,很容易實現。當用戶想要撤銷時,只需將頂部對象從撤銷堆棧中彈出,查看它,然後執行關聯的撤銷操作(特定於每種類型的命令)。或者,您甚至可以在每個命令對象中包含撤消操作。然後按重做堆棧上的撤消命令。

這應該足以讓你開始。 HTH

+0

我修改了上面的答案。對於3D圖形,DwB有一個很好的方法。使用未更改的圖像作爲撤消數據的一部分。 – Frecklefoot 2013-04-02 16:13:34

2

我懷疑命令模式不適合您的情況。這是基於我的假設,即使您知道應用了什麼失真,也不容易扭轉圖像失真。

相反,您可能需要在應用失真之前將圖像推入堆棧。然後,撤銷實現將使用堆棧中的圖像替換當前圖像。這會導致由重做和撤消相結合導致潛在的有趣問題。

您可以優化這個功能,以便存儲命令對象,以便輕鬆修改變化,並存儲圖像,以便更換不易復位的變化。