Малюємо довільні фігури в Processing

Квадратів і кіл може виявитися недостатньо для цікавого проекту На щастя, в

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 &lt 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 &lt 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 &lt 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 ) &lt 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

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*