2008-10-18 40 views
1

我目前是學生和嘗試設計一個Visual C++應用程序,允許我以創建圖形矩陣的一個文本文件中插入視覺面向圖形。此時我創建了一個onClick事件來創建節點,並使用窗體的Paint事件繪製節點。我還插入了避免節點重疊的條件。通過點擊和拖動避免繪畫事件,拱形線的重疊?

我目前正在創建節點之間的鏈接。我遇到的問題是,連接兩個節點的線路穿過另一個節點。我認爲,編寫一個算法來檢測重疊並計算該線需要拱起多少以避免在這種情況下過於乏味。

所以我覺得有關創建可以由用戶通過點擊並拖動到左側或右側拱起一條線,就發現如何做到這一點的任何教程,但我有問題。因此,如果任何人有過介紹這種拱形線的一個項目或有任何想法,我可以找到關於這一點,我會深深體會到它的一些信息。

獎:

  1. 請不要推薦任何花哨的圖形庫,這樣做,因爲我不感興趣,安裝第三方的東西對這一計劃。我想插入代碼的函數被命名爲form1_onPaint,所以我想嚴格遵守C++標準庫。
  2. 我知道我說我很感興趣拱通過點擊並拖動一條線,但如果有人能提出另一個可行的解決方案,這一點,如檢測到的OnPaint事件或其他任何可利用的解決重疊的功能這會有很大的幫助。

回答

1

一種可能的方法是允許用戶抓住並拖動其中一條連接線的中點,這會將線分成兩段(連接在兩端)。這使得事情變得簡單並且避免了處理複雜曲線的需要,而且實現起來非常簡單。你可以看中它,並允許細分線條,因此一條線最終可以分解成任意數量的子線。

什麼將需要做一些基本思路:

  • 線段和定義兩端的各點的表示。您可以爲一端存儲一個點,爲每個中間分段斷點存儲一個點,爲另一端存儲最後一個點。

  • 一種跟蹤光標所在位置的方法,以便當它靠近行的中點時,您可以準備抓住並拖動該行來分割它。 「鼠標移動」事件將在此發揮作用。不知道你正在使用哪個工具包,或者我會更具體地說明該事件將被命名 - 它可能是onMouseMove。

  • 跟蹤拖動操作的一種方式。這可能涉及「鼠標移動」,「鼠標移動」和「鼠標移動」。拖動時,您將更新相關細分中斷點的座標。

不幸的是,我認爲基本的繪圖/窗口系統在試圖檢測彼此重疊的塗料時沒有多大用處。你可以自己做,但我同意你的想法,即編寫代碼可能會非常棘手和繁瑣。如果你想畫曲線,再看看Windows的GDI函數PolyBezier()

http://www.misterfoo.com/data/link-demo.png

1

最終產品可能會是這個樣子。

創建一個由四個點組成的數組:第一個點和最後一個點應該是端點,即連接兩個和從中的節點。兩個中點應該是相同的,並且應該是曲線的「點」,即您用鼠標拖動的位置。

+0

很高興知道,我以前從未使用過那個。如果提問者使用表單,則此Winforms版本是Graphics.DrawBezier。 – Charlie 2008-10-19 19:37:31