2017-01-16 71 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

找到绘制使用像素的圆(很多实际上)的一个例子