Главная » Processing » Рисуем произвольные фигуры в Processing

0

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

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

Как это делается

Сначала напишем код для функции setup(). Я использовал функцию frameRate() для того, чтобы скетч работал со скоростью один кадр в секунду.

void setup()

{

size( 640, 480 );

smooth(); frameRate( 1 );

}

Следующее, что мы сделаем – напишем функцию рисования звезды. У нашей функции будет три параметра: одно целое число для ввода количества лучей и две переменные для внутреннего и внешнего радиуса звезды.

void star( int numSpikes, float innerRadius, float outerRadius )

{

int numVertices = numSpikes * 2;

float angleStep = TWO_PI / numVertices;

beginShape();

for ( int i = 0; i < numVertices; i++ ) { float x, y;

if ( i % 2 == 0 ) {

x = cos( angleStep * i ) * outerRadius; y = sin( angleStep * i ) * outerRadius;

} else {

x = cos( angleStep * i ) * innerRadius; y = sin( angleStep * i ) * innerRadius;

}

vertex( x, y );

}

endShape( CLOSE );

}

Функция цветка аналогична функции звезды. Единственная разница состоит в том, что здесь для создания естественных линий лепестков цветка мы применим функцию bezierVertex().

void flower( int numLeafs, float innerRadius, float outerRadius )

{

float angleStep = TWO_PI / numLeafs;

beginShape();

float startX = cos( 0 ) * innerRadius; float startY = sin( 0 ) * outerRadius; vertex( startX, startY );

for ( int i = 0; i < numLeafs; i++ ) {

float cx1 = cos( angleStep * i ) * outerRadius; float cy1 = sin( angleStep * i ) * outerRadius; float x2 = cos( angleStep * (i + 1) ) * innerRadius; float y2 = sin( angleStep * (i + 1) ) * innerRadius;

float cx2 = cos( angleStep * (i + 1) ) * outerRadius; float cy2 = sin( angleStep * (i + 1) ) * outerRadius; bezierVertex( cx1, cy1, cx2, cy2, x2, y2 );

}

endShape( CLOSE );

}

Мы применим функции star() и flower(), которые мы только что написали, в функции draw(). В каждом кадре скетч нарисует 75 фигур. Вероятность появления каждой фигуры равна 50 процентам.

void draw()

{

background( 0 ); noStroke();

for ( int i = 0; i < 75; i++ ) {

int numPoints = floor( random( 4, 8 ) ); float innerRadius = random( 20, 40 ); float outerRadius = random( 50, 100 );

pushMatrix();

translate( random( width ), random( height ) ); if ( random( 100 ) < 50 ) {

fill( 255, 255, 0, 64 );

star( numPoints, innerRadius, outerRadius );

} else {

fill( 255, 0, 0, 64 );

flower( numPoints, innerRadius, outerRadius );

}

popMatrix();

}

}

В результате вы получите что-то похожее на этот скриншот:

Как это работает

Функция beginShape() используется в паре с функцией endShape(). Если вы хотите фигуру с замкнутым контуром, добавьте параметр CLOSE к функции endShape(). Эти функции соединяют все вершины, указанные между ними. Если вы используете функцию vertex(), эти точки будут соединены прямыми линиями. Для соединения точек кривыми есть функции bezierVertex() и curveVertex(). Они работают так же, как функции bezier() и curve(), но у них шесть параметров. Первая опорная точка не указывается, так как она является последней в предыдущей функции.

Заметьте, что перед функциями bezierVertex() и curveVertex() вам нужно использовать функцию vertex().

Дополнительно

Processing использует радианы для указания углов. Это может быть неудобно для тех, кто привык к другой системе измерения. Для вычисления синуса или косинуса вы можете использовать градусы, предварительно конвертировав их в радианы. Это делается с помощью функции radians(). Для конвертирования радиан в градусы есть функция degrees(). В Processing есть несколько распространенных математических констант, которые вы часто используете, когда занимаетесь тригонометрией. В наших функциях мы использовали константу TWO_PI, представляющую собой число радиан в полном круге. Также доступны QUARTER_PI, THIRD_PI, HALF_PI и PI.

Источник: Ян Вантомм, Processing 2: креативное программирование, перевод с английского Александры Мишутиной, Published by Packt Publishing Ltd., 2012, BIRMINGHAM – MUMBAI.

По теме:

  • Комментарии