Эти глаза напротив

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

  Однако выход есть. Мы создаём не просто ломаные линии, а стоки - некие изображения с уже готовыми функциями. Про это я вам сейчас и расскажу.

  Но сначала о простых Ломаных. Ломаная в программе «Стереометрические модели» делается так. Активируем инструмент «создание точки» и кликаем по рисунку. Тотчас на этом месте появляется точка заливки.
  Мы выбираем эту точку – кликаем по ней правой кнопкой мыши, и Ломаная помещается в стек Выбора на левом краю окна.
  Затем активируем тот инструмент, что левее, и свободными движениями стилуса окружаем точку четырьмя росчерками. То есть, не обязательно четырьмя, но от одного до четырёх. Кликаем по кнопке «ok». Возле точки заливки у нас возникают абрисы. Линии абрисов имеют ту толщину, какая указана на кнопке сверху – на иллюстрации там стоит цифра 3, и тот цвет, который выставлен сверху. А тип заливки будет 6, независимо от того, какая цифра выставлена на кнопке Плотность - на иллюстрации там стоит цифра 9.
  Если в начале росчерка не была активирована кнопка «блокировка штриховки», то абрис получается замкнутым, то есть его начальная и конечная точки принудительно замыкаются. Такой абрис можно заливать цветом, не опасаясь, что заливка вытечет наружу.
  Впоследствии абрисы можно переводить из замкнутой формы в разомкнутую и обратно, кликая по ним после активации кнопки «о» - обращение элементов и их преобразование.

  Итак, у нас получились абрисы, некоторые замкнутые, а некоторые – разомкнутые. Они принадлежат той же Ломаной, что и точка заливки, но поскольку тип заливки равен 6, то они пока не залиты.
  Теперь окончательно выбираем цвет контура, цвет фона (он и будет цветом заливки), толщину линий контура, а тип заливки выставляем на кнопке Плотность (1,2 – штриховка 3 – сплошная заливка).  Кликаем по маленькой кнопке справа от выбранной Ломаной, и результат готов. Заливка распространилась от центральной точки до линий абриса, её ограничивающих.

  Именно таким способом был сделан контур и черты лица – брови и рот у персонажа на иллюстрации.
  У Ломаной, изображающей причёску, всего один абрис, он заливается тёмным цветом. А у Ломаной, изображающей лицо, четыре абриса – общий замкнутый контур и три незамкнутых – это черты лица. Всего две ломаных, а персонаж уже узнаваем. Правда, у него пока нет глаз.
 
 
     СПЕЦИАЛЬНЫЕ ЛОМАНЫЕ ЛИНИИ

  Если предполагается использовать Ломаную линию с небольшим количеством точек, можно упростить себе работу, а заодно и сэкономить память.
  Выбирать Ломаную не надо, а нужно на кнопке Плотность выставить размер абриса 0,1,2 или 3 и, активировав кнопку «о», кликнуть по точке заливки.
  Вокруг неё сразу возникнет окружность, состоящая из 5-ти, 11-ти, 17-ти или 23-х точек. Это и будет уже готовый абрис.

  Но это тоже будут обычные абрисы, принадлежащие обычной Ломаной линии.
  На иллюстрации показано, что вокруг точки заливки были сделаны два одинаковых абриса по 5 точек в каждом, а потом они были отодвинуты от этой точки. Следующим шагом будет преобразование Ломаной в сток.

  Выставляем цвет радужки (зелёный) и цвет нижнего века (бежевый), размер 3 и тип заливки 9. На текстовом поле пишем две цифры – 12. Это будет номер подпрограммы, реализующей сток. Кликаем по кнопке правее выбранной Ломаной и получаем на месте абрисов то, что вы видите на иллюстрации. Блик, правда, не виден – он такого же бело-серого цвета, как и общий фон рисунка.
  Выбираем один из абрисов, кликая по нему правой кнопкой мыши. Кнопками < и > находим нужную точку и клавишами со стрелочками передвигаем её на нужное место. Так же поступаем со всеми точками этого и всех других абрисов.
  Мы сделали два абриса и, соответственно, сделали один глаз – абрис 0 – сам глаз, а абрис 1 – его верхнее веко. Но у ломаной может быть 4 абриса. Добавить ещё 2 нетрудно – опять активизируем «о», выставляем Плотность=0 и вновь кликаем по точке заливки. Сделав это два раза, получаем элементы для составления другого глаза.

  Теперь объединяем всё вместе. У нас 2-е Ломаных – лицо и шевелюра, и одна ломаная-сток, изображающая глаза. Все ломаные и абрисы мы можем выбирать и передвигать, поворачивать, менять их размер, раздвигая или сдвигая точки, и всё это можно делать как совместно, так и раздельно.
  Выбрав один из абрисов, можно менять расположение точек на нём как угодно. Словом, удобств для изменения изображения масса. А глаза открываются или закрываются простым кликом по их верхним векам.

  Кстати, обратите внимание, у открытого глаза верхнее веко имеет более крутой изгиб возле носа, а у закрытого – с противоположной стороны. Это очень естественно и, вместе с тем, просто с точки зрения программирования – линия, составляющая веко, не отражается, а инвертируется. Точка её инверсии ищется как середина между крайними точками на веке, а потом она немного сдвигается в сторону средней, 3-й точки века.
  Формулы инверсии необычайно просты –

