![]() |
Halbkreis zwischen zwei Punkten
Hi,
wie kann ich einen Halbkreis zwischen zwei Punkten zeichnen lassen? Also ich habe die Koordinaten x,y und x2,y2. Eine direkte Verbindung könnte ich mit
Delphi-Quellcode:
zeichnen.
canvas.moveto(x,y);
canvas.LineTo(x2,y2); Ich möchte aber eine parabel- bzw. ellipsenähnliche Form haben. Wie ist das möglich, wenn ich nur diese zwei Koordinaten habe? Vielen Dank für eure Hilfe & viele Grüße Taugenichts |
Re: Halbkreis zwischen zwei Punkten
Welche Form willst du denn genau haben? Einen Halbkreis oder eine Parabel kannst du dir mit
![]() ![]() |
Re: Halbkreis zwischen zwei Punkten
Hallo Taugenichts,
kannst Dir mal die folgender Funktion anschauen: Zitat:
Klaus |
Re: Halbkreis zwischen zwei Punkten
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
danke für eure Antworten. Könnt ihr bitte ein Beispiel machen? Die Funktion canvas.pie hatte ich mir bereits angesehen. Mir ist jedoch unklar, wie ich mit meinen zwei Koordinaten da umgehen soll, da ich dafür vier brauche?! Außerdem, wo finde ich denn die Onlinehilfe zu DrawPie und Drawbezier? Ich habe Delphi 6, das Projekt soll aber auch unter Delphi 5 laufen.... Vielen Dank. P.S.: Ich habe gerade gesehen, mit canvas.arc kann ich auch einen Bogen zeichnen - ähnlich wie canvas.ellipse - bloß was muss ich für die vier Koordinaten angeben? P.S.S.: Ich habe mal eben noch eine Grafik angehängt, mit der es vllt. ein wenig verständlicher wird, was ich will. Die orangene Linie soll dann der "Halbkreis" (Bezier?) sein. |
Re: Halbkreis zwischen zwei Punkten
für canvas.pie kannst Du doch auf deine 2 Punkte jeweils eine Senkrechte oder Waagerrechte bilden
die Senkrechte/Waagerechte hat die gleiche Länge wie der Abstand von Punkt 1 zu Punkt 2. Canvas.pie sollte dann einen Halbkreis malen. canvas.arc sollte das ähnlich machen Variierst Du die Länge der Senkrechten/Waagerechten dann wird der Halbkreis zur HalbEllipse oder ähnliches. Grüße Klaus |
Re: Halbkreis zwischen zwei Punkten
Sorry, kannst du mir das bitte den Code dazu posten? Ich bekomme es nicht gebacken...
den Abstand zwischen diesen zwei Punkten kann ich mit
Delphi-Quellcode:
berechnen.
var
abstand: LongInt; Radiant: Extended; x2,x,y2,y: integer; begin Radiant:= (x2-x) * (x2-x) + (y2-y) * (y2-y); abstand:= trunc(sqrt(Radiant)); Und dann? Wie lautet die Syntax von canvas.pie? Ich meine klar, ich sehe, dass ich x1,y1 usw. eintragen muss, aber was ist die _logische_ Syntax? Welcher Punkt bezeichnet was? Wo wird da zwischen was etwas gezeichnet? Ich verstehe die Funktion nicht ganz... Sorry, dass ich mich so dämlich anstelle. |
Re: Halbkreis zwischen zwei Punkten
Nun, da habe ich Dich traurigerweise erstmal in die falsche Wege geleitet.
Es tut mir leid. Ich habe auch noch ein paar Probleme. Aber mit Punkten die auf der gleiche X-Achse liegen geht es mit dem folgenden Code:
Delphi-Quellcode:
Mehr fällt mir dazu heute auch nicht ein.
procedure circle(canvas:TCanvas;p1,p2:TPoint);
var radius: Integer; i,x,y: Integer; m:real; begin if p1.x = p2.x then radius := (p2.y - p1.y) DIV 2 else if p1.y = p2.y then radius := (p2.x -p1.x) DIV 2 else radius := round(sqrt ( sqr(p2.x - p1.x) + sqr(p2.y-p1.y))) DIV 2; m := (p2.Y - p1.Y)/(p2.x -p1.X); canvas.Pen.Color:=clRed; canvas.penPos:=p1; canvas.LineTo(p2.x,p2.y); canvas.PenPos:=p2; canvas.Pen.color:=clBlack; for i:=0 to 180 do begin x:=p2.x+round(radius*cos(i*pi/180))-radius; y:=p2.y+round(radius*sin(i*pi/180)); sleep(10); canvas.LineTo(x,y); end; end; procedure TForm1.Button1Click(Sender: TObject); var p1,p2:TPoint; begin p1.X:=450; p1.y:=150; p2.X:=300; p2.Y:=150; circle(Form1.Canvas,p1,p2); end; end. Grüße Klaus |
Re: Halbkreis zwischen zwei Punkten
Hallo Taugenichts,
eine verbesserte Version: Ich hoffe Du steigst da ein wenig durch. Grüße Klaus [edit] für RadToDeg muß die Math Unit eingebunden werden [/edit]
Delphi-Quellcode:
procedure circle(canvas:TCanvas;color,bgColor:TColor;p1,p2:TPoint;deg:Integer);
// canvas -> Zeichenfläche // color -> Kreisfarbe // bgColor -> Hintergrundfarbe // p1 -> Startpunkt // p2 -> zweiter Schnittpunkt // deg -> Kreisdrehung 0..360 var radius: Integer; x,y: Integer; pz:Tpoint; i,j : real; m:real; rect: TRect; begin canvas.brush.Color:=bgColor; canvas.FillRect(canvas.ClipRect); // Fülle Canvas mit bgColor m := (p2.Y - p1.Y)/(p2.x -p1.X); // Die Steigung der Geraden // der Punkt pz befindet sich auf der Geradenmitte if p1.x = p2.x then // wenn die Gerade eine Sekrechte ist begin radius := (p2.y - p1.y) DIV 2; pz.y := p1.Y + radius; pz.x := p1.X; j:= -90; i:=-90; end else // wenn die Gerade eine Waagerechte ist if p1.y = p2.y then begin radius := (p2.x -p1.x) DIV 2; pz.Y := p1.Y; pz.X := p1.x + radius; j := 0; i:=0; end else // die Gerade ist eine Schräge begin radius := round(sqrt ( sqr(p2.x - p1.x) + sqr(p2.y-p1.y))) DIV 2; pz.X := p1.X + (p2.X - p1.X) DIV 2; pz.y := p1.y + (p2.y - p1.y) DIV 2; //ShowMessage(floatToStr(m)); j := radToDeg(arctan(m)); // arctan der Steigung = Winkel i:=j; end; canvas.Pen.Color:=color; if p1.X < p2.X then canvas.PenPos:=p2 else canvas.PenPos:=p1; // male einen Halbkreis while i < j + deg do begin x:=pz.x+round(radius*cos((i*pi/180))); y:=pz.y+round(radius*sin((i*pi/180))); canvas.LineTo(x,y); i:=i+1; end; end; procedure TForm1.Button1Click(Sender: TObject); var p1,p2:TPoint; begin p1.X:=300; p1.y:=250; p2.X:=125; p2.Y:=150; circle(Form1.Canvas,clRed,clBlack,p1,p2,180); end; |
Re: Halbkreis zwischen zwei Punkten
ich habs mal getestet und bei mit funzt 'RadToDeg' nicht. Sowohl bei D3 als auch D2k5PE.
|
Re: Halbkreis zwischen zwei Punkten
Die Math Unit muß für RadToDeg eingebunden werden
Grüße Klaus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:43 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz