Algorytm rysowania gwiazdy, promieni

Odpowiedz Nowy wątek
2015-01-07 18:46
0

Witam.

Otórz 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

edytowany 3x, ostatnio: furious programming, 2015-01-07 20:31
@chkam - obrazki dodawaj do załączników postów i wyświetlaj je w ich treści; - furious programming 2015-01-07 20:32

Pozostało 580 znaków

2015-01-07 19:02
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 ?

Tak tylko każdy promień, może przyjąć w danej chwilii inną wartość - chkam 2015-01-07 19:14
sformułuj problem jeszcze raz, w taki sposób aby był zrozumiały , bo póki co nie wiadomo o co ci chodzi - grzegorz_so 2015-01-07 19:21

Pozostało 580 znaków

2015-01-07 19:13

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

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon, 2015-01-07 19:30
Wizualizacja paskowa do odtwarzacza muzyki, składa się z 128 elementów zmieniających rozmiar na osi Y, opartą od dołu na osi X Moim zadaniem jest zrobić taką samą wizualizację ale opartą na kole lub środkowym punkcie koła, żeby ułatwić zadanie zamiast pasków można użyć samych linii. - chkam 2015-01-07 19:18
Tylko jeszcze jak przesunąć kąt dalej aby rysował kolejną linię obok, bo obecnie po wykonaniu tych działań wszystkie linie nakładają się na siebie - chkam 2015-01-07 20:00
Jeżeli się nakładają oznacza to tylko jedno, źle obliczyłeś kąt A - _13th_Dragon 2015-01-07 20:01
A := (2*3.14)/128 - chkam 2015-01-07 20:02
No i jeszcze przez 'I' pomnóż. - _13th_Dragon 2015-01-07 20:05
ok, mam. Wielkie dzięki - chkam 2015-01-07 20:08

Pozostało 580 znaków

2015-01-07 20:06
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; 
edytowany 1x, ostatnio: chkam, 2015-01-07 20:08

Pozostało 580 znaków

2015-09-15 01:32
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;

Pozostało 580 znaków

2015-09-15 02:08
0

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


edytowany 3x, ostatnio: furious programming, 2015-09-15 02:10

Pozostało 580 znaków

2015-09-15 02:50
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.

edytowany 2x, ostatnio: furious programming, 2015-09-15 16:20
Obrazki dodawaj do załączników postów; - furious programming 2015-09-15 16:20

Pozostało 580 znaków

2015-09-15 16:23
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.


Pozostało 580 znaków

2015-09-15 16:41
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ę.

Narysuj może coś, bo nie mogę zrozumieć tego końcowego efektu... Tylko zapisz obrazek w jakimś formacie bez kompresji stratnej, np. BMP lub PNG; - furious programming 2015-09-15 17:14

Pozostało 580 znaków

2015-09-15 19:55
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

edytowany 2x, ostatnio: chkam, 2015-09-15 21:18
Wrzuć obrazek do załączników posta; - furious programming 2015-09-15 21:11

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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