Programowanie w języku Delphi » Gotowce

Sympatyczny wzorek na kreślenie figur

No może nie dokońca super, ale coś w nim jest :) Znalazłem go przez przypadek gdzies w bezkresach sieci, gdy szukalem info o prockach DSP.

Za pomocą tego wzoru można wykreślic prawie każdą figure wpisaną i zarazem opisaną na okregu (są wyjątki od tej reguły ale chyba tylko dla m=4):

r(Theta) = ((cos(1/4*m*Theta)/a)n2 + (sin(1/4*m*Theta)/b)n3)^(-1/n1)

Nie czytałem dużo o samym wzorze, ale z moich obserwacji wynika, że m odpowiada za ilość wierzchołków/ramion figury; Theta to poprostu kąt pod jakim wyznaczamy punkt obwodu figury (wzór jest zapisany w układzie współrzędnych biegunowych); n1 - ogolny współczynnik powiększenia (im wiekszy tym mniejsza figura)
Rola reszty parametrów zmienia sie wraz ze zmianą innych parametrów.

Dla Delphi funkcja wyznaczająca punkt r czy danym kącie wygląda więc tak:

function Wzorek(const Theta, m, a, b, n1, n2, n3: Real): Real;
begin
  Result := Power((Power(cos(1/4*m*Theta)/a , n2) + Power(sin(1/4*m*Theta)/b, n3)), (-1/n1));
end;


Procedurka rysująca całą figure ma za zadanie:
-wywołać funkcję wzorek określoną ilość razy od 0 do 360 (kąt pełny)
-zamienić współrzędne biegunowe (r, Theta) na współrzędne kartezjańskie (x, y)
-wyznaczyć punkt na formie
Ponizej część procedury odpowiadającej za powyzsze wymagania:

  while Theta <= 360 do
    Begin
      r := Wzorek(Theta, m, a, b, n1, n2, n3);      //wyliczenie r(Theta)
      y := Round(sin(Theta)*r) + Height div 2;      //konwersja ukladow wspolrzednych oraz
      x := Round(cos(Theta)*r) + Width div 2;           //zaokraglenie liczby dla potrzeb narysowania na formie i ustawienia figury w srodku formy
      Canvas.Pixels[x, y] := clWhite;               //narysowanie piksela w wyznaczonym punkcie formy
      Theta := Theta + 0.01;                        //zwiekszenie kata o okreslony krok (im mniejszy krok tym lepiej, ale wolniej)
    end;


Reszta kodu odpowiada za sprawdzanie czy czasem nie wpisaliśmy błędnych zmiennych oraz za ogolne przygotowanie formy.

Dla przykładu:
a=b, m=4, n1=n2=n3=2 - narysuje nam okrąg;
a<b, m="4," n1="n2=n3=2" -="-" narysuje="narysuje" nam="nam" elipsę;="elipsę;" a="b," n2="n3">2 - narysuje nam zaokrąglony kwadrat;

Uwagi:
- Czasami może wyskoczyć błąd dzielenia przez zero lub błąd zwązany z liczbą zmiennoprzecinkową. Wynikają one ze specyficznych ustawień zmiennych.
- Liczby mniejsze od zera moga także wywoływac powyższe błędy, ich obsługa została wprowadzona dla sprawdzenia ich wpływu na figurę.
- n2, n3 - powinny być liczbami parzystymi w innym przypadku wyskakuje jeden z powyżej wymienionych błędów

P.S.
Jak ktos zrobi gwiazde 6 ramienna to niech napisze dla jakich parametrów ją osiągnął. Mi nie wiem czemu wychodzi 3 ramienna (parametr m=6).

Wiecej informacji:
1) http://cygnus.et.put.poznan.pl[...]owania/superwzor/superwzor.htm
2) http://www.geniaal.be/html/fs001geniaal.htm

13 komentarzy

AklimX 2004-12-17 14:56

wow, chyba zostanę poetą :D

Sanjuro 2004-12-15 10:26

Temat zmieniony zgodnie z sugestia Milki :)

AklimX 2004-12-14 15:08

"Wzor do liczenia figur" ? przecierz figura powstaje jedna to co tu liczyć ? . Może "sympatyczny wzorek na kreślenie figur ?"

Sanjuro 2004-12-13 13:30

"Wzor do liczenia figur" - kurcze no to dopiero bezsensownie brzmi :/

Moze by tak mały konkurs na najlepsza nazwe dla artykulu? Do wygrania dlugopis z widokiem na "może" :)

Deti 2004-12-12 08:55

Zamień ten tytuł .. "wzór do ......" <-- tu wpisz co on oblicza

R0la 2004-12-11 20:47

:o nie mało, znalazłeś przez przypadek, to tak ja mój stuff przy sprzątaniu pokoju :D:D ale wzór...konkret:]

Sanjuro 2004-12-10 23:26

Milka: Stronki gdzie znalazłem informacje są już zamieszczone :) Ledwo je odnalazłem, ale jak to mówia: "Google twoim przyjacielem" :)

Adam Boduch: Szefie ten wzór tak wszyscy oficjalnie nazywają (a dokładnie to "Superformula"). No chyba, że zmienię na "Wzór Gielis'a" czyli od nazwiska tego co go odkrył.

Ma ktoś pomysł jak wyeliminować błędy przy nieparzystych wartościach n2 i n3?

LukaStrz 2004-12-10 17:53

Fajny ten wzór :d

AklimX 2004-12-10 16:44

jak znajdujesz coś w necie to wypadałoby by podać adres tej stronki :D

Adam Boduch 2004-12-10 14:30

Prosze nadać artykułowi jakiś sensowny temat.

netvalker 2004-12-10 10:55

Gwiazda 6-ścio ramienna to parametry: m=12;a=35;b=100;n1=n2=n3=2

pees. bardzo ciekawy wzorek!

Booboo 2004-12-16 10:54

mam wrażenie jak byś mi robił powtorkę z całek
co do samej idei jest stara jak świat
ale ogulnierzecz biorąc arcik fajny