X = Xо - (X - Xо)
Y = Yо - (Y - Yо),  где Xо, Yо – координаты точки инверсии
 

  Вот так выглядит графика, описывающая лицо с глазами –

    1>     9  2220  0  2341  1  14  17  19  3  25535  3415  3  1  #32
    2>     9  2233  0  1599  23  0  0  0  3  16912  8456  3  2  #32
    3>     9  2270  0  2580  45  46  47  48  129  0  992  2  3  #32

#32 - это номер группы. Вошедшие в общую группу, элементы графики могут передвигаться совместно.

А вот так описываются в ней глаза –

  абрис 0 адрес 45
   0  5  2064  2259  2082  2267  2061  2240  2128  2354  1993  2361
  абрис 1 адрес 46
   0  5  1921  2261  1977  2197  2049  2173  2143  2204  2170  2254
  абрис 2 адрес 47
   0  5  2491  2257  2510  2266  2488  2238  2554  2376  2436  2368
  абрис 3 адрес 48
0 5  2391  2265  2424  2195  2492  2177  2587  2224  2626  2276

Как видите, всё очень красиво и компактно.
Использование специальных векторных изображений – стоков, делает векторную графику очень удобной в её применениях.
__________
27.10.2022

Программа для работы с Ломаными полностью готова.
Скачать её можно тут - http://disk.yandex.ru/d/33Hblr886-gUdw
Пример с лицами и глазами вот - http://disk.yandex.ru/d/84YR_7gYFS0faQ
Так что, скачивайте, программа работает совместно с Виндос. Возможно, что она Вам понравится.

29.10.2022 - Вчера добавил к глазам ресницы. И случилась дополнительная удача - при зеркальном отражении глаз справа налево ресницы меняют своё направление с верха на низ, и глаза получаются полузакрытами. Три фазы изображения закрывающихся глаз, это отличный результат!


___________
для любителей программирования
Вот так выглядит подпрограмма, реализующая сток. Она достаточно сложная.

'===================
Public Sub Sto12(N As Integer) 'глаза в 5-ти точках с пропорциональной зависимостью от размера
Dim DW As Integer, DWo As Integer, NN As Integer, Ca As Long, C As Long, Z As Integer
Dim Cb As Long, C1 As Long, Cw As Long, C2 As Long, Co As Long, C3 As Long
Dim J As Integer, P As Integer, I As Integer, X As Integer, Y As Integer, X2 As Integer, Y2 As Integer
Dim X1 As Integer, Y1 As Integer, F As Integer 'флаг_разомкнутости_абриса

  DW = Form1.Picture1.DrawWidth: DWo = Pvv(N, 11) + 2: 'DWo*5 *3 *2 1 -яблоко радужка зрачок ресницы,блики
  NN = Pvv(N, 12) 'номер ломаной   
  Ca = ItoL(Pvv(N, 10)): If FLagD = 1 Then Ca = ccRGB(Ca, cBack, 0.2): 'вывод графики в бледном виде
   Ca = Ckomb(Ca, NN): Ca = E(Ca): C = Ca:
  If Pvv(N, 9) = 0 Then Cb = 0: GoTo 1:
   Cb = ItoL(Pvv(N, 9)): If FLagD = 1 Then Cb = ccRGB(Cb, cBack, 0.2):
   Cb = Ckomb(Cb, NN): Cb = E(Cb): C1 = Cb:
