任意角度的RGB雙色線性漸變演算法示例

2021-07-15 21:14:24 字數 2784 閱讀 1859

用兩種rgb顏色對矩形進行線性漸變填充時,需要合適的演算法計算各點的顏色,這樣才不會出現中間過渡色,或者出現漸變填充不完整。而在增加從任意角度進行漸變後,情況似乎變得更加複雜。

比如這樣:

又比如這樣:

這些都是色彩計算錯誤引起的。現在來看看正確的漸變圖,其中顏色和漸變角度和上面的一樣:

首先說明漸變角度,在本例中是以垂直向上為0度,順時針增加到360度。

如45度偏轉漸變如下:

下邊貼出漸變色計算過程**,例子是在vc2010下做的,顏色的表示借用了windows的colorref:

/** 

* 計算線性漸變色

* @param crbegin 前景色

* @param crend 漸變色

* @param degree 漸變角度,以垂直向上為0度,順時針增加到360度

* @param width 矩形區域的寬度

* @param height 矩形區域的高度

* @param x 橫座標,在矩形區域中起點為0,向右遞增

* @param y 縱座標,在矩形區域中起點為0,向下遞增

* @return 計算後的線性漸變色

*/colorref calclineargradientcolor(colorref crbegin, colorref crend, int degree, int width, int height, int x, int y)

else

if(degree>180&°ree<=270)

newy = (fheight-posy)*cos(radian) + posx*sin(radian);

else

/// 計算漸變後的顏色

float fbegin=0.0; float fend = 0.0; // 起止顏色,須以float參與運算

float

step = 0.0; // 漸變步長,以各種顏色分量進行計算

/// 計算漸變色

unsigned char rred, rgreen, rblue;

/// 紅

fbegin = (float)getrvalue(crbegin); fend = (float)getrvalue(crend);

step = (fend-fbegin)/newheight;

rred = (int)( fbegin+step*newy );

/// 綠

fbegin = (float)getgvalue(crbegin); fend = (float)getgvalue(crend);

step = (fend-fbegin)/newheight;

rgreen = (int)( fbegin+step*newy );

/// 藍

fbegin = (float)getbvalue(crbegin); fend = (float)getbvalue(crend);

step = (fend-fbegin)/newheight;

rblue = (int)( fbegin+step*newy );

/ 透明度

//fbegin = (float)balpha; fend = (float)ealpha;

//step = (fend-fbegin)/newheight;

//ralpha = (int)( fbegin+step*newy );

return rgb(rred, rgreen, rblue);

}

這樣,不管從什麼角度進行漸變,實際上都是好像是從上往下進行的漸變,如此一來,就容易理解了。

需注意的是漸變角度要分為4個區域進行討論,分別如下:

圖示說明:

- w和h表示當前矩形的寬和高

- a表示漸變角度

- 帶箭頭的黑線表示了漸變角度和方向

- nw和nh表示新矩形的寬和高

- 黑點是用作分析的示例點,虛線表示它在當前矩形中的橫縱座標,紅色線表示它在新矩形中的橫縱坐

- 標記出的各個角是角度相同的角

另外特別需要注意的一點是各個漸變角度在實際計算時都將其範圍縮減到0~90度之間。

當漸變角度在0~90度之間時,如下圖所示:

當漸變角度在90~180度之間時,如下圖所示:

當漸變角度在180~270度之間時,如下圖所示:

當漸變角度在270~360度之間時,如下圖所示:

雙堆實現任意刪除 天際線掃瞄

堆其結構為完全二叉樹,物理儲存採取陣列,乙個點i 其孩子節點為 2i 1 2i 2 堆的操作包含top pop push 並且這些操作都是基於堆的頂部進行,其通常呼叫down下沉操作和up上浮操作。堆不支援任意節點的刪除 意味著節點之間順序打亂 通常可以基於雙堆實現邏輯刪除。class my hea...

Theta 連續環境下平滑的任意角度的路徑規劃

此文翻譯自這篇文章theta any angle pathplanning for smoother trajectories in continuous environments 簡單介紹了theta 演算法,這是一種基於a 的搜尋演算法。筆者翻譯不妥的地方,還望諒解。然而,由於a 的簡單性和最優...

求圓和橢圓上任意角度的點的座標

如上圖,給定圓心 cx,cy 半徑為r,求 theta 對應的點的座標?此處 theta 是相對於水平軸的角度。顯然我們可以使用極座標轉換來求 px cx rcos theta py cy rsin theta end right.px cx rcos theta py cy rsin theta ...