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; |