Rysowanie gwiazdy pustej w środku

Rysowanie gwiazdy pustej w środku
Grzegorz16
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad 11 lat
  • Postów:56
0

Witam!

Od kilku dni staram się narysować na Canvasie gwiazdę pięcioramienną, która będzie pusta w środku.
Znalazłem podobne tematy:

ale w żadnym z nich nie ma takiego kodu, żeby narysował właśnie taką gwiazdę jaką chcę, a jeśli
już to musi mieć ona duże rozmiary, a potrzebuje małej. Sam doszedłem do narysowania pentagramu.

Efekt, który uzyskałem wygląda mniej więcej tak:

http://pl.wikipedia.org/w/index.php?title=Plik:Pentagram_green.svg&filetimestamp=20070309050356

Dążę do narysowania takiej gwiazdy:

http://pl.wikipedia.org/w/index.php?title=Plik:Five-pointed_star.svg&filetimestamp=20091210212909

Kopiuj
  procedure Star(Left, Top: Integer; N, R: Byte);
  var
    i, x, y: Integer;
  begin
    if N < 5 then
      Exit;

    with Image1.Canvas do
     begin
       MoveTo(Left, Top);
       for i := 1 to (N * 2) do
        begin
          y := Round(Sin(DegToRad(180 * ((N - 1) / N)) * i) * R);
          x := Round(Cos(DegToRad(180 * ((N - 1) / N)) * i) * R);
          Left := Left + x;
          Top := Top + y;
          LineTo(Left, Top);
        end;
     end;
  end;

Proszę o jakąkolwiek pomoc!

Pozdrawiam


Windows jest jak kobieta: ma ładną "etykietę", twierdzi, że potrafi wszystko i wszędzie, ale nie akurat wtedy, gdy tego chcesz.
edytowany 1x, ostatnio: Grzegorz16
KA
  • Rejestracja:prawie 21 lat
  • Ostatnio:około 4 lata
  • Postów:1652
0

Dam ci taką radę: jeżeli nie potrafisz zrobić czegoś tak od razu, to spróbuj podzielić problem na mniejsze problemy, z którymi sobie radzisz. Rozwiąż je przy pomocy osobnych funkcji. Przykład: Zauważ, że ta gwiazda ma 5 identycznych ramion. różnica polega tylko na tym, że są obrócone o pewien kąt i znajdują się w innej pozycji. Napisz funkcję, która rysuje ramię w wybranej pozycji i o wybranym kącie. Potem wywołaj tę funkcję 5 razy z odpowiednimi parametrami.

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:2 miesiące
1

Właściwie to było bardzo ciekawe zadanie nie z punktu widzenia programowania zaś z punktu widzenia matematyki.
Bez matematycznego rozwiązania nie da rady tego zadania rozwiązać (wg mnie, poprawcie jeżeli się mylę).

Kopiuj
procedure TForm1.Star(Left,Top,N:Integer;R:Double);
var I,D:Integer;
var S:Double;
begin
  if N>2 then
  begin
    D:=(N-1)shr(1);
    S:=R*abs(Cos(D*Pi/N)/Cos((Pi-D*Pi)/N));
    Image1.Canvas.MoveTo(Left+Round(S*Sin(-Pi/N)),Top-Round(S*Cos(-Pi/N)));
    for I:=0 to N-1 do
    begin
      Image1.Canvas.LineTo(Left+Round(R*Sin(2*i*Pi/N)),Top-Round(R*Cos(2*i*Pi/N)));
      Image1.Canvas.LineTo(Left+Round(S*Sin((2*i+1)*Pi/N)),Top-Round(S*Cos((2*i+1)*Pi/N)));
    end;
  end;
end;

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 2x, ostatnio: _13th_Dragon
SI
  • Rejestracja:prawie 15 lat
  • Ostatnio:prawie 11 lat
  • Postów:184
1

_13th_Dragon, mnie też zaciekawiło to zadanie z matematycznego punktu widzenia. Zresztą sama gwiazda pitagorejska (lub inaczej pentagram) już sama w sobie jest ciekawa, choćby ze względu na ukryty w niej złoty podział.
Aby narysować pentagram bez wewnętrznych linii trzeba znaleźć współrzędne punktów przecięcia poszczególnych ramion. Przyjmując, że zewn. wierzchołki po połączeniu tworzą pięciokąt foremny wpisany w okrąg o promieniu R, wówczas wierzchołki wewn. tworzą pięciokąt wpisany w okrąg o promieniu r i obrócony o kąt 36 stopni. Oczywiście obydwa okręgi mają wspólny środek

Wykorzystując złoty podział wyszło mi, że ten promień wynosi r = 0,5 (3 - sqrt(5)) R

Mając dane obydwa promienie dalej już jest z górki, wystarczy wykorzystać równanie parametryczne okręgu:

