Знакомство с Processing

 

Вчера разбирал папку Processing, в которой свалены файлы - книги, документация и наброски(sketches.pde). Просмотрел наброски и обнаружил, что часть не работает на версии 3.5.4/2.2.1. Моих знаний языка программирования не хватило на исправление кода, к тому же я давно собирался получить общее представление о программировании. Вечером стал читать документацию. Набросок содержит две процедуры: setup() - настройка программы и установка размера окна, draw() - рисование изображения. Для тренировки я решил нарисовать градиент - это пригодится для следующей задумки:

grad.pde

color[] col = new color[256];
void setup() {
  size(512, 512); // Set the window size
  background(0);
  
for (int i = 0; i < 256; i = i+1) {
  int r,g,b;
    if (i<128)
  {
    r=(127-i)*2;
    b=r;
    g=0;
  } else {
    r=2*(i&127);
    b=0;
    g=r;
  }
 
  col[i]=color(r,g,b);
}

}
void draw() {
//  noStroke(); // Turn off stroke (outline) for shapes
  int j;
for (int i = 0; i < 512; i = i+1) {
  if (i<256)
  {
    j=col[i];
  } else {
    j=0;
  }
  stroke( j );
  line(i,0,i,511);
}
}

После нескольких  попыток получил набор для 256 цветов. Утром я продолжил код.
elec.pde
class mPoint
{
  int x,y;
  int dx,dy;
}

mPoint[] pts;

void setup()
{
size(512,512);
pts=new mPoint[2];
pts[0]=new mPoint();
pts[1]=new mPoint();
pts[0].x=127;
pts[0].y=0;
pts[0].dx=1;
pts[0].dy=1;

pts[1].x=250;
pts[1].y=255;
pts[1].dx=-1;
pts[1].dy=1;

}
int dist(int x0,int y0,int x1,int y1)
{
  return round(255*(x0-x1)*(x0-x1)/(1+(x0-x1)*(x0-x1)+(y0-y1)*(y0-y1)));
}
void movep(int ind)
{
  int vv=pts[ind].x+pts[ind].dx;
  pts[ind].x=vv;
  if (vv==0 ||vv==512)
  {
    pts[ind].dx=-pts[ind].dx;
  }

  vv=pts[ind].y+pts[ind].dy;
  pts[ind].y=vv;
  if (vv==0 ||vv==512)
  {
    pts[ind].dy=-pts[ind].dy;
  }

}
void draw()
{
background(0);
for (int x = 0; x < 512; x = x+1) {
  for (int y = 0; y < 512; y = y+1) {
    int co=dist(x,y,pts[0].x,pts[0].y)+dist(x,y,pts[1].x,pts[1].y);
    if (co>255)
    {
      co=(co^255)&255;
    }
    set(x,y,color(co&255,0,0));
  }
}
for (int x = 0; x < 4; x = x+1) {
movep(0);
movep(1);
}
}
Самым сложным было использование массива структур mPoint, пока не разобрался с инициализацией элемента значениями. Дальше сложнее - не получилось совместить с палитрой градиента, поэтому я немного упростил:
elec2.pde
class mPoint
{
  int x,y;
  int dx,dy;
}

mPoint[] pts;

void setup()
{
size(512,512);
pts=new mPoint[2];
pts[0]=new mPoint();
pts[1]=new mPoint();
pts[0].x=127;
pts[0].y=0;
pts[0].dx=1;
pts[0].dy=1;

pts[1].x=250;
pts[1].y=255;
pts[1].dx=-1;
pts[1].dy=1;

}
int dist(int x0,int y0,int x1,int y1)
{
  return round(255*(x0-x1)*(x0-x1)/(1+(x0-x1)*(x0-x1)+(y0-y1)*(y0-y1)));
}

void movep(int ind)
{
  int vv=pts[ind].x+pts[ind].dx;
  pts[ind].x=vv;
  if (vv==0 ||vv==512)
  {
    pts[ind].dx=-pts[ind].dx;
  }

  vv=pts[ind].y+pts[ind].dy;
  pts[ind].y=vv;
  if (vv==0 ||vv==512)
  {
    pts[ind].dy=-pts[ind].dy;
  }

}


void draw()
{
background(0);
for (int x = 0; x < 512; x = x+1) {
  for (int y = 0; y < 512; y = y+1) {
    int co=dist(x,y,pts[0].x,pts[0].y)+dist(x,y,pts[1].x,pts[1].y);
    if (co>255)
    {
      co=(co^255);
    }
co=co&255;

  int r,g,b;

    if (co<128)
  {
    r=(127-co)*2;
    b=r;
    g=0;
  } else {
    r=2*(co&127);
    b=0;
    g=r;
  }
 

    set(x,y,color(r,g,b));
  }
}
for (int x = 0; x < 4; x = x+1) {
movep(0);
movep(1);
}
}
Файлы здесь. Поверхностное чтение подсказало, что есть немало интересных функций, которые хотелось применить.

Дополнение 26.09.2025. Добавил пару набросков sqrot и pbrot. Квадраты рисуются, если выбран режим rectMode(CENTER), fill(#FF0000) - заливка красным. С треугольниками пока не все понятно - как они рисуются?

Комментарии