Algorytm rysowania gwiazdy, promieni

0

Witam.

otóż od paru dni męczę się ze stworzeniem rysunku używając

 Image1.Canvas 

.
Cel główny to zrobienie punktu z którego będą wychodziły 128 promieni dookoła i ich zakończenia mają tworzyć koło.
Sprawa byłaby prosta gdyby nie doszły dodatkowe punkty do zrealizowania, czyli każdy promień ma posiadać możliwość zmiany długości.
Czyli głównie problem jest stricte matematyczny.

To co posiadam obecnie może trochę przypomina koło. Zastanawiam się czy czasem nie będę musiał zbudować tablicy z zapisanymi wszystkimi możliwymi punktami. Zdjęcie:

Circle.png

A jeżeli chodzi o to jak to obliczyłem to:

  1. Liczę i zapisuję wszystkie punkty na obwodzie kwadratu komponentu TImage
  2. Liczę i zapisuję wszystkie punkty na obwodzie rąbu narysowanego w tym kwadracie
  3. Obliczam środek pomiędzy punktami na obwodzie kwadratu i obwodzie rąbu.

dodanie obrazka do załączników posta - @furious programming

0

nie wiem czy dobrze zrozumiałem
masz punkt będący środkiem okręgu , promień okręgu jak rozumiem jest znany, i masz to narysować , dodatkowo kreśląc 128 promieni ?

3

Co znaczy w danej chwili?
Możesz podać pełną treść zadania?

  1. No to rozbijasz muzykę na 128 pasm wg częstotliwości lub falek lub dowolnego innego kryterium i masz tablicę na 128 wartości: tb
  2. Normujesz tablicę do wartości MaksymalnegoPromeniaKtóryZmieściSieNaFormatce
  3. W pętli po I 0..127
  4. Wyliczamy kąt A = 2*PI/128
  5. Rysujemy linię od ŚrX, ŚrY do ŚrX+tb[I]*sin(A), ŚrY+tb[I]*cos(A)
  6. Koniec pętli
0
   if Image1.Width <= Image1.Height then begin
    WidReturn := Image1.Width;
  end else begin
    WidReturn := Image1.Height;
  end;

  SrX := (WidReturn div 2) + ((Image1.Width - WidReturn) div 2);
  SrY := (WidReturn div 2) + ((Image1.Height - WidReturn) div 2);

  radius := WidReturn / 2;

  for i := 0 to 127 do begin
    A := ( (2*3.14) / 128 ) * i;
    x := Trunc( SrX+radius*sin(A) );
    y := Trunc( SrY+radius*cos(A) );

    Image1.Canvas.Pen.Width := 3;
    Image1.Canvas.Pen.Color := clWhite;
    Image1.Canvas.MoveTo( SrX, SrY );
    Image1.Canvas.LineTo( x, y );
  end; 
0

Jeszcze mam jedno pytanie odnośnie wizualizacji, a mianowicie wygładzenie wizualizacji.
Mam tablicę 128 elementową, gdzie każdy element to po prostu liczba.
I teraz powiedzmy mam taki układ

0: 100
1: 20
2: 10
3: 75
4: 2
5: 0
6: 120
... itd

teraz, jakie obliczenia matematyczne zastosować, aby wygładzić wszystko. Kombinowałem coś z sinusem ale marnie mi to wyszło, kodu już nie mam, jedynie mam kod który mi to wyrysowywuje:

x128 := 0;
Width128 := Visualization.Width / 128;
for i := 0 to Visualization.Width-1 do begin
  if (i/Width128 <= x128) and ((i+1)/Width128 > x128  ) then begin
    x128 := x128 + 1;
    Visualization.Canvas.Pen.Width := 2;
    Visualization.Canvas.Pen.Color := ColorFill;
    Visualization.Canvas.Brush.Color := ColorFill;
    if ShowBorder = true then Visualization.Canvas.Pen.Color := ColorBorder;
    Visualization.Canvas.MoveTo( i, Visualization.Height );
    Visualization.Canvas.LineTo( i, Visualization.Height - FFTFallOff[x128] );
  end;
end;
0

Tzn. masz na myśli antyaliasing, czy jakieś inne pojęcie "wygładzania"? Na wszelki wypadek zaglądnij tutaj:

0

Chodzi mi dokładnie o wygładzenie poziomu wysokości wszystkich pasków, żeby nie odchodziły jakoś od normy

screen.png

Myślałem na początku nad zrobieniem średniej wszystkich wysokości słupków, a następnie odjęcie bądź dodanie do każdej wartości wyniku, ale i tak to nie pomaga za bardzo.

0

Nie za bardzo rozumiem, bo ten obrazek jest rozmyty... Jeśli chcesz pokazać jakieś pikselowe różnice to pod żadnym pozorem nie używaj JPEG, bo wszystko się kompresuje;

Te promienie z powyższego obrazka to nic innego jak prostokąty, które możesz rysować za pomocą metody FillRect; Wtedy będziesz miał wszystko kwadratowe - bez zaokrągleń końców.

0

Chodzi o to by wizualizacja nie była taka postrzępiona, tylko każdy pasek wizualizacji jakoś współgrał z kolejnymi i tworzył wygładzony kształt zakończenia.:
np.:
Jeżeli paski po bokach mają wysokość 50, 50 a pasek pomiędzy nimi ma wysokość 100, to chciałbym aby się jakoś zrównoważyły i stworzyły (z 50, 100, 50) coś w rodzaju 70, 80, 70, tak aby widać było gdzie wizualizacja ma uwypuklenie, ale nie żeby jakieś poszczególne paski wystrzeliwały nagle w górę.

0

Bez tytułu.png
Próbowałem nawet robić średnią pomiędzy wierzchołkami i zastosować do obniżenia wyższych pasków, ale dalej są to nieregularne kształty

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