圖象扭曲演算法 (轉)
圖象扭曲演算法
圖象扭曲是平面圖形變化的一種,它可用於許多場合,如在以前介紹的火焰特效中加入扭曲效果,會使火焰更逼真(當然程式碼要有更高的的才行),如果在字幕當中加入扭曲效果,會給人一種怪異的感覺。
圖象扭曲的演算法並不複雜,但要解釋清楚卻不是一件容易的事,為了說明問題只好借用圖片了,網路慢的朋友多多包涵了。演算法例程原始碼可點這裡,編譯需VC++、DXSDK、DXGu。
圖一 圖二 圖三
首先我們來看圖一,大家可看出在圖中有一些網格線,這裡假定這些網格線是一些有彈性的細繩,在圖一中假定網格線是與底層分離的,接下來我們要在網格線的結點處施加外力,網格線受外力後就會變成象圖二的形狀,大家要仔細看圖一和圖二的底圖,變化的僅僅是網格線,而底圖目前為止還沒改變。
再下來就是關鍵的地方了,到目前為止,我們還是假定網格線是與底圖分離開的,接下來我們要把圖二中網格線附著在底圖上,然後撤消外力,記住網格線是有彈性的,這時底圖在網格線的帶動下發生變形,直到網格線回覆到原樣,如圖三。大家再仔細看看圖三的底圖,是不是已被扭曲?
是不是恍然大悟?接下來就好解釋了,我們再來看看圖二到圖三中某個固定的網格是如何形變的,
// 單元塊扭曲演算法
inline void CFeeackApp::TextureBlock(int xo, int yo)
{
// 投影平面
float fLeftOffX, fLeftOffY; // 各行左端點相對於上一行左端點的偏移
float fRightOffY, fRightOffX; // 各行右端點相對於上一行右端點的偏移
float TX1, TY1, TX2, TY2; // 當前行左、右端點的座標
float HDx, HDy; // 當前行各點間的平均偏移量
float tx, ty; // 當前投影點座標
// 渲染平面
int x, y; // 當前渲染點座標
int xi=(xo<<4), yi=(yo<<4); // 當前渲染塊左上角座標
*Tptr;
Tptr = &(m_awBuf1[xi + m_nMul640[yi]]);
fLeftOffX = (m_offset[xo] [yo+1].xint - m_offset[xo] [yo].xint) /16; // 計算平均偏移
fLeftOffY = (m_offset[xo] [yo+1].yint - m_offset[xo] [yo].yint) /16;
fRightOffX = (m_offset[xo+1][yo+1].xint - m_offset[xo+1][yo].xint) /16;
fRightOffY = (m_offset[xo+1][yo+1].yint - m_offset[xo+1][yo].yint) /16; // 計算平均偏移
TX1 = m_offset[xo] [yo].xint; // 取投影圖塊第一行左端點座標
TY1 = m_offset[xo] [yo].yint;
TX2 = m_offset[xo+1][yo].xint; // 取投影圖塊第一行右端點座標
TY2 = m_offset[xo+1][yo].yint;
for (y=yi; y < (yi+16); y++)
{
HDx = (TX2-TX1) / 16; // 計算投影圖塊當前行各點的平均偏移
HDy = ((TY2-TY1) / 16);
tx = TX1; // 投影平面當前行左端點座標
ty = TY1;
for (x=xi; x < (xi+16); x++)
{
*Tptr++ = m_awBuf2[int(tx) + m_nMul640[int(ty)] ];
tx += HDx; // 下一點
ty += HDy;
}
Tptr += (SCRWIDTH-16); // 下一行
TX1 += fLeftOffX; // 計算投影平面中下一行左、右端點的座標
TY1 += fLeftOffY;
TX2 += fRightOffX;
TY2 += fRightOffY;
}
}
圖四
圖二中的網格是不規則形狀的四邊形,圖三中的則是正方形。網格的形變其實就是四邊形的擠壓和拉伸的過程,如圖四,藍色是變形前的圖象,綠色就是變形後的圖象,則演算法只是簡單的縮放運算而已。假定正方形是16*16點的圖塊,將正方形各點投射到不規則四邊形上,則在正方形上各點的顏色值就取不規則四邊形上相應的投影點處的顏色值就行了。具體演算法見例程原始碼。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-989340/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 影象濾鏡--圖象扭曲演算法演算法
- 圖象處理常用特效演算法特效演算法
- 小程式圖片排列扭曲問題
- ASP.NET動態建立圖象 (轉)ASP.NET
- 將圖象列表轉換成裝置無關點陣圖 (轉)
- PCX 圖象檔案格式的讀寫 (轉)
- 四象圖
- 常用的圖象處理函式的整理 (轉)函式
- 美顏SDK實用演算法——直播背景扭曲矯正演算法
- 用VC 實現圖象漸顯和漸隱 (轉)
- ASP+SQL Server之圖象資料處理 (轉)SQLServer
- C#操作圖象C#
- 載入JPGE圖象檔案到DirectDraw的表面中(轉)
- OpenAI宮鬥反轉反轉再反轉,到底是資本任性還是人性扭曲?OpenAI
- 用Visual C++實現圖象漸顯和漸隱 (轉)C++
- 自定義View-扭曲動效View
- 雷達氣象學(7)——反射率因子圖分析(氣象回波篇)反射
- matlab練習程式(波紋扭曲)Matlab
- 基於粒子群最佳化演算法的圖象聚類識別matlab模擬演算法聚類Matlab
- (轉)從對資料訪問扭曲的適應性評價PostgreSQL與InnoDBSQL
- weathermap網路氣象圖流量的計算
- 用WindowedMode顯示點陣圖圖象(轉)
- 一圖讀懂網路訂餐平臺亂象——資訊圖
- DirectX5.0最新遊戲程式設計指南 DirectDraw篇 一、DirectDraw的基本圖象概念 (轉)遊戲程式設計
- 盲人摸象--我對UML的理解 (轉)
- (轉)面向Web 2.0的儲存引擎設想:充分利用資料訪問扭曲Web儲存引擎
- 【轉】感知雜湊演算法——找出相似的圖片演算法
- 透過現象看本質,圖解支援向量機圖解
- 20 個強大圖象處理功能的 SVG 工具SVG
- 直播美顏SDK導致背景扭曲如何解決?
- 頂象
- Xcode 9.2打包或者除錯,iOS 8.2~iOS8.0的系統載入圖片扭曲XCode除錯iOS
- 象換水龍頭一樣連線ERP(轉)
- 教你解決玩遊戲時顯示卡卡屏現象(轉)遊戲
- 演算法(四)——圖演算法
- 圖論演算法圖論演算法
- A*演算法圖解演算法圖解
- 演算法流程圖演算法流程圖