График функции в полярных координатах?! Легко!
Если в пред. посте потуги относились к кривой 2-го порядка, то сегодня будет принципиально другая постановка, которая закрывает другую область для фантазий...а именно полярные координаты. Т.е. когда функция рисуется по длине радиус-вектора точки и углу м/у этим вектором и осью абсцисс. Например: r(f)=23f, здесь f -аргумент(угол), а r-радиус вектор точки по углу f. В параметрическом виде задаются всякие эволюты и эвольвенты и другие чудесатые штуковины.
Вспомнился мне один опыт из универа, када на осцилографе ручкой менялось значение начальной фазы, а другой амплитуда, на экране возникали забавные овалы с лепестками, их можно посмотреть например здесь
Из этих цветочков возьмем для опытов четырехлистную розу (внизу слева).
Ее функция в полярных имеет вид: r=Asin(2f).
Для Spline2 нам надо собрать координаты опорных точек В ДЕКАРТЕ и углы касательных в них.
Займемся.
Для угла f радиус вектор будет равен:r=Asin(2f), где А-константа(просто амплитуда).
Координаты точки в декарте при данном f:
x0=r*cos(f) : y0=r*sin(f) - т.е проекция точки на оси.
Для определения угла касательной в точке (x0,y0) нужна производная. И вот тут есть момент который нужно понимать. Если мы возьмем производную r=Asin(2f) получим dr/df=2Acos(2f), но нам нужна производная в декартовых координатах! Поэтому смысла дифференцировать полярное уравнение нет. А чтобы получить производную в декарте, в общем виде делаем так.
Есть полярная функция r=F(a), раскладываем ее на "декартовы гармоники":
x(a)=F(a)*cos(a) - т.е проекция полярной функции на ось декартова аргумента.Аналогично
y(a)=F(a)*sin(a) - т.е проекция полярной функции на ось декартовой функции.
Таким образом переходим от полярной функции к системе из двух декартовых функций.
Дальше находим x'(a), y'(a) производные "гармоник". И берем частное: dy/dx, которое и есть производная нашей функции в декарте.
Для нашей функции все это выглядит так:
r(f)=Asin(2f)
x(f) =A*sin(2f)*cos(f)
y(f) =A*sin(2f)*sin(f)
x'(f)=A*(2*cos(2f)*cos(f) - sin(2f)*sin(f))
y'(f)=A*(2*cos(2f)*sin(f) + sin(2f)*cos(f))
dy/dx=(2*cos(2f)*sin(f) + cos(f)*sin(2f)/(2*cos(2f)*cos(f) - sin(2f)*sin(f))
это и есть к-т k прямой-касательной
арктангенс этого выражения будет равен углу касательной в точке с радиусом r и углом f.
Искать полное выражение касательной в декартовых координатах в виде kx+b не нужно!
Да и упрощать тоже - машина посчитает.
а0=ATN((2*cos(2*ang)*sin(ang) + cos(ang)*sin(2*ang))/(2*cos(2*ang)*cos(ang) - sin(2*ang)*sin(ang)+eps))
Пишем скрипт!
В ОСНОВНОМ скрипте:
! r=a*sin(2f) - "4-листная роза"
as=15 ! angle step - шаг угла-аргумента
ang=0 ! start angle
ang2=360 ! конечный угол
eps=1e-12
PN=ROUND_INT((ang2-ang)/as) ! число опорных точек
FOR X=1 TO PN
R=CA*sin(2*ang)
x0=R*cos(ang)
y0=R*sin(ang)
a0=ATN((2*cos(2*ang)*sin(ang) + cos(ang)*sin(2*ang))/(2*cos(2*ang)*cos(ang) - sin(2*ang)*sin(ang)+eps))
ang=ang+as
PUT x0,y0,a0 ! в стек.
NH[X][1]=x0 ! на самом деле массивы нужны только для проверки на стадии отладки(посмотреть что-как считается), и для хотспотов.
NH[X][2]=y0 ! после того как скрипт даст нужный результат от них можно отказаться.
ANS[X]= a0
NEXT X
в 2D скрипте рисуем по данным стека:
pen pen_Cont
spline2 PN, 3,
USE(NSP)
FOR x=1 to PN
hotspot2 GET(1), GET(1)
get(1)
NEXT X
Hotspot2 0,0
if axes then
pen pen_Axes
line2 -1.2*CA, 0, 1.2*CA, 0
line2 0,-1.2*CA, 0, 1.2*CA
endif
Результаты:
Вот он наш четырехлистник по 24 точкам(угол 15градусов, 360/15=24)
Кол-во опорных точек влияет на Spline2, функция Spline "не догадывается" какую именно кривую мы хотим построить - т.е. есть опорные точки и углы, а м/у ними будет сплайн, а не график нашей функции, т.е. при использовании Spline2 нужно думать о целях - либо проверить значения в точках, либо получить общий контур. В первом случае аппроксимировать нужно соответственно. Приведу скрины при других значениях as.
as=30 (угол 30градусов, 360/30=12)
Изменим значение аргумента на (3*ang):
Таким же точно образом может быть построена другая непрерывная функция.
Другие функции в полярных координатах бохато представлены поиском на яндексе по:"кривые в полярных координатах". Все в ваших руках.
Сабж: rose-4-leaf.gsm
UPD:
Хочу "закрыть" тему "график функции". Для этого нужно наладить обратную связь м/у картинкой и математикой. То есть дать возможность вычислять значение функции по аргументу. И GDL предоставляет для этого прекрасную возможность интерактивного назначения аргумента посредством редактируемых спотов. В руководстве описаны схемы описания различных типов активных спотов - линейный, угловой, плоскостной, пространственный...По сути друг от друга они отличаются наложенными связями (ограничения перемещений). В объекте PlanMarker я подробно рассматривал синтаксис этих типов АС.
Очевидно что для функции в полярных координатах нужен угловой спот (аргумент ф-ии -угол). Манипуляции с объектом оставлю для фанатов(сабж в конце). А для любопытствующих просто небольшое кинцо.
Сабж2
UPD2:
Еще немного поиграв над темой - добавил построение касательной и нормали.
Эх...давненько ничего такого не делал, всмысле - ручками не писал формулы...увлекло даже.
Скрин:
Сабж3
Комментарии
Отправить комментарий