График функции в полярных координатах?! Легко!

Сегодня захотелось подтвердить практически свою убежденность в том, что при помощи GDL функции Spline2(см.пред. пост) и использования школьных знаний по алгебре(дифференцирование функций) вполне просто и удобно строить графики функций.
Если в пред. посте потуги относились к кривой 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






Комментарии

Популярные сообщения из этого блога

GDL. Объект для моделей из "оцилиндрованного бревна"

Объект "Plan Marker"