algorytm rysujący koło

0

Witam

Poszukuje algorytmu rysującego koło

0

[glowa]
x2 + y2 = r^2 => f(x) = +-sqrt(rr-xx)
albo f(x) = r*(sin(x) + cos(x))

0

Wada pierwszego podanego sposobu jest duzy rozrzut punktow przy "brzegach" kola (tam gdzie prawie pionowa jest styczna).
Drugiego jest wykorzystanie funkcji trygonometrycznych, ktore sa wolne.
A tutaj trzeci sposob. Algorytm Bresenhama:

const
  OffY = 200;
  OffX = 200;
var
  x, y, p, R: Integer;
begin
  R := 100;
  x := 0;
  y := R;
  p := 3-2*R;
  repeat
    Canvas.Pixels[OffX+x, OffY+y] := clRed;
    Canvas.Pixels[OffX+x, OffY+-y] := clRed;
    Canvas.Pixels[OffX+-x, OffY+y] := clRed;
    Canvas.Pixels[OffX+-x, OffY+-y] := clRed;
    Canvas.Pixels[OffX+y, OffY+x] := clRed;
    Canvas.Pixels[OffX+y, OffY+-x] := clRed;
    Canvas.Pixels[OffX+-y, OffY+x] := clRed;
    Canvas.Pixels[OffX+-y, OffY+-x] := clRed;
    x := x + 1;
    if p <= 0 then
      p := p+4*x+2
    else
      if x-1 <> y then
      begin
        y := y-1;
        p := p+2*(2*x-2*y+1);
      end;
    until (x-1=y);
end;
0

dzieki

0

Witam

Dzieki za pomoc, skorzystalem z algorytmu Dryobatesa, bo szczerze mowiac nie wiem jak zastosowac pierwsza odpowiedz. Ten algorytm jest bardzo dobry, nie wiem tylko na jakich 'prawach' on dziala, skad to p? Mialem nadzieje, ze w odpowiedzi dostane algorytm ktory bede mogl przeksztalcic tak, ze bedzie mi rysowal luk kola o podanym promieniu i kacie rozwarcia. Nie chodzi mi o wycinek kola bo to jest w Delphi - Pie. Chodzi o sam luk, dodatkowo zeby dalo sie odczytac z dzialania algorytmu jakie ma wspolrzedne poczatek, koniec i srodek kola na podstawie ktorego rysowany jest luk. Probowalem ze wzorami na ruchu punktu po okregu ale wychodza straszne kwadraty, ale zastosowalem te wzory do rysowania wielokatow foremnych o dowolnej liczbie bokow. Jesli ktos ma taki algorytm (do kola lub Od razu do luku) to prosze o pomoc.

Wczesniej pisalem tez, ze poszukuje komponentu podobnego do Image tylko bez ograniczenia wielkosci rysowanego rysunku, w Image da sie cos ponad 2000x2000 pikseli, a ja potrzebuje wiecej. Komponent nie musi miec nawet procedur rysujacych figury wystarczy ze bedzie mial 'zapalanie' pikseli, zeby mozna bylo skopiowac go do zmiennej typu TBitmap. No i jak zapisac do BMP'ka DPI?

pozdrowawiam
[email protected]

0

Nie chodzi mi o wycinek kola bo to jest w Delphi - Pie. Chodzi o sam luk, dodatkowo zeby dalo sie odczytac z dzialania algorytmu jakie ma wspolrzedne poczatek, koniec i srodek kola na podstawie ktorego rysowany jest luk.

W Delphi jest Arc, ktore rysuje sam luk. Podany algorytm Bresenhama jest przeznaczony tylko do okregu. Rysowana jest jedynie 1/8 calego okregu, reszta jest powielana symetrycznie. To p, to zmienna na podstawie ktorej wyznaczany jest nastepny krok. Zaczynamy rysowac od punktu (0, r) i idziemy wzdluz osi x. Zaleznie od wartosci p, nastepny punkt do zapalenia, jaki wybieramy lezy na tej samej wysokosci lub o 1 pixel nizej.
Da sie przerobic ten algorytm, by rysowal tylko luk, ale to wymaga sprawdzania kata. Mozna tez pokusic sie o przerobienie go tak, by rysowana zostala elipsa, ale trzeba wtedy wprowadzic poprawki przy wyliczaniu na roznice w dlugosci osi elipsy.

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