10

Рисуем красивые фигуры 2.0

Этот пост является продолжением моего поста Когда нечего делать вечером.

Решил пойти дальше и вместо десктопного приложения запилить веб. Опубликовал на Heroku.
Адрес: http://draw-figure.herokuapp.com, можете пробовать!

Итак, вот что мы имеем.

Рисуем красивые фигуры 2.0 Программирование, Рисование, Геометрия, Видео, Длиннопост

Три пункта меню: Polygon Spiral, Polygon Spiral Group, Polygon Star.
Первые два пункта повторяют всё то, что было проделано в первом посте (напоминаю, там рисовались «спирали» из треугольников, посмотреть видео можно тут). Третий пункт предназначен для рисования новой фигуры (буду далее называть ее «звезда»).

Теперь обо всём по порядку.

1. Polygon Spiral

Рисует «спираль» на правильном многоугольнике.

Рисуем красивые фигуры 2.0 Программирование, Рисование, Геометрия, Видео, Длиннопост

Для построения необходимо указать 4 параметра (здесь и далее размерность – пиксели):

a. Vertex count – количество вершин многоугольника (целое число от 3 до 50);
b. Circle radius – радиус описанной около многоугольника окружности (целое число от 1 до 5000);
c. Line spacing – расстояние между соседними линиями, образующими «спираль» (дробное число, большее либо равное 1.5);
d. Drawing direction – направление рисования «спирали» (по часовой или против часовой стрелки).

2. Polygon Spiral Group

Позволяет на одном изображении рисовать несколько «спиралей», в основе которых лежат произвольные (не обязательно правильные) выпуклые многоугольники.

Рисуем красивые фигуры 2.0 Программирование, Рисование, Геометрия, Видео, Длиннопост

Тут всё немного сложнее. Необходимо указать описание желаемого изображения.
Описание состоит из нескольких строк.

1-я строка содержит два положительных числа, разделенных пробелом, – ширину и высоту изображения.

Далее допустимо произвольное число строк. Каждая из них описывает многоугольник в следующем формате:  x1,y1  x2,y2  ...  xn,yn  d  s.
Здесь:
x1,y1 x2,y2 ... xn,yn – координаты вершин многоугольника в порядке обхода;
d – направление рисования «спирали» (0 – по часовой стрелке, 1 – против часовой стрелки);
s – расстояние между соседними линиями, образующими «спираль» (дробное число, большее либо равное 1.5).

Небольшой графический комментарий для ясности:

Рисуем красивые фигуры 2.0 Программирование, Рисование, Геометрия, Видео, Длиннопост

Также можно попробовать разные примеры, нажав на кнопки Case 1, Case 2 и Case 3.

3. Polygon Star

Вот принцип рисования части «звезды»:

Программа позволяет рисовать «звезду» на правильном многоугольнике.

Рисуем красивые фигуры 2.0 Программирование, Рисование, Геометрия, Видео, Длиннопост

Для построения необходимо указать 3 параметра:

a. Vertex count – количество вершин многоугольника (целое число от 3 до 100);
b. Circle radius – радиус описанной около многоугольника окружности (целое число от 1 до 5000);
c. Split count – на сколько частей разбивается радиус окружности (целое число от 0 до 500).

Несколько интересных примеров:

Рисуем красивые фигуры 2.0 Программирование, Рисование, Геометрия, Видео, Длиннопост

На этом всё! Еще раз, адрес приложения: http://draw-figure.herokuapp.com. Если у вас есть какие-нибудь интересные идеи – предлагайте!

Найдены возможные дубликаты

+2

материальчик прикольный может получиться, завтра поподробней попробую

раскрыть ветку 3
+1
Ничего не понятно, но очень интересно) Можете рассказать подробнее?
раскрыть ветку 2
+2

я не знаю зачем, но сохраню на всякий, люблю неведомую ебанину)

раскрыть ветку 1
+1

вот и я так.

Похожие посты
178

Программирование на FANUC (Поиск середины заготовки на поворотной оси)

