Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Halbkreis zwischen zwei Punkten (https://www.delphipraxis.net/70532-halbkreis-zwischen-zwei-punkten.html)

Taugenichts 31. Mai 2006 14:53


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:
canvas.moveto(x,y);
canvas.LineTo(x2,y2);
zeichnen.

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

Nikolas 31. Mai 2006 15:01

Re: Halbkreis zwischen zwei Punkten
 
Welche Form willst du denn genau haben? Einen Halbkreis oder eine Parabel kannst du dir mit Delphi-Referenz durchsuchenDrawPie basteln, eine Bezierkurve sieht auch ganz schon aus Delphi-Referenz durchsuchenDrawbezier.

Klaus01 31. Mai 2006 15:03

Re: Halbkreis zwischen zwei Punkten
 
Hallo Taugenichts,

kannst Dir mal die folgender Funktion anschauen:

Zitat:

Draws a pie-shaped the section of the ellipse bounded by the rectangle (X1, Y1) and (X2, Y2) on the canvas.

procedure Pie(X1, Y1, X2, Y2, X3, Y3, X4, Y4: Integer);

Description

Use Pie to draw a pie-shaped wedge on the image. The wedge is defined by the ellipse bounded by the rectangle determined by the points (X1, Y1) and X2, Y2). The section drawn is determined by two lines radiating from the center of the ellipse through the points (X3, Y3) and (X4, Y4).

The wedge is outlined using Pen, and filled using Brush.

Note: On Windows 95, the sums X1 + X2 and Y1 + Y2 cannot exceed 32768. Also, the sum X1 + X2 + Y1 + Y2 cannot exceed 32768.

Grüße
Klaus

Taugenichts 31. Mai 2006 17:49

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.

Klaus01 31. Mai 2006 21:01

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

Taugenichts 1. Jun 2006 16:38

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:
var
     abstand: LongInt;
     Radiant: Extended;
     x2,x,y2,y: integer;
begin
     Radiant:= (x2-x) * (x2-x) + (y2-y) * (y2-y);
     abstand:= trunc(sqrt(Radiant));
berechnen.

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.

Klaus01 1. Jun 2006 22:10

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:
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.
Mehr fällt mir dazu heute auch nicht ein.

Grüße
Klaus

Klaus01 2. Jun 2006 08:40

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;

fLaSh11 2. Jun 2006 08:50

Re: Halbkreis zwischen zwei Punkten
 
ich habs mal getestet und bei mit funzt 'RadToDeg' nicht. Sowohl bei D3 als auch D2k5PE.

Klaus01 2. Jun 2006 08:53

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.
Seite 1 von 2  1 2      

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