Kopiuj
procedure Pentagram(Promien, X, Y, Kat: Integer; Kanwa: TCanvas);
var i, R1, R2: Integer;
begin
  R1:= Promien;
  R2:= Round(R1*(3-Sqrt(5))/2);  // R2 może być typu rzeczywistego, aby 2 razy nie zaokrąglać
  Kanwa.MoveTo(X + Round(Cos((Kat+54)*Pi/180)*R1), Y + Round(Sin((Kat+54)*Pi/180)*R1));
  for i:= 1 to 5 do begin
    Kanwa.LineTo(Round(X + Cos((i*72+18+Kat)*Pi/180)*R2), Y + Round(Sin((i*72+18+Kat)*Pi/180)*R2));
    Kanwa.LineTo(Round(X + Cos((i*72+54+Kat)*Pi/180)*R1), Y + Round(Sin((i*72+54+Kat)*Pi/180)*R1));
  end;
end;

Poszczególne dane oznaczają
Promień - dotyczy większego okręgu (mieści się w nim pentagram)
X i Y - współrzędne środka okręgów
Kąt - kąt obrotu pentagramu w stopniach od 0 do 71 (dalej będzie się powtarzać co 72 stopnie)
Kanwa - gdzie narysować

_13th_Dragon
Tylko że miała być gwiazda o dowolnej ilości ramion. Ciekawe czy da się udowodnić ze: (3-Sqrt(5))/2 = Cos(2Pi/5)/Cos((Pi-2Pi)/5) bo liczbowo nam się zgadza, na tyle znaków na ile excel dal rady obliczyć.
bogdans
Moderator
  • Rejestracja:ponad 16 lat
  • Ostatnio:prawie 5 lat
0

Wzór ogólniejszy (n nieparzyste, łączymy co drugi wierzchołek) na promień wewnętrznego okręgu jest taki: r = R cos(2π/n)/cos(&pi/n). Prosta trygonometria.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 2 godziny
  • Lokalizacja:Laska, z Polski
  • Postów:10053
0

Wyznacz w punkcie A srodek gwiazdy. Potem użyj wzoru:

Kopiuj
var Tablica : array [1..5] of TPoint;
begin
  for I := 1 to 5 do
    begin
      Tablica[I].X := A.X + Odl * Sin(Angle /180 * Pi);
      Tablica[I].Y := A.Y + Odl * Cos(Angle /180 * Pi);
      Angle := Angle + 72;
    end;
end;

Gdzie Odl to Odleglosc czyli "promień" gwiazdy, Angle to kat ktory zwiększaj o 72 (365:5), Pi ~3,1415.
Potem mając wspolrzedne tych pieciu ramion gwiazdy użyj funkcji:

Kopiuj
Canvas.MoveTo();
Canvas.LineTo();

Edit: A, ważna sprawa, to ma byc ten po lewej czy prawej?
user image

edytowany 4x, ostatnio: Riddle
Azarien
coś ci krzywo wyszło ;-)
Riddle
bo rysowałem w paintcie
2

@TomRiddle, proponuję byś wykonał taki kod:

Kopiuj
boolean nieRozumiemPytania=true;
while(nieRozumiemPytania)
{
   czytamPytanie);
   nieRozumiemPytania=!zrozumialemPytanie();
   
}
odpowiadam();
_13th_Dragon
Za słaby procesor by to załadować :-D
Riddle
ha ha ha, ale śmieszne
Xitami
  • Rejestracja:ponad 20 lat
  • Ostatnio:około rok
0

Weisstein, Eric W. "Pentagram." From MathWorld--A Wolfram Web Resource. http://mathworld.wolfram.com/Pentagram.html
user image

_13th_Dragon
To tylko dla N=5. A gdzie dla N=6, N=7, itd ?
Grzegorz16
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad 11 lat
  • Postów:56
0

Dziękuję wszystkim za zainteresowanie się tym tematem.
_13th_Dragon i simplex, Wasz kod świetnie rysuję gwiazdę nie zależnie od rozmiarów promienia,
za co bardzo Wam dziękuję :)


Windows jest jak kobieta: ma ładną "etykietę", twierdzi, że potrafi wszystko i wszędzie, ale nie akurat wtedy, gdy tego chcesz.
_13th_Dragon
Kod simplex'a rysuje poprawnie tylko 5 ramienną gwiazdkę dla pozostałych jak dorysujesz "środek" to nie będą to linie proste lecz łamane.
Xitami
  • Rejestracja:ponad 20 lat
  • Ostatnio:około rok
0

Weisstein, Eric W. "Star Polygon." From MathWorld--A Wolfram Web Resource.
http://mathworld.wolfram.com/StarPolygon.html

edytowany 1x, ostatnio: Xitami
0

Ogólny wzór (n, k nie muszą być względnie pierwsze) jest taki: r = Rsin(β)/sin(π-β-α/2), α = 2π/n, β=(1/2)(π-kα) .
Na zewnętrznym okręgu są wierzchołki (Rcos(&alphai),Rsin(&alphai)), na wewnętrznym (rcos(&alphai+α/2),rsin(&alphai+α/2)) i=0,...,n-1.
Przydała się szkolna trygonometria.
user image

edytowany 1x, ostatnio: madmike
Riddle
Jaki jest sens w dzieleniu i mnożeniu przez tą samą liczbę? a = 2*n/n
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)