1 Cw = C240: If FLagD = 1 Then Cw = ccRGB(Cw, cBack, 0.2):
   Cw = Ckomb(Cw, NN): Cw = E(Cw): C2 = Cw:
  Co = 0: If FLagD = 1 Then Co = ccRGB(Co, cBack, 0.2):
   Co = Ckomb(Co, NN): Co = E(Co): C3 = Co:
      For J = 4 To 7:         'ссылки на абрисы находятся в позициях 4-7 строки Pvv(N, J) описывающей Ломаную
      If J = 6 Then C = Ca + 524288: C1 = Cb + 524288: C2 = Cw + 524288: C3 = Co + 524288: 'метим абрисы цветом
      If J = 5 Then C3 = Co + 2048: C1 = Cb + 2048: 'цвет нижнего века
      If J = 7 Then C3 = Co + 526336: C1 = Cb + 526336: 'цвет нижнего века
      F = 0: P = Pvv(N, J): If P = 0 Then GoTo 9
      Nt = Ppp(P, 2): If Ppp(P, 1) <> 0 Then GoTo 9
      If J = 4 Or J = 7 Then X2 = Ppp(P, 3): Y2 = Ppp(P, 4):
      F = 1: If Nt > 999 Then F = 2: If J = 4 Or J = 6 Then J = J + 1: GoTo 9 'если абрис разомкнут
      If J = 4 Or J = 6 Then I = Pvv(N, J + 1): If I > 0 Then I = Ppp(I, 2): If I > 999 Then GoTo 9: 'пропускаем
      I = 0: Z = 1: X = Ppp(P, 3): Y = Ppp(P, 4): If Nt > 5 Then Nt = 5:
2     I = I + 1: Z = Z + 2: If Z > 11 Then P = P + 1: Z = 1:
      X1 = X: Y1 = Y: X = Ppp(P, Z): Y = Ppp(P, Z + 1):
      Select Case J: Case 4, 6:
        If Z = 3 Then 'яблоко
          Form1.Picture1.DrawWidth = DWo * 5 + 2: Form1.Picture1.PSet (X / 10, Y / 10), C3:
          Form1.Picture1.DrawWidth = DWo * 5: Form1.Picture1.PSet (X / 10, Y / 10), C2:
        End If
        If Z = 5 Then 'радужка и зрачок
          Form1.Picture1.DrawWidth = DWo * 3: Form1.Picture1.PSet (X / 10, Y / 10), C:
          Form1.Picture1.DrawWidth = DWo * 2: Form1.Picture1.PSet (X / 10, Y / 10), C3:
        End If
        If Z = 7 Then Form1.Picture1.DrawWidth = 6: Form1.Picture1.PSet (X / 10, Y / 10), C2: 'блик
        If Z = 11 And Cb > 0 Then 'нижнее веко
          Form1.Picture1.DrawWidth = DWo * 3:
          Form1.Picture1.Line (X1 / 10, Y1 / 10)-(X / 10, Y / 10), C1:
        End If
      Case Else: 'верхнее веко
        If F = 1 Then
          Form1.Picture1.DrawWidth = DWo:
          Form1.Picture1.Line (X1 / 10, Y1 / 10)-(X / 10, Y / 10), C3:
        End If
         If F = 2 And Z = 3 Then 'закрытые веки
          Form1.Picture1.DrawWidth = DWo:
          X2 = Ppp(P, 3) / 2 + Ppp(P, 11) / 2: Y2 = Ppp(P, 4) / 2 + Ppp(P, 12) / 2: 'центр века
          X2 = Ppp(P, 7) * 0.2 + X2 * 0.8: Y2 = Ppp(P, 8) * 0.2 + Y2 * 0.8: 'небольшая поправка
          For I = 3 To 11 Step 2:
            X = Ppp(P, I): Y = Ppp(P, I + 1):
            X = X2 - (X - X2): Y = Y2 - (Y - Y2): 'инверсия
            If I = 3 Then X1 = X: Y1 = Y: GoTo 8:
            Form1.Picture1.Line (X1 / 10, Y1 / 10)-(X / 10, Y / 10), C3:
            X1 = X: Y1 = Y:
8         Next I:
        End If
      End Select:
      If I < Nt Then GoTo 2
9   Next J: Form1.Picture1.DrawWidth = DW:
End Sub
'===================

ПРИМЕЧАНИЕ. Вывод графики в бледном виде используется для того, чтобы запомнить бледное изображение и подкладывать его под новый кадр анимации во время его редактирования. Так видна разница между тем, что было, и тем, что сейчас. И мультипликацию становится делать легче.


Рецензии
Я так и знал, что это не про глаза, и не про Валерия Ободзинского!

Что-то не идёт закачка... Не доходит до Киевской области...

Хомуций   27.10.2022 20:17     Заявить о нарушении
Видно, гранаты у Вас не той системы ))

Дмитрий Маштаков   27.10.2022 23:07   Заявить о нарушении
Я мирный человека, Дмитрий Михайлович.
У меня на главной странице написано «Славяне, любите друг друга!...»

Хомуций   28.10.2022 17:57   Заявить о нарушении