Polar rose — zakres wartości dla "theta"

0

Aby nakreślić sobie wykres róży biegunowej, korzystam z poniższego wykresu do obliczeń współrzędnych punktów wykresu:

X := OriginX + A * Cos(K * Theta) * Cos(Theta);
Y := OriginY + A * Cos(K * Theta) * Sin(Theta);

Teraz w pętli generuję sobie punkty i je renderuję — Theta od 0 do 2 * Pi (pełne koło, w radianach) i wszystko gra. Problem jednak w tym, że wykres jest poprawy tylko jeśli K jest liczbą naturalną. W przypadku ułamków, np. dla K = 1 / 3 wykres powinien wyglądać tak:

screenshot-20240313215854.png

a mój jest niedorobiony — brakuje sporej części:

screenshot-20240313215926.png
Żeby wyrenderował się poprawnie, muszę obliczać punkty dla Theta w zakresie od 0 do 4 * Pi.

Ma ktoś pojęcie jak powinien wyglądać wzór obliczający górną granicę Theta, tak aby móc wyliczać wszystkie punkty wykresu, bez względu na to czy k jest całkowite czy rzeczywiste?

0

W pierwszym przybliżeniu spróbowałbym wybrać ograniczenie jako: max( 2pi, 2pi/k)

0

Wygląda na to że będzie co najwyżej 2b\pi,  k = \frac a b

0

Z tego co się dowiedziałem, górną granicę można obliczyć tak: (1 + ((n + d) mod 2)) * d * pi, a k = n / d.

Faktycznie pozwala to wyrenderować pełny wykres, bez względu na to ile wynoszą parametry n i d, ale jest jeden minus — w niektórych przypadkach górna granica theta jest dwa razy większa niż być powinna (np. dla k = 3 / 6) i wykres renderuje się dwa razy (dwa pełne cykle). Jeśli wyrenderuję taki wykres, linia będzie widocznie grubsza, natomiast jeśli użyję róży jako trajektorii ruchu, to ruch ten będzie dwa razy szybszy (bo dwa cykle zamiast jednego).

Może po prostu jeden wzór nie istnieje i szkoda szukać rozwiązania. Dla k będącego dodatnim integerem, górna granica theta zawsze wynosi 2Pi, natomiast dla niecałkowitych trzeba sobie ręcznie ustalić granicę, dedykowaną konkretnemu k.

2

@furious programming a to nie jest tak, że do tego wzoru masz wziąć ułamek nieskracalny? 3/6 przecież da się skrócić do 1/2. Nie mogę znaleźć teraz źródła, ale wydaje mi się, że tak trzeba by postąpić.

0

@Mr.YaHooo: damn, a o skróceniu ułamka nie pomyślałem — tak długo w tych wzorach dłubałem, że oczywistego namierzyć nie potrafiłem… Czyli wychodzi na to, że najpierw należy skrócić ułamek (jeśli się da), a następnie skorzystać z podanego przez mnie wzoru:

Theta    := 0.0;
ThetaMax := (1 + ((N + D) mod 2)) * D * Pi;

Natomiast później, podczas rysowania wykresu, normalnie użyć N / D zamiast K (odpadnie zbędna zmienna):

X := OriginX + A * Cos(N / D * Theta) * Cos(Theta);
Y := OriginY + A * Cos(N / D * Theta) * Sin(Theta);

Sprawdzę to i dam znać, ale — na logikę — skrócenie ułamka powinno rozwiązać problem. W końcu wykres renderowany jest wielokrotnie tylko w przypadku nieskróconego ułamka skracalnego.

2

Czasami coś takiego może umknąć ;) Mam nadzieję, że to zadziała :)

Swoją drogą, to tego wzoru nie znałem. Jedyne co mam co na pewno zadziała to https://mathworld.wolfram.com/RoseCurve.html

If n=p/q is a rational number, then the curve closes at a polar angle of theta=pi*q*m, where m=1 if p*q is odd and m=2 if p*q is even.

Ale być może ten sprytny wzór zapisuje w jakiś sposób oddzielny przypadek dla parzystego oraz nieparzystego N*D. Bo co ciekawe dla przypadku z Twojego pierwszego posta kąt Theta ma być w zakresie 0-3 Pi. Dla niedowiarków tutaj dowód jak wygląda krzywa dla zakresu [0-2.99 Pi] https://www.wolframalpha.com/input?i=ParametricPlot%5B%7BCos%5B1+%2F+3+*+Theta%5D+*+Cos%5BTheta%5D%2C+Cos%5B1+%2F+3+*+Theta%5D+*+Sin%5BTheta%5D%7D%2C%7BTheta%2C+0%2C+2.99+Pi%7D%5D Prawie się zamyka

1 użytkowników online, w tym zalogowanych: 0, gości: 1