Линии ориентированные на художественное конструирование и творчество

        В системе "Арт-Вектор" на базовом уровне могут задаваться следующие линии:
- отрезок прямой,
- окружность в плоскости xy или ей параллельно,
- дуга окружности/эллипса (там же эллипс),
- кривая Безье (через две точки начала и конца и двух характеристических),
- квадратичная кривая (через две точки начала и конца и одну характеристическую точку),
- кривая Лагранжа в параметрическом виде через четыре точки,
- синусоида,
- кулачек с произвольным числом выступов.

Кроме того, на уровне методов - для решения задач на сопряжение - реализованы различные способы задания дуги окружности и полилинии (кривой состоящих из отрезков прямых).

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

Полилинии можно также преобразовывать в художественную линию, заливать цветом (автоматически концы линии замыкается).


Полилиния - линия состоящая из множества отрезков

Рассмотрим упражнения задания полилинии в зависимости от одного параметра t, изменяющегося от 0 до 1. По аналогии можно моделировать и полиповерхности.

Упражнение 1. Задана линия из двух отрезков. Требуется написать движение точки по этим линиям в зависимости от безразмерного параметра t, который изменяется от 0 до 1, т.е. что при t=0 точка должна находиться в начале ломаной, при t=1 в конечной.
 

Решение. Безразмерный пареметр t надо разбить на столько частей, из скольки состоит ломаная линия. На каждом участке будет свое t0 и t1, для которых нетрудно написать весовые функции по следующему линейному закону

r(t)=(1-(t-t0)/(t1-t0)*ri +(1-(t-t0)/(t1-t0)*rj

где: j=i+1

Алгоритм на языке VBS см. здесь



Упражнение 2. Задана линия из трех отрезков. Требуется также написать движение точки по этим линиям в зависимости от безразмерного параметра t, который изменяется от 0 до 1.

Решение. Алгоритм тот же самый  (в программе вместо t взят параметр v)
r(t)=(1-(t-t0)/(t1-t0)*ri +(1-(t-t0)/(t1-t0)*rj
где: j=i+1

МК формирования полилинии через 4 точки здесь
Применяя данную методику, можно задать полиповерхность, проходящую через множество сечений.


Линии по двум проекциям или по одной проекции и высоте

Такой подход нужен, когда линию контура приходится (например, CorelDraw) импортировать в плоском виде. В системе "Вектор" (см. меню) есть возможность создавать специальный тип линии: по двум проекциям. Идея здесь проста: Если у первой импортируемой линии заданы две координаты, то, импортируя вторую, и взяв у нее координату y и подставим в первую вместо z, то как раз и получим пространственную лилинию. Новая линия из-за разных длин и параметризации, не всегда будет предсказуемой, однако для художественных задач это может оказаться и полезным. Вторая возможность XY-линию имортируемой плоской, а с помощью высоты ко всем ее нулевым z добавляем высоту.

Упражнение 3. Заданы две проекции бортовой линии корпуса судна. Требуется написать МК задание их одной пространственной линией.
Решение. Сначала создаем две проекции бортовой линии в CorelDraw, экспортируем их вместе в формате .dxf.
Создаем МК, в которой импортируем линии из .dxf . Далее к первой линии к ее  z добавляем "y" из второй линии. На рис. ниже показано, что их это вышло.



Художник строит картину на каких-то своих особенностях. Один плетет картину из гладких линий, другой из дрожжащих линий одинаковой или различной толщины (типа макроме), третий чиркает взад-вперед и т.д.
Чиркает взад-вперед такая линия в системе "Арт-Вектор" реализована. Как смоделировать дрожажжую линию, или точнее как сделать, чтобв задаваемая фигура состояла из таких линий. В системе CorelDraw даже есть заливка из таких линий.
Зададим сначала цикл задания горизонтальных  МК и ортогональной сетки линий МК
     
Упражнение 4. Формирования полилинии с заданной степенью ошибки ss по узлам.
Вот пример задания такой МК:
<test.vbs>
Rx = Array(0,0,2,2,4,4,6,6,8,8,10,10,12,12,14)
Ry = Array(0,2,2,-2,-2,2,2,-2,-2,2,2,-2,-2,2,2)
ss= 0.9  ' задание степени точности
randomize ' включить генератор случайных чисел
For n=0 To 13 Step 1
    Polyline.AddP p(Rx(n)+ss*rnd(1),Ry(n)+ss*rnd(1),0)
Next
Polyline.SaveInDoc ( ngroup )
Polyline.Draw
а)                             б)
      
Рис. Полилинии: а) исходная и б) преобразованная с точностью ss=0.9

