| Autor |
Beitrag |
nikon
Hält's aus hier
Beiträge: 1
|
Verfasst: Do 19.06.03 11:18
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-
|
|
Andreas Pfau
      
Beiträge: 997
|
Verfasst: 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.
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.0) Then begin If (X = 0.0) Then Result := 0.0; If (X > 0.0) Then Result := Pi / 2; If (X < 0.0) Then Result := Pi * 1.5; end Else Result := ArcTan(X / Y);
If (Y < 0.0) Then Result := Result + Pi; If (X < 0.0) And (Y > 0.0) Then Result := Result + Pi * 2; end;
procedure TForm1.BoxPaint(Sender: TObject); const X1 = 10; Y1 = 10; X2 = 200; Y2 = 200; R = 100; var A, B, C: Double; X3, Y3, X4, Y4: Integer; A1, A2, A3: Double; begin A := R; C := Sqrt(Sqr(X2 - X1) + Sqr(Y2 - Y1)); B := Sqrt(Sqr(C) - Sqr(A)); A1 := GetAngle(X1 - X2, Y1 - Y2); A2 := ArcSin(B / C); A3 := A1 - A2; X3 := Round(Sin(A3) * A) + X2; Y3 := Round(Cos(A3) * A) + Y2;
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;
Box.Canvas.FillRect(Box.Canvas.ClipRect);
Box.Canvas.Brush.Style := bsClear; Box.Canvas.Pen.Color := clBlack;
Box.Canvas.Ellipse(X2 - R, Y2 - R, X2 + R + 1, Y2 + R + 1);
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);
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 Tino: Code- durch Delphi-Tags ersetzt.
_________________ Life is a bad adventure, but the graphic is really good!
|
|
Andreas Pfau
      
Beiträge: 997
|
Verfasst: So 22.06.03 18:19
Hallo,
sorry, du musst den Code ändern. Wenn der Punkt im Kreis liegt, gibts Fehlermeldungen. Ändere ihn so:
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!
|
|
|