Rysowanie okręgu na wykresie TChart

0

Witam.

Napisałem w Lazarusie (najnowsza wersja) program okienkowy wyliczający wszystkie pierwiastki z liczb zespolonych. Następnie zostają one przedstawione na wykresie (TChart). Problem polega na tym, że te punkty muszą znajdować się na okręgu, który nie wiem jak na tym wykresie narysować.

Przykład: Program wyliczył pierwiastek 10 stopnia z liczby zespolonej 5+9i, wszystkie pierwiastki naniósł na wykres.
Obrazek1

Następnie chcę dorysować okrąg tak, aby wszystkie pierwiastki znajdowały się na tym okręgu, czyli coś takiego:
Obrazek2

Obliczenie promienia tego okręgu nie stanowi problemu (będzie to pierwiastek n-tego stopnia z modułu), tak samo jego środek znajduje się na współrzędnych (0, 0).
Próbowałem użyć Ellipse, jednak okrąg wtedy nie skaluje się jak wykres + muszę się odnosić do współrzędnych względem wykresu jako obiektu, w pikselach. Czy macie może jakieś inne pomysły?

Uprzedzam że jestem laikiem w Pascalu i niewiele z niego umie (odbębnić tylko te pół roku Pascala na studiach :D)
Program piszę na PC z Windows 8.1 64bit :)

1

W takim przypadku skorzystaj z równania parametrycznego okręgu i narysuj go z dużej ilości krótkich odcinków.

0

pelsta, zadziałało, jednak do utworzenia okręgu musiałem wykorzystać punkty, nie odcinki, ponieważ wyglądało to dość dziwnie :)
Przykład
Tak czy inaczej, teraz mam kolejny problem, ponieważ program musi jeszcze odczytać współrzędne x i y danego punktu z wykresu. Napisałem bardzo prostą funkcję do tego (wzorując się na znalezionej na wiki.freepascal.org), wykorzystując z ChartToolset Data point click, jednak odczytuje ona również punkty okręgu oraz osi współrzędnych.
Oto kod tej funkcji:

procedure TForm2.ChartToolset1DataPointClickTool1PointClick(
  ATool: TChartTool; APoint: TPoint);
var
  x, y: Double;
begin
  with ATool as TDatapointClickTool do
      with (Series as TLineSeries) do begin
        x := GetXValue(PointIndex);
        y := GetYValue(PointIndex);
        Form2.Edit7.Text:='x='+FloatToStr(x)+', y='+FloatToStr(y);
      end;
end;

Pierwiastki znajdują się w serii Chart1LineSeries1, okrąg w Chart1LineSeries2, a współrzędne w Chart1ConstantSeries1 (współrzędna x) i Chart1ConstantLineSeries2 (współrzędna y).
Z góry dziękuję za pomoc :)

dodanie znacznika <code class="delphi"> - fp

0
antzem napisał(a):

do utworzenia okręgu musiałem wykorzystać punkty, nie odcinki, ponieważ wyglądało to dość dziwnie :)

Nie wiem jak rysujesz ten okrąg ale tutaj masz przykład okręgu narysowanego z 50 odcinków (oczywiście może być ich więcej) i moim zdaniem wygląda bardzo dobrze.
Okrąg.png

procedure TForm1.Button1Click(Sender:TObject);
var
  x0,y0,r:Integer;
  x,y:Integer;
  t,tmax:Integer;
  w:Real;
begin
  r:=80;
  tmax:=50;
  w:=2*pi/tmax;
  with Image1,Canvas do
  begin
    x0:=Width div 2;
    y0:=Height div 2;
    MoveTo(x0,y0-r);
    for t:=1 to tmax do
    begin
      x:=Round(x0+r*Sin(w*t));
      y:=Round(y0-r*Cos(w*t));
      LineTo(x,y);
    end;
  end;
end;
0

Okrąg na wykresie narysowałem dodając do serii 360 punktów o koordynatach XY (wyliczanych z równania parametrycznego okręgów, tak jak wspominałeś). A Canvasem rysować tego okręgu nie mogę, a czemu to chyba najlepiej wytłumaczy obrazek:
Bez nazwy4.png

Proszę nie zwracać uwagi na to że ten okrąg rysowany Canvasem jest za duży (użyłem na razie prostą funkcję), problem polega na tym że nie jestem w stanie umieścić go dokładnie na środku wykresu (w punkcie 0,0), bo po wprowadzeniu większych wartości sam wykres się pomniejsza (wartości na lewej osi są większe, więc wykres się musi zmniejszyć). Wyłączenie osi lewej i dolnej niestety nie wchodzi w rachubę :/

"Mój" wzór na dodanie 360 punktów na wykresie, które utworzą okrąg:

for k:=0 to 359 do
     Form2.Chart1LineSeries2.AddXY(Form1.pierwmodul*cos(k), Form1.pierwmodul*sin(k));

Także ponawiam pytanie, czy jest możliwość wyłączenia możliwości pobierania współrzędnych x i y w ChartToolset Data point click dla okręgu i osi współrzędnych? Z góry dzięki za pomoc ;)

dodanie znacznika <code class="delphi"> - fp

EDIT: Problem został rozwiązany, wystarczyło do AffectedSeries wpisać 1 i czyta teraz współrzędne tylko pierwiastków ;)

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