2017-01-16 14 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] 

Когда вы найдете места для всех пикселей, вы можете сделать корреляцию между начальными пикселями местами и расчетными и перемещать их шаг за шагом.

Например, если начальные координаты по отношению к центральной точке для к-го пиксела (x0, y0) и конечные координаты (x1, y1), и вы хотите сделать M шагов, двигаясь пиксель за спирали, вычислить промежуточные координаты:

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

То, как вы собираетесь рисовать круги в обработке, выглядит немного запутанным.

Самый простой способ заключается в использовании функции 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[] вы на праве, используя полярную для декартовой формулы преобразования (х = соз (угол) * радиус, y = sin (угол) * радиус). Даже если он фокусируется на рисовании радиального градиента, вы можете найти пример рисования круга (фактически на самом деле) с использованием пикселей в this answer