Упражнения 5. Задать отрезок, у которого точки вычислятся с заданной степенью ошибок МК

Использование данной линии, как типоэлемент в орнаментах см. здесь
Как сделать, чтобы была возможность перезадания линий, у которых узловые точки  формировались  бы случайным  образом с какой степенью точности. В состоянии "Линии" можно ввести команду: "Точность линии" с выходом на уровень задания параметра: "Степень точности линии = 0.5".   При 0 - линия изначальная. При этом параметр фактически может иметь любые значения. 

Четыре важных задачи на сглаживание

      Сглаживание - это сопряжение отрезков, входящих в полилинию, по тому или иному закону.  Сопряжения могут быть вполнены: по квадратичному, кубическому (Безье) законам и по окружности c заданным радиусом скругления (для труб).
Квадратичная параметризация (рис.1) МК Здесь узлами ломаной линии являются точки р1-р2-р3. P12 - середина первого отрезка, р23 - середина второго отрезка. Далее через эти точки и ХТ p2 проводим квадратичную кривую, которая в точках р12 и р23 сопрягается гладко по первой производной это точно.
Рис. 1


Кубическая параметризация (рис.2), МК
Здесь узлами ломаной линии являются точки р1-р2-р3 -p4. P12 - середина первого отрезка, р34 - середина третьего отрезка. Далее через эти точки р1, р4 и ХТ: p2, р3 проводим кубическую кривую, которая в точках р12 и р23 сопрягается гладко по первой производной точно, а в кривой, стоящей из n участков и по второй производной (у них касательные совпадают по направлению и равны между собой).
 
Рис. 2

Сглаживание в осевых линиях для труб

Здесь важно, чтобы расстояние p2-p21 (отстояния от узла сглаживания p2) не были меньше диаметра трубы, и в тоже время этот диаметр не выходил за середину отрезка предыдущего и последующего.
Здесь постановка задачи (рис. 3) и МК.
Рис. 3

Сглаживание при интерполяции

Другой способ сглаживания (см. МК), когда кривая должна пройти жестко через заданные точки. Алгоритм простой (конечно, имея знания начертательной геометрии и пространственного воображения)
 
Рис. Параметр управления 0.41 и -2.41 при интерполяции через три точки


Реализация методов сглаживания в системе "Арт-Вектор"

В 3-м случае (для труб), вместе с параметром управления задается и радиус скругления.

Ошеломляющие результаты вместе с художественными линиями здесь:   1, 2, 3, 4


Квадратичное сглаживание ломаной линии

Напишем МК сопряжения для n  узлов. Во всех рассмотренных случаев для управления кривой сглаживания имеется параметр управления, с помощью которого можно получать самые разнообразные художественные линии. На рис. 4,а параметр сглаживания s=0.5. На рис. 4,б:    s=-0.5. На рис. 4,с:    s = -1.25.
  
