Autor Beitrag
Nightwalker_Z
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: Do 05.12.02 21:02 
Hallihallo
Ich möchte gerne ein Plottersimulationsprogramm entwerfen.
Ich frage mich, wie man einen Kreis auf einem Canvas darstellen kann
Ich will in etwa so eine Prozedur schreiben:

ausblenden Quelltext
1:
procedure Drawcircle(x_start,y_start,x_zw,y_zw,x_end,y_end);					


Diese Prozedur soll einen (nicht vollständigen) Kreis zeichnen, der durch die drei Punkte geht...
--> Kreis fängt bei (x_start|y_start) an und endet bei (x_end|y_end).
Klar.. es gibt die Funktion Arc oder Circle, aber die will ich nicht verwenden, weil die meinen Kreis SOFORT auf mein Canvas draufklatschen... ich will das Ding Pixel für Pixel selber zeichnen....


Wäre dankbar für Antworten ....
Greetz
Nightwalker_Z :twisted:
Tante
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 41



BeitragVerfasst: Di 10.12.02 18:09 
Hallo Nightwalker_Z!

Also zuerst mußt Du mal den Mittelpunkt des Kreises (oder Kreisbogens) bestimmen. Wenn Du den dann hast, kannst Du den Kreis ganz leicht (Pixel für Pixel) zeichnen.

Der Mittelpunkt ist der "Schnittpunkt der Mittelsenkrechten" der drei Dreiecks-Seiten (ich meine das Dreieck, das durch deine 3 Punkte gebildet wird)
Weißt Du, wie Du diesen Schnittpunkt errechnest?

Also ich geb' Dir kurz ein paar Tips, weil ich nicht weiß, wie fit Du in Mathe bist. Du kannst aber gerne auch wieder nachfragen, wenn Du nicht weiterkommst!

1. Suche Dir zwei Seiten aus. Keine der Seiten sollte waagerecht verlaufen. Wenn Du eine waagerecht dabei hast, dann nimm die beiden anderen!

2. Für jede der beiden berechnest Du den Mittelpunkt. Z.B. wenn Deine Seite zwischen den Punkten (x_start/y_Start) und (x_zw,y_zw) liegt, dann ist der Mittelpunkt ([x_start+x_zw] div 2, [y_start+y_zw] div 2)

3. So, und nun mußt Du die Senkrechten bestimmen. Die Steigung dieser Senkrechten ist der Kehrwert der Steigung (nennen wir sie mal m) der ursprünglichen Seite. Also z.B. m:=(x_start-x_zw) div (y_start-y_zw)
Hier wird es nun wichtig, dass keine Deiner Seiten waagerecht war. Denn sonst würdest Du hier durch 0 teilen und das darf man nicht.

4. Nun mußt Du die Geraden-Gleichungen ermitteln. Du hast jeweils einen Punkt und eine Steigung. Und du mußt auf eine Gleichung der Form y=mx+b kommen. --> Lösung per Dreisatz!

5. Du solltest jetzt zwei Geradengleichungen haben. Diese mußt Du dann gleichsetzen und so erhälst Du den Schnittpunkt.


Okay, dieser Schnittpunkt ist dann also Dein Mittelpunkt. Jetzt berechnest Du noch (z.B. mit Pythagoras) den Radius und dann kannst Du alles in folgende Kreisformel einsetzen:

ausblenden Quelltext
1:
 K(t)= (r * cos(t)+x,r * sin(t)+y)					

wobei r der Radius ist, (x/y) die Mittelpunkts-Koordinaten und t eine Variable, die Du von 0 bis 2 Pi laufen läßt.

Also wie gesagt: Frag' nach, wenn Du nicht weiter weißt! :wink2:
Nightwalker_Z Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: Di 10.12.02 19:25 
Hehey... vielen Dank für die Antwort - die hilft mir echt weiter.
Ich berechne den Radius und den Mittelpunkt aber mit nem Gauss-Algorithmus (Is einfacher dem Rechner beizubringen :lol: )

Aber die Formel

K(t)= (r * cos(t)+x,r * sin(t)+y)

aber was soll das Komma zwischen x und r (x,r) :)

Vielen Dank für die Antwort

Nightwalker_Z
Nightwalker_Z Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: Di 10.12.02 20:24 
War mal wieder zu schnell ;))
ich weiss jetzt, was das Komma soll 8)

Hier der Entwurf
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
var t,ky,kx:real;
    x,y:integer;
Begin
  x:=irgendwas;
  y:=irgendwasanderes;
  r:=undnochmalwas;
  t:=0;
  While t<=(2*Pi) do
  begin
    kx:=r*cos(t)+x;
    ky:=r*sin(t)+y;
    Paintbox1.Canvas.Pixels[round(kx),round(ky)]:=clblack;
    pause(10);
    t:=t+0.01;
  end;
end;


Vielen Dank nochmal

Grüsse
Nightwalker_Z
Nightwalker_Z Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: Di 10.12.02 20:25 
War mal wieder zu schnell ;))
ich weiss jetzt, was das Komma soll 8)

Hier der Entwurf
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
var t,ky,kx:real;
    x,y:integer;
Begin
  x:=irgendwas;
  y:=irgendwasanderes;
  r:=undnochmalwas;
  t:=0;
  While t<=(2*Pi) do
  begin
    kx:=r*cos(t)+x;
    ky:=r*sin(t)+y;
    Paintbox1.Canvas.Pixels[round(kx),round(ky)]:=clblack;
    pause(10);
    t:=t+0.01;
  end;
end;


Vielen Dank nochmal

Grüsse
Nightwalker_Z