Вчера разбирал папку 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);
}
}
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) - заливка красным. С треугольниками пока не все понятно - как они рисуются?
Комментарии
Отправить комментарий