Рис. 4. Квадратичное сглаживание с различными значениями параметров управления
 В положительную сторону параметр управления можно взять 0.9999 (кривая в этом случае практически совпадает с ломаной, в отрицательную же сторону параметр s можно увеличивать хоть сколько, получая самые фантастические переливания кривой На рис. 5  в первом случае s = -5, во втором s=-10, а в третьем: s= -100.
  
Рис.5

 Кубическое сглаживание ломаной линии

Дана та же ломаная линия. МК  - здесь идет сопряжение по кривой Безье, у которой две точки берутся на заданной линии, а две промежуточные между ними - Х.Т. На первом рис. полнота кривой Безье 0.5, на второй - 0.99, на третьей S = -3.5
  
Рис. 6
Изменяя шаг (точнее при шаге равном =1) и при s=-2.7, будет две линии:
Рис. 7

Сглаживание ломаной линии для трубной поверхности
Формируем МК
 
Рис. 8. Сглаживание с заданным радиусом сгругления (для труб)

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

В предложеннных МК решаются частные случаи: найденытребуемые дуги сопряжений. Линии в целом получилась разорванными (в числе и для первых двух случаев). Каждую дугу можно превратить в полилинию, а вот объединить несколько полилинии в одну (например, добавить текущую полилинию в ранее заданную) - такой операции нет, и это можно сделать пока только на системной уровне.


Несколько задач, связанных с полилиниями

- Расчет длины полилинии;
- расчет ординаты на кривой от x (также от y и z);
- пересечение отрезка прямой, линии с полилинием;
- пересечение двух полилиний, окраска отрезков, входящих в поллинию;
- по методу случайных числе;
- разбивка области, замыкающей  полилинией, на треугольники, и соответственно;
- расчет площади и заливка цветом и т.д.

Расчет точки на полилинии и касательного вектора в ней реализованы на уровне 2-х методов:
Set A = Polyline.P (t) - точка А на полилинии от параметра t,  вычисляется после задания полилинии. Параметр t изменяется от 0 до 1.
Set T = Polyline.T (t) - единичный вектор T касательного отрезка на полилинии от параметра t.  Вычисляется после задания полилинии. Надо помнить, что единичный вектор исходит из 0-й точки.

Упражнение. Построить отрезок AB длиной S см, который бы выходил из точки А по направлению касательного вектора T. Пусть какая-то линия задана в диалоге. К МК обращаемся с помощью ее вызова. Вот что будет происходить после задания линии в диалоге:

Рис. 9. Касательный вектор в заданной точке на кривой
<Kas_vector.vbs>
Polyline.FromCurrObj 99  ' - преобразуем линию в полилинию
CurrObjNmb = LastNmb   ' - активизируем полилинию (так приходится делать)
s=4                                 ' длина отрезка
u=0.5                              ' параметр изменяющийся от 0 до 1
Set A = Polyline.P (u)       ' вычисляем точку от параметра u (здесь u=0.5)
Set T = Polyline.T (u)       ' вычисляем вектор T от параметра u (u=0.5)
Bx = A.x+s*T.x                ' складываем по-компонентно - отдельно  для x,y,z
By = A.y+s*T.y
Bz = A.z+s*T.z
Set B = p(Bx,By,Bz)
Otrezok.ss A,B
Width=120


Упражнение 2. Определить длину кривой Безье, заданной в диалоге.
Решение. Задача решается вначале также как предыдущая: линию (в принципе, преобразование будет происходить для любой преобразовываем в полилинию. Далее организуем цикл и в цикле в зависимости от параметра u перебираем точки на линии и тут же вычисляем длину отрезка от текущей точки  до предыдущей, которые суммируем. Точность длины будет зависеть от шага перебираемых точек.

' Длина полилинии
Polyline.FromCurrObj 99
CurrObjNmb = LastNmb
Set B = Polyline.P (0)
s= 0.1 ' шаг
For u=s  To 1 Step s
 Set pi = Polyline.P (u)
      Dl_otr=DlinaOtr(B,pi)
 Dl=Dl+Dl_otr
Next
VBSMsg "Длина линии = " & Dl  '  вывод на экран сообщения о длине полилинии

Рис. 10. Длина кривой


Упражнение 3. Разбить полилинию на треугольники, закрасить каждый по методу случайных чисел, вычислить площадь.
Решение. Пусть полилиния будет выпуклой. Тогда алгоритм (МК) разбиения прост: первую точку соединяем со всеми последующими. Площадь будет вычисляться как сумма площадей треугольников разбиения.
 
Рис. 11. Треангуляция для выпуклых фигур
Работа алгоритма для невыпуклой области, видим, работает неправильно.
 
Рис. 12. Треангуляция для невыпуклых фигур
Для реализации в системе "Арт-Вектор" можно предложить один из способов треангуляции полилинии, когда задается (или вычислеятся) одна из точек внутри области, которая соединяется потом со всеми точками кривой, образуя треугольники.
Рис. Треангуляция полилинии из заданной точки
(по умолчанию тренгуляция происходит из начала линии)
Рассмотрим еще несколько моментов заливки полилинии. Пусть задана звезда МК
а)            б)
 
Рис. а) Звезда - треангуляция из центра и заливка треугольников случайным образом,
б) треангуляция и заливка незамкнутой полилинии (начало - слева, внизу; конец - справа, внизу) МК
 
  Оба варианта в новой системе "Арт-Вектор" реализованы автоматически: для замкнутой полилинии это первый вариант, для незамкнутой - второй. Поэтому чтобы правильно закрасить область невыпуклой полилилинии эти особенности надо учитывать: т.е. при необходимости полилинию разбивать на выпуклые части. На рис. показано, как происходит заливка рисунка.dxf, состоящего из нескольких полилиний

