2013-03-20 51 views
0

我已經搜索了關鍵字如二維,繪圖,算法但沒有發現或至少注意到,如果這可能是一個重複的SOF所以請讓我知道,那麼我會很高興刪除它以遵循StackOverFlow策略!長話短說,我需要知道是否有人使用或意識到在畫布上移動2D矩形的優化算法。 (目前我們正在使用WPF)維護和更新連接在二維圖

這是我們的代碼,我們的問題是移動的對象,在節點/點連接的矩形被移動使用鼠標。考慮用戶抓取節點的情景,讓我們說右下角並在畫布上拖動它。

矩形移動正常,但當它有其他形狀連接到它時,例如另一個矩形,線或圓。目前它出錯,設計/草圖變形。

我想,爲了澄清我的問題,也許我應該問這個問題:哪種算法或哪種數據結構可以幫助我跟蹤和維護其他鏈接形狀與此矩形的連接?

任何有用的反饋表示讚賞。

注意:好的,我需要在這裏添加的一件事是,我們的代碼在所有情況下都能正常工作,但是,我們注意到當我們的形狀或繪圖變得複雜時,整個設計或對象花費的時間太多。 我們在以前的版本中做了什麼(就矩形而言)連接了兩行,其中列表將存儲所有連接信息,因此對於我們在行的每個開始點和結束點中存儲信息的矩形。 但是,在新版本(正在開發)中,我們使用Point類中的對象來存儲 這些信息。因此,我們不是以8點存儲信息,而是以4點存儲連接信息,希望優化系統。現在,我們已經遇到了移動矩形不能正確發生的連接問題,並且矩形可能會變成斷開的矩形或甚至是一條線。 請參閱附件快照。

public void RefreshDirectConnections() 
    { 
     if (!this.IsTraversed) 
     { 
      this.IsTraversed = true;      
      TestDrawingCanvas canvas = this.Parent as TestDrawingCanvas; 

      foreach (TestConnection con in this.Connections) 
      { 
       TestShapeBase shape = canvas.GetByID(con.ConnectedShapeID); 


       if (!shape.IsValidMove(this.GetHandle(con.ThisHandle), con.ConnectedHandle)) 
       { 
        InValid = true; 

        canvas.DrawInvalidRect(this.GetHandle(con.ThisHandle)); 

       } 
       else 
       { 
        shape.MoveHandleTo(this.GetHandle(con.ThisHandle), con.ConnectedHandle); 
        shape.RefreshDrawing();       
       } 
      } 
     }    
    } 

enter image description here enter image description here enter image description here

+2

你可以提供實際移動形狀的代碼,也可以是解釋你當前正在獲得的結果的截圖,以及它們爲什麼是錯的? – mbeckish 2013-03-20 19:18:06

+0

行得通。我將很快發佈幾張快照 – 2013-03-20 19:24:08

+1

對於典型的樹遍歷,不需要在各個節點中維護狀態(您維護的IsTraversed屬性)。我的猜測是,每次移動圖形時都不清除所有這些屬性,因此只有部分樹被移動。 對於更簡單的樹遍歷查找深度優先樹遍歷(有更多的方法來遍歷樹),並看看遞歸實現的僞代碼看起來如何。這會讓你的生活變得更輕鬆。 – Toad 2013-03-20 20:21:00

回答

3

其中維持對象/載體/旅遊關係海誓山盟使用scenegraph大多數2D和3D應用程序。 該圖是一個樹形結構,其中每個對象(根除外)都有一個父對象。每個子節點都有相對於其父節點定義的位置。這使得如果你移動一個孩子,它的所有孩子都會自動移動。 (可選)如果需要,還可以存儲相對縮放或旋轉。

+0

你知道這方面的任何在線資源嗎? – 2013-03-20 22:56:25

+1

我會看看遊戲開發網站。快速搜索爲我提供了充足的資源:http://www.gamerendering.com/2008/10/18/scene-graph/ – Toad 2013-03-21 19:55:55