Программирование на FANUC (Поиск середины заготовки на поворотной оси) Fanuc, ЧПУ, Cnc, Программирование, Металлообработка, Геометрия, Длиннопост
Программирование на FANUC (Поиск середины заготовки на поворотной оси) Fanuc, ЧПУ, Cnc, Программирование, Металлообработка, Геометрия, Длиннопост
Программирование на FANUC (Поиск середины заготовки на поворотной оси) Fanuc, ЧПУ, Cnc, Программирование, Металлообработка, Геометрия, Длиннопост
Программирование на FANUC (Поиск середины заготовки на поворотной оси) Fanuc, ЧПУ, Cnc, Программирование, Металлообработка, Геометрия, Длиннопост
Программирование на FANUC (Поиск середины заготовки на поворотной оси) Fanuc, ЧПУ, Cnc, Программирование, Металлообработка, Геометрия, Длиннопост
Программирование на FANUC (Поиск середины заготовки на поворотной оси) Fanuc, ЧПУ, Cnc, Программирование, Металлообработка, Геометрия, Длиннопост
Показать полностью 5
287

Когда нечего делать вечером

Когда нечего делать вечером Графика, Программирование, Рисование, Длиннопост, Гифка, Рукоделие с процессом
Когда нечего делать вечером Графика, Программирование, Рисование, Длиннопост, Гифка, Рукоделие с процессом
Когда нечего делать вечером Графика, Программирование, Рисование, Длиннопост, Гифка, Рукоделие с процессом
Когда нечего делать вечером Графика, Программирование, Рисование, Длиннопост, Гифка, Рукоделие с процессом
Когда нечего делать вечером Графика, Программирование, Рисование, Длиннопост, Гифка, Рукоделие с процессом
Когда нечего делать вечером Графика, Программирование, Рисование, Длиннопост, Гифка, Рукоделие с процессом
Показать полностью 5
174

Рисуем в 3d на c++ поверхность, заданную формулой

