Как устроена присоединённая графика

  Присоединённая графика служит дополнением к изображению точки в программе «Стереометрические модели». Графика связана с точкой, и перемещается вместе с нею. Графика может представлять собой окружность, эллипс, дугу окружности или эллипса, параболу, гиперболу, полином 3-й или 4-й степени, а также показательную функцию.
  Возможны и другие виды графики.
  В этой статье я постараюсь рассказать о том, как я добавлял показательную функцию к другим, уже имеющимся в программе видам графики.
  Но прежде этого, давайте посмотрим, на то, как представляется векторная графика внутри и вне программы.

     ПРЕДСТАВЛЕНИЕ ВЕКТОРНОЙ ГРАФИКИ
 
  В сделанных мною программах векторная графика представляется в целых числах. Внутри программы это двухмерный массив, а вне программы это текстовый файл, содержащий строки. Каждая строка имеет 13 позиций (от 0 до 12), и в каждой позиции находится целое число.
  Посмотрим на текстовый файл, который создаёт изображение, показанное на иллюстрации -
 
X_ 1-точка 2-отрезок 3-прямая 4-плоскость 5,6-сечение N_строк= 5
 _____    x= 500  y= 300  u= 30  k= 40    сетка 40

    1>    1  0  0  0  0  50  150  0  3  0  31  5  1
    2>    1  0  0  0 -100  1  0  0  2  0  30720  2  2
    3>    1  0  0  800  0  0  0  0  1  512  0  1  3
    4>    1 -400  0 -400  0  0  0  0  1  0  32767  2  4
    5>    1  0  0  0  0  0  0  0  1  0  32767  2  5

  Пять строк этого файла имеют 1 в нулевой позиции. Единица это логотип точки, следовательно, наша векторная графика состоит из пяти точек. Координаты X,Y и Z этих точек (Z-вверх X-вправо от начала координат) указаны в позициях 1,2 и 3. Значения координат берутся в пикселях, и для улучшения точности вычислений увеличиваются в 10 раз.
  Первые две строки массива изображают параболы, и эти параболы мы видим на чертеже, тогда как последние три строки – декоративные. Они имеют маркер 1 в восьмой позиции и ноль в четвёртой позиции, а это означает окружности нулевого радиуса. Такие окружности не чертятся, и мы видим вместо окружностей точки. Чёрную точку размером единица (1 в поз.11), и две белых точки размером 2.
  У чёрной точки в поз.9 стоит число 512. Так кодируется цифра 2, которую мы видим рядом с этой точкой.
  Однако, посмотрим на первую строку. Маркер 3 в поз.8 означает, что присоединённая графика является полиномом 3-й степени –
   Y = A*X^3 + B*X^2 + C*X
Коэффициенты A,B,C находятся в виде целых чисел (умножены на 100) на позициях 4,5 и 6.
  Взяв числа 0, 50 и 150 с этих позиций первой строки мы получаем уравнение параболы Y=X*(X+3). Это та парабола красного цвета, которую мы видим на иллюстрации.

     КАК К ТОЧКЕ ПРИСОЕДИНЯЕТСЯ ГРАФИКА

  Обычная точка имеет нули в позициях 4-8. Чтобы присоединить к точке графику, мы эту точку модифицируем. То есть устанавливаем в поз.8 маркер модификации, а в позициях 4-7 устанавливаем параметры.
  Делается это так.
  В текстовое поле (см.иллюстрацию) записывается цифра-маркер, запятая и числа-параметры, также разделённые запятыми.
  Например, запись 3,A,B,C,к  обозначает полином 3-й степени. Коэффициенты, стоящие перед его членами, идут по убывающим степеням полинома. Параметр к служит для видоизменения полинома - значение к=0 создаёт график Y(X), а значение к=1 создаст график X(Y).

  Чтобы ввести эту информацию в строку, описывающую точку, мы кликаем кнопку «обращение», и она окрашивается в зелёный цвет (см.иллюстрацию). Затем кликаем по изображению точки. Если точка была окружена графикой, то эта графика исчезает, а если точка не являлась модифицированной, то она таковой становится, и вокруг неё сразу же появляется графика.

     КАК ГРАФИКА ЧЕРТИТСЯ

  Если точка модифицирована, то сперва создаётся изображение точки, а потом к этому изображению присоединяется окружающая его графика.
  Для полинома 3-й степени (маркер 3) и для степенной функции (маркер 5) используется общий алгоритм, текст которого вы видите ниже

 Case 3, 5: 'полином 3-й степени и показательная функция
    R = Pvv(N, 4) / 100: A = FC40: If FC40 = 0 Then A = 40
    Q = Pvv(N, 5) / 100: U2 = Pvv(N, 6) / 100: U1 = Pvv(N, 7):
    If R = 0 And Q = 0 And U2 = 0 And U1 = 0 Then GoTo 111
    If U1 = 0 Or U1 = 100 Or U1 = 200 Then Else GoTo 111:
    If NL = 5 Then U2 = U1 / 100: U1 = Pvv(N, 6): If R = 0 Then R = 1:
                'по умолчанию множитель=1
    If NL = 5 And U2 = 2 Then GoTo 55: 'только отрицательная ветвь
    For X = 10 To 500 Step 10: X1 = X - 5:
      Xo = X1 / A: If NL = 3 Then GoSub 3 Else GoSub 5:
      Y1 = Y: Xo = X / A: If NL = 3 Then GoSub 3 Else GoSub 5:
