?

Log in

No account? Create an account
Перспектива - хаос и creation [entries|archive|friends|userinfo]
Sergei Sokolov

[ website | Serge!Sokolov ]
[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

Перспектива
[ ]
[окт. 23, 2008|08:42 am]
Previous Entry Поделиться Next Entry

treees
Баловство c Processing'ом. На этот раз рекурсивные функции: каждая палочка рисует две самих себя поменьше и потоньше, под углом туда и сюда. Ну ещё параметр перспективы, делающий цвет светлее и линии тоньше.
Этот вариант экспортирует картинку в векторе в PDF.
Каждый запуск программы даёт слегка разные результаты, т.к. используется шум Перлина для разнообразия веток.
import processing.pdf.*;
void setup() 
{
  size(800, 270, PDF, "treees#.pdf");
  background(212);
  smooth();
  noLoop();
}

void draw() 
{
  drawLine(650, 238, 15, 0.1, 8, 90);  
  drawLine(580, 242, 25, -0.06, 10, 80);  
  drawLine(130, 245, 25, 0.06, 10, 80);  
  drawLine(280, 260, 50, 0.02, 10, 0);
}

void drawLine(float x, float y, float L, float azimuth, int level, int pers) 
// x,y - start point, L length, azimuth - direction, iteration number, perspective (0...100, 100 - farmost)
{                    
  L *= 0.7+0.6*noise(x/2,y/2);
  azimuth *= 0.9+0.2*noise(x/2,y/2);
  float kLength = 0.8, kDist = 0.025, angle = PI/6;
  strokeWeight(level*(100-pers)/100);
  stroke(20+100*pers/100);
  line(x,y,x+L*sin(azimuth),y-L*cos(azimuth));
  if(level > 1) {
    level = level - 1;
    float startX1 = x+L*sin(azimuth)+L*kDist*sin(azimuth+angle);
    float startY1 = y-L*cos(azimuth)-L*kDist*cos(azimuth+angle);
    float startX2 = x+L*sin(azimuth)+L*kDist*sin(azimuth-angle);
    float startY2 = y-L*cos(azimuth)-L*kDist*cos(azimuth-angle);
    drawLine(startX1, startY1, L*kLength, azimuth+angle, level, pers);
    drawLine(startX2, startY2, L*kLength, azimuth-angle, level, pers);
  }
}
СсылкаОтветить