Entwickler-Ecke

Multimedia / Grafik - kreis tangente


nikon - Do 19.06.03 11:18
Titel: kreis tangente
:arrow:

grüsse euch ich hab da ein prob ich soll von einem punkt aus welcher bekannt
ist die zwei tangenten zu einem kreis (mittelpunkt, radius bekannt)zeichnen
leider komme ich nicht auf eine passende gleichung bzw funktion...

also wenn jemand nee idee hat, die sind herzlich willkommen...

bis dahin und danke -der nikon- :shock:


Andreas Pfau - So 22.06.03 16:23

Hallo,

habe ein bisschen rumgetüftelt, habe einen Code geschreiben. Du brauchst ein Form mit einer PaintBox, habe sie aus Tipp-Faulheit "Box" genannt.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
function GetAngle(X, Y: Double): Double;
begin
 If (Y = 0.0Then begin
  If (X = 0.0Then Result := 0.0;
  If (X > 0.0Then Result := Pi / 2;
  If (X < 0.0Then Result := Pi * 1.5;
 end Else
  Result := ArcTan(X / Y);

 If (Y < 0.0Then
  Result := Result + Pi;
 If (X < 0.0And (Y > 0.0Then
  Result := Result + Pi * 2;
end;

procedure TForm1.BoxPaint(Sender: TObject);
const
 X1 = 10;  // Urspurng der Tangenten ('P1')
 Y1 = 10;  // "
 X2 = 200// Mitelpunkt des Kreises ('P2')
 Y2 = 200// "
 R  = 100// Raduis
var
 A, B, C: Double;         // Strecken des Dreiecks, C = Hypothenuse
 X3, Y3, X4, Y4: Integer; // Tangente 1 und 2 ('P3' und 'P4')
 A1, A2, A3: Double;
begin
 // Streckenlängen berechnen
 A := R;
 C := Sqrt(Sqr(X2 - X1) + Sqr(Y2 - Y1)); // = Distanz P1 zu P2
 B := Sqrt(Sqr(C) - Sqr(A));             // Pythagoras

 // Schnittpunkt Tangente 1 berechnen
 A1 := GetAngle(X1 - X2, Y1 - Y2); // Winkel (P1-P2) zu 0°
 A2 := ArcSin(B / C);              // Winkel (P1-P3) zu 0°
 A3 := A1 - A2;                    // Winkel (P1-P2) zu (P1-P3)
 X3 := Round(Sin(A3) * A) + X2;    // Aus Winkel Koordinaten berechnen
 Y3 := Round(Cos(A3) * A) + Y2;

 // Schnittpunkt Tangente 2 berechnen
 A1 := GetAngle(X1 - X2, Y1 - Y2);
 A2 := ArcSin(B / C);
 A3 := A1 - -A2;
 X4 := Round(Sin(A3) * A) + X2;
 Y4 := Round(Cos(A3) * A) + Y2;

 Box.Canvas.Brush.Style := bsSolid;
 Box.Canvas.Brush.Color := clWhite;

 // Hintergrund löschen
 Box.Canvas.FillRect(Box.Canvas.ClipRect);

 Box.Canvas.Brush.Style := bsClear;
 Box.Canvas.Pen.Color := clBlack;

 // Kreis zeichnen
 Box.Canvas.Ellipse(X2 - R, Y2 - R, X2 + R + 1, Y2 + R + 1);

 // Koordinaten als Kreise zeichnen
 Box.Canvas.Ellipse(X1 - 2, Y1 - 2, X1 + 3, Y1 + 3);
 Box.Canvas.Ellipse(X2 - 2, Y2 - 2, X2 + 3, Y2 + 3);
 Box.Canvas.Ellipse(X3 - 2, Y3 - 2, X3 + 3, Y3 + 3);
 Box.Canvas.Ellipse(X4 - 2, Y4 - 2, X4 + 3, Y4 + 3);

 // Linien verbinden
 Box.Canvas.MoveTo(X1, Y1);
 Box.Canvas.LineTo(X2, Y2);

 Box.Canvas.MoveTo(X2, Y2);
 Box.Canvas.LineTo(X3, Y3);
 Box.Canvas.LineTo(X1, Y1);

 Box.Canvas.MoveTo(X2, Y2);
 Box.Canvas.LineTo(X4, Y4);
 Box.Canvas.LineTo(X1, Y1);
end;

Box.OnPaint die obige Methode zuweisen.

Ich bin kein Mathegenie, habe das mehr oder weniger durch probieren rausgefunden, daher kann ich den Code auch nicht so doll erklären, mit Fachbegriffen und so. Zeichne das ganze auf Papier, lies die Kommentare, dann verstehst du es villeicht.

Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt.


Andreas Pfau - So 22.06.03 18:19

Hallo,

sorry, du musst den Code ändern. Wenn der Punkt im Kreis liegt, gibts Fehlermeldungen. Ändere ihn so:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
procedure TForm1.BoxPaint(Sender: TObject);
const
 X1 = 10;  // Urspurng der Tangenten ('P1')
 Y1 = 10;  // "
 X2 = 200; // Mitelpunkt des Kreises ('P2')
 Y2 = 200; // "
 R  = 100; // Raduis
var
 A, B, C: Double;         // Strecken des Dreiecks, C = Hypothenuse
 X3, Y3, X4, Y4: Integer; // Tangente 1 und 2 ('P3' und 'P4')
 A1, A2, A3: Double;
 Valid: Boolean;
begin
 // Streckenlängen berechnen
 A := R;
 C := Sqrt(Sqr(X2 - X1) + Sqr(Y2 - Y1)); // = Distanz P1 zu P2
 // Prüfen, ob Tangenten gebildet werden können
 Valid := (C > A) And (R > 0);
 If (Valid) Then begin
  B := Sqrt(Sqr(C) - Sqr(A));             // Pythagoras

  // Schnittpunkt Tangente 1 berechnen
  A1 := GetAngle(X1 - X2, Y1 - Y2); // Winkel (P1-P2) zu 0°
  A2 := ArcSin(B / C);              // Winkel (P1-P3) zu 0°
  A3 := A1 - A2;                    // Winkel (P1-P2) zu (P1-P3)
  X3 := Round(Sin(A3) * A) + X2;    // Aus Winkel Koordinaten berechnen
  Y3 := Round(Cos(A3) * A) + Y2;

  // Schnittpunkt Tangente 2 berechnen
  A1 := GetAngle(X1 - X2, Y1 - Y2);
  A2 := ArcSin(B / C);
  A3 := A1 - -A2;
  X4 := Round(Sin(A3) * A) + X2;
  Y4 := Round(Cos(A3) * A) + Y2;
 end;

 Box.Canvas.Brush.Style := bsSolid;
 Box.Canvas.Brush.Color := clWhite;

 // Hintergrund löschen
 Box.Canvas.FillRect(Box.Canvas.ClipRect);

 Box.Canvas.Brush.Style := bsClear;
 Box.Canvas.Pen.Color := clBlack;

 // Kreis zeichnen
 Box.Canvas.Ellipse(X2 - R, Y2 - R, X2 + R + 1, Y2 + R + 1);

 // Koordinaten als Kreise zeichnen
 Box.Canvas.Ellipse(X1 - 2, Y1 - 2, X1 + 3, Y1 + 3);
 Box.Canvas.Ellipse(X2 - 2, Y2 - 2, X2 + 3, Y2 + 3);
 If (Valid) Then begin
  Box.Canvas.Ellipse(X3 - 2, Y3 - 2, X3 + 3, Y3 + 3);
  Box.Canvas.Ellipse(X4 - 2, Y4 - 2, X4 + 3, Y4 + 3);
 end;

 // Linien verbinden
 Box.Canvas.MoveTo(X1, Y1);
 Box.Canvas.LineTo(X2, Y2);

 If (Valid) Then begin
  Box.Canvas.MoveTo(X2, Y2);
  Box.Canvas.LineTo(X3, Y3);
  Box.Canvas.LineTo(X1, Y1);

  Box.Canvas.MoveTo(X2, Y2);
  Box.Canvas.LineTo(X4, Y4);
  Box.Canvas.LineTo(X1, Y1);
 end;
end;