If U1 = 0 Then Form1.Picture1.Line (XX + X, YY - Y)-(XX + X1, YY - Y1), C
If U1=100 Then Form1.Picture1.Line (XX + Y, YY - X)-(XX + Y1, YY - X1), C
  Next X: If NL = 5 And U2 = 1 Then GoTo 111: 'только положительная ветвь
55  For X = -10 To -500 Step -10: X1 = X + 5:
      Xo = X1 / A: If NL = 3 Then GoSub 3 Else Xo = -Xo: GoSub 5:
      Y1 = Y: Xo = X / A: If NL = 3 Then GoSub 3 Else Xo = -Xo: GoSub 5:
If U1 = 0 Then Form1.Picture1.Line (XX + X, YY - Y)-(XX + X1, YY - Y1), C
If U1=100 Then Form1.Picture1.Line (XX + Y, YY - X)-(XX + Y1, YY - X1), C
    Next X: GoTo 111
3        Y = Xo ^ 3 * R: Y = Y + Xo ^ 2 * Q: Y = Y + Xo * U2:
         Y = Y * A: Return:
5        Y = Xo ^ Q * R: Y = Y * A: Return:

Графики чертятся пунктирными линиями по двум веткам, сначала по одной с шагом 10, а затем – по другой, с шагом -10. Значения U1=0 или U1=100 выбираются в зависимости от состояния одного из последних параметров.
  Сами параметры R,Q,U1 и U2 извлекаются из массива Pvv(N, i), где N это номер строки, а  i это позиция в строке. Переменная NL=Pvv(N,8) содержит значение маркера. При маркере 3 чертится полином 3-й степени, при маркере 5 чертится график степенной функции.
  A - размер ячеек сетки. XX и YY определяют положение точки. Посыл GoTo 111 служит для выхода из подпрограммы.

  Запись    5,A,B,к,z  обозначает Y=A*|X|^B при к=0, или  X=A*|Y|^B при к=1. Если множитель A=0 или отсутствует, то полагается, что A=1.
  При z=1 рисуется только положительная ветвь функции, а при z=2 – только отрицательная.
  Как видите, всё довольно просто. Человек, сведущий в программировании, легко в этом алгоритме разберётся.
  Спасибо за внимание.
________
5.4.2022

Видео по этой теме см. тут - http://youtu.be/8rFNqGZ3xwA


Рецензии
Здравствуйте, Дмитрий!
Я просто восхищён вашими увлечениями. Вы и программист, и хорошо разбираетесь в музыкальной грамоте, и в графике, и стихи пишете, и прозу.

Но пока хотелось бы поговорить с вами о программировании. Я написал вам личное сообщение.

С уважением,

Владимир Щеблыкин   13.04.2022 10:34     Заявить о нарушении
Спасибо, я ответил.
Я никогда не ограничивался узкой профессиональной деятельностью. Мне всегда были интересны разные смежные области, и не только смежные. Мне даже самому удивительно, как это всё у меня получается. Но получается ведь. ))
Хотя я человек скромный. Никаких амбиций не имею. Талантливых людей на наших сайтах много, я всегда радуюсь им и стараюсь узнать о них побольше.
Обо мне можно прочитать тут - http://stihi.ru/2018/12/15/1946

Дмитрий Маштаков   13.04.2022 12:18   Заявить о нарушении