2011-08-02 67 views
3

我有一個有趣的問題,我一直試圖解決一段時間。沒有「正確的」解決方案,因爲沒有成功的嚴格標準。我想做到的是兩個簡單的多邊形之間的多邊形B.多邊形多邊形B.完全包含在一個平穩過渡,從多邊形A兩個相交多邊形之間的平滑過渡(有趣的問題)

我對這個過渡標準是:

  1. 的過渡是在時間和空間上連續
  2. 從多邊形A「填充」爲多邊形B的區域應填充好像A中有液體倒出成B形
  3. 重要的是,這個動畫可以在飛行中進行計算,也可以通過一組需要的參數進行定義空間,比如少於幾個Kb。

作弊是完美的罰款,任何方式來解決這個問題,使它看起來不錯是一個可能的解決方案。

解決方案,我認爲,和大多排除:

  • 配對起來一個頂點和B,只需插。看起來不好,在凹多邊形的情況下不起作用。
  • 將區域B-A劃分成凸多邊形,也許是一個Voronoi圖,並通過在較小的凸多邊形上執行BFS來計算多邊形的離散狀態。然後我在離散狀態之間進行插值。注意:如果多邊形B-A是凸的,則轉換相當平凡。我沒有采用這個解決方案,因爲將B-A劃分成尺寸相同的小凸多邊形令人驚訝地困難
  • 模擬:細分多邊形A.以離散的小步驟沿着多邊形線正常(向外)移動每個頂點。對於每一步,檢查頂點是否仍然在B內。如果不是,則返回到前一個位置。重複,直到A等於B.我不喜歡這個解決方案,因爲檢查一個頂點是否在一個多邊形內是很慢的。

有沒有人有任何不同的想法?

+0

對於堆棧溢出,這不是一個合適的問題。它太寬泛了,你基本上要求別人爲你寫代碼(或者至少爲你提供一個算法)。 – user1118321

回答

0

如果你想保持這個簡單和有點快,你可以繼續你最後的想法,你考慮縮放多邊形A,使它逐漸填充多邊形B.你不一定要檢查是否縮放向外頂點仍然在多邊形B內。根據您的代碼環境和API的不同,可以使用多邊形B的輪廓遮罩擴展多邊形A的像素。

在現代OpenGL中,您可以在片段着色器。您必須將多邊形B渲染到紋理,將該紋理髮送到着色器,然後使用該紋理查看渲染的當前片段是否映射到由多邊形B設置的紋理值。如果不是,該片段被丟棄。您需要使紋理與屏幕一樣大。如果不是,則需要在着色器中包含一些相機計算,以便可以將「測試的片段」「渲染」到紋理中,方法與將多邊形B渲染到該紋理中的方式相同。