2017-01-16 36 views
0

創建圈子我使用的處理,我試圖創建一個從我有我的屏幕上的像素的圓。 我設法拉出屏幕上的像素,並創建一個不斷增長的圈子。處理 - 從當前像素

但是我正在尋找的東西複雜得多,我想使它看起來好像在顯示屏上的像素從他們目前的位置移動,並形成轉彎半徑或類似這樣的東西。

這是我現在:

int c = 0; 
    int radius = 30; 
    allPixels = removeBlackP(); 
    void draw { 
    loadPixels(); 
    for (int alpha = 0; alpha < 360; alpha++) 
    { 

     float xf = 350 + radius*cos(alpha); 
     float yf = 350 + radius*sin(alpha); 
     int x = (int) xf; 
     int y = (int) yf; 
     if (radius > 200) {radius =30;break;} 
     if (c> allPixels.length) {c= 0;} 
     pixels[y*700 +x] = allPixels[c]; 
     updatePixels(); 
    } 
    radius++; 
    c++; 
    } 

功能removeBlackP全像素返回數組除了黑色的。

此代碼對我的作品。有一個問題,圓圈只有int的數字,所以看起來像圈內的一些像素不會填充,我可以忍受這一點。我正在尋找更復雜的東西,就像我解釋的那樣。

謝謝!

回答

1

填充屬於循環掃描線的所有像素。使用這種方法,您將繪製圓內的所有地方。對於每一行計算起始座標(末尾一個是對稱的)。僞代碼:

for y = center_y - radius; y <= center_y + radius; y++ 
    dx = Sqrt(radius * radius - y * y) 
    for x = center_x - dx; x <= center_x + dx; x++ 
      fill a[y, x] 

當你發現所有像素地方,你可以讓初始像素地方,計算者之間的相關性和移動他們一步一步的。

例如,如果相對於中心點爲第k個像素初始座標是(X0,Y0)和最終的座標爲(X1,Y1),並且要進行米爲,通過螺旋運動象素,計算中間座標:

calc values once: 
r0 = Sqrt(x0*x0 + y0*y0) //Math.Hypot if available 
r1 = Sqrt(x1*x1 + y1*y1) 
fi0 = Math.Atan2(y0, x0) 
fi1 = Math.Atan2(y1, x1) 
if fi1 < fi0 then 
    fi1 = fi1 + 2 * Pi; 

for i = 1; i <=M ; i++ 
    x = (r0 + i/M * (r1 - r0)) * Cos(fi0 + i/M * (fi1 - fi0)) 
    y = (r0 + i/M * (r1 - r0)) * Sin(fi0 + i/M * (fi1 - fi0)) 
    shift by center coordinates  
0

在Processing中繪製圓的方式看起來有些複雜。

最簡單的方法是使用ellipse()功能,不涉及像素雖然:

如果您確實需要繪製一個橢圓,並使用像素,可以利用PGraphics這類似於使用單獨的緩存/ 「圖層」來繪製使用處理繪圖命令,但它也有pixels[]您可以訪問。

比方說,你想畫一個低分辨率像素圈圈,你可以創建一個小PGraphics,使用平滑處理,繪製圓形,然後渲染圈在一個更高的分辨率。唯一的缺點是這些繪圖命令必須放在內beginDraw()/endDraw()呼叫:

PGraphics buffer; 

void setup(){ 
    //disable sketch's aliasing 
    noSmooth(); 

    buffer = createGraphics(25,25); 
    buffer.beginDraw(); 
    //disable buffer's aliasing 
    buffer.noSmooth(); 
    buffer.noFill(); 
    buffer.stroke(255); 
    buffer.endDraw(); 
} 
void draw(){ 
    background(255); 

    //draw small circle 
    float circleSize = map(sin(frameCount * .01),-1.0,1.0,0.0,20.0); 
    buffer.beginDraw(); 
    buffer.background(0); 
    buffer.ellipse(buffer.width/2,buffer.height/2, circleSize,circleSize); 
    buffer.endDraw(); 

    //render small circle at higher resolution (blocky - no aliasing) 
    image(buffer,0,0,width,height); 
} 

如果要使用pixels[]你是在使用極性到笛卡爾轉換公式(X = COS(右側手動繪製一個圓角)*半徑,Y = SIN(角)*半徑)。甚至雖然它着眼於繪製放射漸變,則可以在this answer

找到繪製使用像素的圓(很多實際上)的一個例子