[C] Funkcja logarytmiczna rysująca Złotą Spiralę.

sylvi91
Użytkownik
Użytkownik
Posty: 64
Rejestracja: 10 paź 2017, o 04:40
Płeć: Mężczyzna
wiek: 47
Lokalizacja: Łódź
Podziękował: 6 razy

[C] Funkcja logarytmiczna rysująca Złotą Spiralę.

Post autor: sylvi91 »

Witam.

Kod: Zaznacz cały

https://pl.wikipedia.org/wiki/Z%C5%82ota_spirala

Powyższe źródło w wikipedii podaje, że Złota spirala opisana jest następującym wzorem:

\(\displaystyle{ r=ae ^{b\theta} }\)

Chciałbym to przekształcić na funkcję rysującą grafikę w języku C za pomocą polecenia putpixel(x,y,kolor).
Jakie parametry podać w zmiennych X i Y?

Kiedyś stworzyłem Spiralę Fibonacciego w programie wykorzystującym bibliotekę graficzną Allegro 4.2.
Ale tam rysowałem ćwiartki okręgów aby wykonać całą spiralę.

Niestety nie radzę sobie aby to samemu przekonwertować na język C.
Jednakże mogę podać przykład ze Spiralą Archimedesa.

W Latexie jest tak:
\(\displaystyle{ r=a + b \theta }\)

W kodzie C tak:

Kod: Zaznacz cały

for(i=0;i<=cycles*pi;i+=incr){
		putpixel(x + (a + b*i)*cos(i),x + (a + b*i)*sin(i),15);
	}
Źródło :

Kod: Zaznacz cały

https://rosettacode.org/wiki/Archimedean_spiral#C
Ostatnio zmieniony 30 sie 2020, o 22:43 przez Jan Kraszewski, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
Awatar użytkownika
Dasio11
Moderator
Moderator
Posty: 10223
Rejestracja: 21 kwie 2009, o 19:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 40 razy
Pomógł: 2361 razy

Re: [C] Funkcja logarytmiczna rysująca Złotą Spiralę.

Post autor: Dasio11 »

Kod: Zaznacz cały

for( t = t1; t <= t2; t += dt )
{
    r = a * exp( b * t );
    x = r * cos( t );
    y = r * sin( t );
    putpixel( x, y, color );
}
sylvi91
Użytkownik
Użytkownik
Posty: 64
Rejestracja: 10 paź 2017, o 04:40
Płeć: Mężczyzna
wiek: 47
Lokalizacja: Łódź
Podziękował: 6 razy

Re: [C] Funkcja logarytmiczna rysująca Złotą Spiralę.

Post autor: sylvi91 »

Dasio11 - Dzięki. Próbowałem podstawiać różne wartości pod zmienne. Wyszła jakaś spirala podobna do Archimedesa. Ale nie mogę uzyskać kształtu Złotej Spirali. Jakie wartości sugerujesz podstawić pod te zmienne aby w normalnym trybie graficznym ujrzeć Złotą Spiralę?
Poza tym wykres uzyskanej spirali miał większe zagęszczenie punktów na początku, a mniejsze wraz z oddalaniem się od początku. Ja bym chciał
aby zagęszczenie punktów było jednakowe na całej długości spirali. Inaczej mówiąc chciałbym ją rysować piksel po pikselu.
Awatar użytkownika
Dasio11
Moderator
Moderator
Posty: 10223
Rejestracja: 21 kwie 2009, o 19:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 40 razy
Pomógł: 2361 razy

Re: [C] Funkcja logarytmiczna rysująca Złotą Spiralę.

Post autor: Dasio11 »

A po czym poznajesz, że nie uzyskałeś Złotej Spirali?

Za \(\displaystyle{ b}\) trzeba podstawić \(\displaystyle{ \frac{2 \ln \varphi}{\pi}}\), tak jak mówi Wikipedia. \(\displaystyle{ a}\) odpowiada tylko za przeskalowanie, więc może być jakiekolwiek. Żeby uzyskać linię zbliżoną do ciągłej, można uzmiennić dt:

Kod: Zaznacz cały

for( t = t1; t <= t2; t += dt )
{
    r = a * exp( b * t );
    x = r * cos( t );
    y = r * sin( t );
    putpixel( x, y, color );
    dt = d / ( r * sqrt( b*b+1 ) );
}
gdzie \(\displaystyle{ d}\) jest odległością między pikselami (w poziomie i w pionie - zakładam, że są takie same), czyli taką liczbą, że wywołania putpixel(x, y, color); i putpixel(x+d, y, color); zawsze kolorują sąsiadujące piksele.
ODPOWIEDZ