Как устроена присоединённая графика
Возможны и другие виды графики.
В этой статье я постараюсь рассказать о том, как я добавлял показательную функцию к другим, уже имеющимся в программе видам графики.
Но прежде этого, давайте посмотрим, на то, как представляется векторная графика внутри и вне программы.
ПРЕДСТАВЛЕНИЕ ВЕКТОРНОЙ ГРАФИКИ
В сделанных мною программах векторная графика представляется в целых числах. Внутри программы это двухмерный массив, а вне программы это текстовый файл, содержащий строки. Каждая строка имеет 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
Свидетельство о публикации №222040500163
Я просто восхищён вашими увлечениями. Вы и программист, и хорошо разбираетесь в музыкальной грамоте, и в графике, и стихи пишете, и прозу.
Но пока хотелось бы поговорить с вами о программировании. Я написал вам личное сообщение.
С уважением,
Владимир Щеблыкин 13.04.2022 10:34 Заявить о нарушении
Я никогда не ограничивался узкой профессиональной деятельностью. Мне всегда были интересны разные смежные области, и не только смежные. Мне даже самому удивительно, как это всё у меня получается. Но получается ведь. ))
Хотя я человек скромный. Никаких амбиций не имею. Талантливых людей на наших сайтах много, я всегда радуюсь им и стараюсь узнать о них побольше.
Обо мне можно прочитать тут - http://stihi.ru/2018/12/15/1946
Дмитрий Маштаков 13.04.2022 12:18 Заявить о нарушении