Autor Beitrag
nikon
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Do 19.06.03 11:18 
: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 997



BeitragVerfasst: 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.
ausblenden volle Höhe 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.

_________________
Life is a bad adventure, but the graphic is really good!
Andreas Pfau
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 997



BeitragVerfasst: So 22.06.03 18:19 
Hallo,

sorry, du musst den Code ändern. Wenn der Punkt im Kreis liegt, gibts Fehlermeldungen. Ändere ihn so:
ausblenden volle Höhe 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;

_________________
Life is a bad adventure, but the graphic is really good!