Заливка цветом множества полилиний в группе и в подгуппе.

    В диалоге можно: менять цвет на верхнем уровне и на всех подуровнях цвет будет соответствовать заданному. Войдя на нижний уровень, можно каждой группе задавать индивидуальный цвет. В диалоге заливка выполняется, как на замкнутую полилинию, так и не замкнутую (замыкается автоматически)
 
    На уровне методов, использующих пользователем в МК и при программировании на СИ по созданию других методов, могут быть предусмотрены следующие варианты:
- заливка только замкнутых полилиний (в группе и в подгруппе),
- заливка замкнутых и не замкнутых полилиний (также в группе и подгруппе),
- заливка одним цветом,
- заливка каждой полилинии случайным цветом.



Упражнение 4. Вычисления (см. МК) ординаты на линии в зависимости от х.
В общем случае решение не однозначное.
Решение. Применим численный подход: на линии будем перебирать точки и, если у текущей точки координата х стала больше заданной, то дальше ищем точку пересечения отрезка прямой проходящего через текущую точку и предыдущую, с плоскостью, определяемой координатой х.
Set K = PerSlinePlane (p(x, 0, 0), p(x, 1, 0), p(x, 0, 1), pi, B) - метод пересечения отрезка прямой pi-B с плоскостью, заданной тремя точками: p(x, 0, 0), p(x, 1, 0), p(x, 0, 1).
Аналогично можно решить задачу от любой другой переменной координаты (y или z). Для многозначных кривых точка будет определяться для первого выпавшего случая.

Упражнение 5. Найти точку пересечения кривой линии с плоскостью  общего положения (ОП).
Решение. Если преобразовать плоскость ОП вместе с кривой в плоскость уровня (параллельно координатной плоскости yz ), то задача сводится к задаче из упражнению 4. Преобразование же в системе "Вектор" реализовано на уровне диалога и есть метод "Преобразование треугольника или параллелограмма в  положение, параллельное  КП":
PlaneTrans m,n
где m - номер координатной плоскости
n - номер плоскости
Правда, есть ограничение: след плоскости на оси x, приходится определять в диалоге с помощью курсора, и затем подставлять в МК.
Задача решается в несколько этапов:
1) Задаем кривую и плоскость (в диалоге или через МК)
2) Преобразовываем плоскость в положение уровня.
3) Определяем координату х следа плоскости
4) Подставляем в МК найденное значение х
5) Запускаем МК для отыскания искомой точки уже по сценарию упр.4

    

Рис. 13. Пересечение отрезка с полилинией

На рис. задана кривая и проецирующая плоскость (на 2-м рис. она чуть повернута). Точка найдена, известны ее координаты, однако все это в новом положении. Чтобы найти координаты точки пересечения истинные, надо вернуться (с помощью  посредника - отрезка прямой, например, на оси y, после нахождения точки пересечения, надо вернуть (совместить) с вновь заданным отрезком на оси y.
Примечание. Метод удобен для диалогового режима. Для расчетных задач можно применить способ  минимизации расстояния между линией и плоскостью. В тот момент, когда это расстояние приблизилось к нулю или стало нулем, линия и плоскость пересекаются. Алгоритмы (МК) решения задачи см. курс "Векторно-графический анализ". МК имеет три вложенных цикла: верхний перебор точек идет на  линии и два перебора точек на плоскости.

Рис. 15. Пересечение кривой линии с плоскостью
На рис. перебор точек на линии выполняется с шагом 0.01, а в плоскости по v и u - 0.25. Если точность расчета надо увеличить, то уменьшите шаг.


Упражнение 6. Задайте линию так, чтобы задаваемые в ней отрезки, закрашивались разными цветами и были различной толщины.

  
Рис. 16.  Несколько примеров МК построения линни из отрезков с различной окраской и толщиной.



Аналогично можно проектировать линии, когда двигаясь по линии, можно в ее точки, "бросать" другие фигуры, ориентированные по касательной к линии. Что-то из этого реализовано на уровне "Методы к объктам" из меню системы, что-то см. урок № 3.