Flash務實主義(三) 最短路徑原則(下)

2022-02-18 13:02:31 字數 2384 閱讀 1975

首先是個轉場特效問題。

其實我早想到做法了,只是當時還沒實踐。增加混合(blendmode.add)只要關係到光效,泛用性就很高,疊加著畫上去看起來應該就是這個效果。

但是我還是先到群裡問了下,然後一幫人就跟我說徑向模糊。還有一幫人說以前搞過,拿我的原圖上了個徑向模糊發給我。但是徑向模糊多慢用過ps都知道,怎麼也不可能用在動畫效果裡的。這個東西的確有點像徑向模糊,但是像什麼就做什麼,從表面著手,思考方式就有點單純了。

實際上做法再簡單不過,調整matrix縮放和旋轉圖形,一點點放大,然後用增加混合模式將原圖疊加著畫上去即可。

var m:matrix = new matrix(); 

m.translate(-bmd.width / 2,-bmd.height / 2);

m.scale(scale,scale);

m.rotate(r);

m.translate(bmd.width / 2,bmd.height / 2);

screen.bitmapdata.draw(bmd,m,new colortransform(1,1,1,0.2),blendmode.add);

增加混合是個很有趣的東西,可以衍生出很多東西,這個以後再說。

某天看到了個很牛的玩意,乙個哥們做了個很酷的模擬水滴從牆面上滴下來的效果,公布了詳細的思路與做法,涉及不少的數學知識(

)。我們在這只就他這個效果乙個很有趣的細節做討論——兩個水滴接近時會自動融合成乙個。

水滴本身是乙個多個節點的曲線,那麼這個融合過程該怎麼實現呢?這時候乙個沒看作者**的人就說話了,而且還畫了圖。總之,他的辦法就是當兩個水滴相交時,先檢測出相交面積,然後找到重疊部分的曲線的點,將這部分點刪除,再將剩下的點平滑連線到一起,這樣兩個水滴就合二為一了。好吧,至少這個沒有要求做曲線相交,但剔除點之後重連線還是要有一定數學知識,到底哪兩個點連線?連線曲線的曲率是多少,怎麼才算平滑?連線成一體的新的水滴怎麼才能恢復類似圓的形狀?

而作者的**很簡單。他的做法僅僅是讓較小的水滴快速移動向大的水滴並漸隱,然後把兩個水滴的面積相加求出新的半徑,小水滴刪除,大水滴直接變大。這個和真實融合的情況相差甚遠,但是由於融合過程很快(現實中確實也很快),如果你不使用變速齒輪,自己也沒有子彈時間似的超級視覺,根本看不出具體融合步驟,也就看不出破綻。

都說圖形程式設計數學要好,這的確不錯。但實際上除了一些特別噁心的需求,甚至都不需要動用高數的知識。而且如果需要用到高數知識,往往也是光高數知識搞不定的。如果乙個問題覺得非得用高中程度之上的知識才能解決的話,有可能就是鑽進了牛角尖。近似方案,足夠了。

這是乙個實際問題。我曾經自己寫了乙個翻頁效果,並用在了專案上。翻頁實際上很難寫,雖然都是解析幾何的知識,但要判斷多種情況,各種翻頁方式的繪製方法是不一樣的。所以最後我只實現了從左上向右下的翻頁,當時足矣。

但是後來美術提要求了,他希望做個從右上向左下翻的動畫(這是一般翻書的習慣),但因為這個是用解析幾何計算出來的,在不同方向上,公式是不同的。而這段**裡全是已經移項後的方程,根本無法還原,隔得時間也太長,換個方向差不多就要重寫。我頭痛了。

後來我在那無聊,把整個繪製容器翻來翻去,設定scalex,scaley,然後看到,翻過來以後,雖然滑鼠,影象全都倒置了,翻頁本身的效果倒是挺正常的,只是翻轉了。垂直翻轉後,由左上向右下就成了由左下向右上,水平翻轉後,則成了從右上向左下。好,我要的效果出來了。

滑鼠和貼圖不對?改下就好了,滑鼠很好弄,貼圖嘛,繪製的時候先翻轉好就成。

終於不用寫四次同樣的演算法了。雖然其他人寫的翻頁可能能用一套公式相容多個方向的情況,但我的數學水平沒那麼好。但就算這樣不也做出來了?條條大路通羅馬,不修改繪製方向,而是改變整個容器的方向,雖然不是標準答案,卻是很理想的應急方案。在這裡,它幾乎可以永久使用。

大家小時候都玩過那種投色子在格仔上前進的紙上遊戲吧。我以前挺熱衷的,還常常自己畫棋盤,各種大小格仔跳轉。如果棋盤都是很整齊的直線和折角的話,那自然好說,但如果棋盤本身的線路就是扭來扭去的,或者說本來就是美術亂畫的呢?

首先想到的是做錨點,棋盤就當做背景圖了,旗子都是在這些看不到的點上移動。這裡直線移動還是好做的,但是曲線……除非你打算用直線近似代替,否則又要搞什麼貝爾法……

但如果你的這部分只是乙個小遊戲,不關心擴充套件的話,有乙個只有flash才能做得到的方案,對於as2時代的人可能會比較親切,as3時代進來的人可能根本就見過這種搞法。

咱把棋子移動整個做成乙個動畫吧。

小遊戲有小遊戲的搞法,flash也正是因為可以支援這些小遊戲的搞法才能發展到現在。雖然是老掉牙的東西了,有些時候還是可以用用的。老的東西並不會被完全取代,畢竟它還是有自己的便利之處的。既然用了就能豁然開朗,那麼它就是這時候的,最佳選擇。

說得挺多了,最後再介紹一些寫法上的簡化方法吧:

順便給份測試結果

,畢竟換層有多種方案(setchildindex, swapchildren, swapchildrenat),整個排序主要的消耗都在交換層級上,因此換層的方式很影響效率。

原 ArcEngine中最短路徑的實現(一)

最短路徑分析屬於arcgis的網路分析範疇。而arcgis的網路分析分為兩類,分別是基於幾何網路和網路資料集的網路分析。它們都可以實現最短路徑功能。下面先介紹基於幾何網路的最短路徑分析的實現。以後會陸續介紹基於網路資料集的最短路徑分析以及這兩種方法的區別。幾何網路是一種特殊的特徵要素類,由一系列不同...

三 最短路徑之Dijkstra演算法

1.dijkstra演算法 1.1演算法介紹 1.2演算法原理 1.3演算法過程 1.4演算法示例 從節點1出發到圖中其餘節點的最短路徑分別是 2 8,3 15,4 20,5 13,6 18 程式 說明 這裡假設邊的權重最大不超過100,以此代替無窮大 利用s和s1分別儲存兩個不同的點集合,d中儲存...

最短路徑演算法 三 SPFA演算法

一 演算法介紹 spfa演算法 shortest path faster algorithm 是基於bellman ford演算法的優化 bellman ford演算法複雜度 o v e v 點個數 e 邊個數 spfa演算法複雜度 o k e k為所有頂點進隊的平均次數 缺點 spfa的演算法時間...