Рисуем в 3d на c++ поверхность, заданную формулой C++, Программирование, 3D, Визуализация, Рендер, Геометрия, Алгебра, Вектор, Длиннопост
Рисуем в 3d на c++ поверхность, заданную формулой C++, Программирование, 3D, Визуализация, Рендер, Геометрия, Алгебра, Вектор, Длиннопост
dX[0] = tv[1]*dY[2] - tv[2]*dY[1];
dX[1] = tv[2]*dY[0] - tv[0]*dY[2];
dX[2] = tv[0]*dY[1] - tv[1]*dY[0];
dX[0] /= max_x;
dX[1] /= max_x;
dX[2] /= max_x;
dY[0] /= max_x;
dY[1] /= max_x;
dY[2] /= max_x;
Рисуем в 3d на c++ поверхность, заданную формулой C++, Программирование, 3D, Визуализация, Рендер, Геометрия, Алгебра, Вектор, Длиннопост
for (int y = 0; y <= max_y; ++y) {
for (int x = 0; x <= max_x; ++x) {
tv[0] = dZ[0]+x*dX[0]+y*dY[0];
tv[1] = dZ[1]+x*dX[1]+y*dY[1];
tv[2] = dZ[2]+x*dX[2]+y*dY[2];
// tv – вектор, показывающий направление луча из точки [x,y] экрана
// ...
};
};
Рисуем в 3d на c++ поверхность, заданную формулой C++, Программирование, 3D, Визуализация, Рендер, Геометрия, Алгебра, Вектор, Длиннопост
Рисуем в 3d на c++ поверхность, заданную формулой C++, Программирование, 3D, Визуализация, Рендер, Геометрия, Алгебра, Вектор, Длиннопост
Рисуем в 3d на c++ поверхность, заданную формулой C++, Программирование, 3D, Визуализация, Рендер, Геометрия, Алгебра, Вектор, Длиннопост
ddX[3] = {0,0,0}; // единичный вектор, который направлен вдоль оси X нашей поверхности
ddY[3] = {0,0,0}; // единичный вектор, который направлен вдоль оси Y нашей поверхности
ddZ[3] = {0,0,0}; // единичный вектор, который направлен вдоль оси Z нашей поверхности
ddX[0] = point2[0] - point[0];
ddX[1] = point2[1] - point[1];
ddX[2] = point2[2] - point[2];
len = sqrt(ddX[0]*ddX[0]+ddX[1]*ddX[1]+ddX[2] *ddX[2]) ;
ddX[0]/=len;
ddX[1]/=len;
ddX[2]/=len;
ddY[0] = ddX[1]*ddZ[2] - ddX[2]*ddZ[1];
ddY[1] = ddX[2]*ddZ[0] - ddX[0]*ddZ[2];
ddY[2] = ddX[0]*ddZ[1] - ddX[1]*ddZ[0];
spoint[0] = point[0] - z * ddZ[0];
spoint[1] = point[1] - z * ddZ[1];
spoint[2] = point[2] - z * ddZ[2];
n[0] = -ddZ[0];
n[1] = -ddZ[1];
n[2] = -ddZ[2];
Рисуем в 3d на c++ поверхность, заданную формулой C++, Программирование, 3D, Визуализация, Рендер, Геометрия, Алгебра, Вектор, Длиннопост
float MulVecSc(float *Vec1, float *Vec2){
return Vec1[0]*Vec2[0] + Vec1[1]*Vec2[1] + Vec1[2]*Vec2[2];
};
vp[0] = point[0] - tp[0];
vp[1] = point[1] - tp[1];
vp[2] = point[2] - tp[2];
p = MulVecSc(n,tv);
h = MulVecSc(n,vp);
t = - h/p;
float ddY[3] = {point2[0],point2[1],point2[2]};
float ddX[3] = {0,0,0};
float ddZ[3] = {n[0],n[1],n[2]};
tmMulVec(n,ddY,ddX);
// 6 плоскостей. Ищем самый поздний "вход" и самый ранний "выход"
// Плоскость 1
spoint[0] = point[0] + x * ddX[0];
spoint[1] = point[1] + x * ddX[1];
spoint[2] = point[2] + x * ddX[2];
vp[0] = tp[0]-spoint[0];
vp[1] = tp[1]-spoint[1];
vp[2] = tp[2]-spoint[2];
n[0] = ddX[0];
n[1] = ddX[1];
n[2] = ddX[2];
p = tmMulVecSc(lv_n,tv);
t = - tmMulVecSc(lv_n,lv_vp)/p;
if(p>0.0f){ // выход
if(t<t_out)
t_out = t;
}else{ // вход
if(t>t_in)
t_in = t;
};
// Плоскость 2
spoint[0] = point[0] - x * ddX[0];
spoint[1] = point[1] - x * ddX[1];
spoint[2] = point[2] - x * ddX[2];
vp[0] = tp[0]-spoint[0];
vp[1] = tp[1]-spoint[1];
vp[2] = tp[2]-spoint[2];
n[0] = -ddX[0];
n[1] = -ddX[1];
n[2] = -ddX[2];
p = tmMulVecSc(lv_n,tv);
t = - tmMulVecSc(lv_n,lv_vp)/p;
if(p>0.0f){ // выход
if(t<t_out)
t_out = t;
}else{ // вход
if(t>t_in)
t_in = t;
};
// Плоскость 3
// ...
// Плоскость 4
// …
// Плоскость 5
// …
// Плоскость 6
// ...
if(t_in<t_out&&t_out>0){
// есть пересечение
};
Так. Теперь мы знаем, что в промежутке от t_in до t_out мы внутри параллелепипеда.
Дальше, как и планировали, будем проверять каждую точку с неким шагом h на то, находится она выше или ниже поверхности в локальных координатах.
Что такое локальные координаты?
Рисуем в 3d на c++ поверхность, заданную формулой C++, Программирование, 3D, Визуализация, Рендер, Геометрия, Алгебра, Вектор, Длиннопост
vtp[0] = p[0]-point[0];
vtp[1] = p[1]-point[1];
vtp[2] = p[2]-point[2];
x = MulVecSc(ddX,vtp);
y = MulVecSc(ddY,vtp);
z = MulVecSc(ddZ,vtp);
F = F_xy; // тут у нас определение значения функции, описывающей плоскость. Его мы рассмотрим позже, в 3й части.
if(z<F){ // определяем, находимся мы в точке входа «над» или «под» поверхностью
in = true;
}else{
in = false;
};
for(t = t_in+h;t<=t_out;t+=h){
pt[0] = tp[0] + tv[0]*t;
pt[1] = tp[1] + tv[1]*t;
pt[2] = tp[2] + tv[2]*t;
vtp[0] = point[0]-pt[0];
vtp[1] = point[1]-pt[1];
vtp[2] = point[2]-pt[2];
x = -tmMulVecSc(ddX,vtp);
y = -tmMulVecSc(ddY,vtp);
z = -tmMulVecSc(ddZ,vtp);
F = F_xy;
if(z<F){ // сейчас внутри
if(!in){ // были снаружи
break;
};// были снаружи
}else{ // сейчас снаружи
if(in){ //были внутри
break;
};//были внутри
}; // внутри/снаружи
}; // for t_in ... t_out
if(t>=t_out){
break; // никакого пересечения не было
};
// на данный момент t – это расстояние от точки tp до точки пересечения
// фактически точка на расстоянии t уже после пересечения с плоскостью, поэтому
// в качестве точки пересечения берем t-h
t-=h
collision_pt[0] = tp[0] + tv[0]*t;
collision_pt[1] = tp[1] + tv[1]*t;
collision_pt[2] = tp[2] + tv[2]*t;
Рисуем в 3d на c++ поверхность, заданную формулой C++, Программирование, 3D, Визуализация, Рендер, Геометрия, Алгебра, Вектор, Длиннопост
#define F_xy cos((x*x+y*y)/20.0)/(1+(x*x+y*y)/100.0)
Рисуем в 3d на c++ поверхность, заданную формулой C++, Программирование, 3D, Визуализация, Рендер, Геометрия, Алгебра, Вектор, Длиннопост
Рисуем в 3d на c++ поверхность, заданную формулой C++, Программирование, 3D, Визуализация, Рендер, Геометрия, Алгебра, Вектор, Длиннопост
Рисуем в 3d на c++ поверхность, заданную формулой C++, Программирование, 3D, Визуализация, Рендер, Геометрия, Алгебра, Вектор, Длиннопост
#define F_x ((sin((x*x+y*y)/20.0)*x/10.0)*(1+(x*x+y*y)/100.0)-(x/50.0)*cos((x*x+y*y)/20.0))/((1+(x*x+y*y)/100.0)*(1+(x*x+y*y)/100.0))
#define F_y ((sin((x*x+y*y)/20.0)*y/10.0)*(1+(x*x+y*y)/100.0)-(y/50.0)*cos((x*x+y*y)/20.0))/((1+(x*x+y*y)/100.0)*(1+(x*x+y*y)/100.0))
#define F_z 1.0
float Fx = F_x;
float Fy = F_y;
float Fz = F_z;
collision_normal[0] = ddX[0]*Fx+ddY[0]*Fy+ddZ[0]*Fz;
collision_normal[1] = ddX[1]*Fx+ddY[1]*Fy+ddZ[1]*Fz;
collision_normal[2] = ddX[2]*Fx+ddY[2]*Fy+ddZ[2]*Fz;
Shade = 255.0f * MulVecSc(collision_normal,tv);
if(Shade < 0)
Shade = -Shade;
r = Shade * rgb[0];
g = Shade * rgb[1];
b = Shade * rgb[2];
Рисуем в 3d на c++ поверхность, заданную формулой C++, Программирование, 3D, Визуализация, Рендер, Геометрия, Алгебра, Вектор, Длиннопост
#define F_xy 0.3*(sin(x)*cos(y/2.0)+cos(x/2.5)*sin(y/1.5))
#define F_x -0.3*(cos(x)*cos(y/2.0)-sin(x/2.5)*sin(y/1.5))
#define F_y -0.3*(-sin(x)*sin(y/2.0)+cos(x/2.5)*cos(y/1.5))
Рисуем в 3d на c++ поверхность, заданную формулой C++, Программирование, 3D, Визуализация, Рендер, Геометрия, Алгебра, Вектор, Длиннопост
Рисуем в 3d на c++ поверхность, заданную формулой C++, Программирование, 3D, Визуализация, Рендер, Геометрия, Алгебра, Вектор, Длиннопост
Рисуем в 3d на c++ поверхность, заданную формулой C++, Программирование, 3D, Визуализация, Рендер, Геометрия, Алгебра, Вектор, Длиннопост
Показать полностью 15
306

Мой первый "Фотошоп"

Мой первый "Фотошоп" Photoshop, Basic, Рисование, Программа, Язык, Программирование, Детство, Длиннопост
Мой первый "Фотошоп" Photoshop, Basic, Рисование, Программа, Язык, Программирование, Детство, Длиннопост
Мой первый "Фотошоп" Photoshop, Basic, Рисование, Программа, Язык, Программирование, Детство, Длиннопост
Показать полностью 2
Похожие посты закончились. Возможно, вас заинтересуют другие посты по тегам: