2017-10-19 196 views
2

迭代在沿着光柵化圓弧像素的像素,賦予其半徑,開始和結束角度以弧度爲單位,例如:遍歷沿光柵化圓弧

template<typename Functor> 
void arc(float startRadians, float endRadians, int radius, Functor f); 

要等中使用:

arc(0.f, M_PI, 10, [](int x, int y) { 
    std::cout << "got: " << x << " " << y << "\n"; 
}); 

有幾個漁獲:

  • 像素具有整數coordi納茨
  • radius也給出爲一個整數
  • 的光柵化的電弧有效地是在半徑radius的圓弧和半徑radius-1

的圓弧在下面的畫面之間的扇區的每個像素:

  • 藍色像素已被訪問,紅色像素是下一個要訪問的
  • 圓弧由開始/結束角定義的兩條徑向線限定,並且兩弧之間的扇區radius,radius-1
  • 最後,如果要繪製每個半徑爲0到100的圓弧,角度爲0到2 * PI,那麼我們將得到半徑爲100的填充圓盤/圓和沒有像素會被訪問兩次

我認爲Bresenham's circle algorithm不直接適用於這個問題,因爲角度約束和訪問順序。

在計算器,我相信這是最密切相關的問題:

最後,OpenCV的類似的精神相關的東西/,但僅限於行:

enter image description here

+4

呃,不,布氏算法正是你想要的...你只需要邏輯添加到基本的算法:跳過8象限優化(按照您希望的順序分別繪製每個象限的子功能),並觀察其重要象限內的進/出角度。另一種選擇是直接使用浮點計算。 –

+0

哦,所以你的想法是使用標準的Bresenham生成所有點,只是濾除掉所需角度/象限的那些點? Bresenham是否具有訪問所有像素(在每個整數半徑被光柵化時填充光盤)而不是兩次訪問像素的所需屬性? –

+0

不,僅生成象限所需的部分(當y/x或x/y達到tan(角度)限制時停止) – MBo

回答

0

看看cvLinearPolar()

它將圖像從x,y座標系映射到極座標。生成的圖像是行 - >角度和列 - >半徑。你在那個時候的rastering將循環行列順序沒有特殊功能的光柵。

這意味着每行都是dtheta = 2*Pi/(rowNum),因此您的電弧將爲 爲startAngle = angle1/dtheta並且同樣爲endAngle = angle2/dtheta

同樣你的半徑計算drad = maxRad/(columnNum)

因此要獲得從極地圖像的弧線:

for(int i = maxRad; i > 0; i--) // start at longest radius spiral in 
{ 
for(int j = startAngle; j < endAngle;j++) angle 
{ 
    // do action on polarImage[i,j]; 
} 

}