TSchnittKK

Eine Routine oder Klasse für die Berechnung der Schnittpunkte zweier Kreise (elektronischer Zirkel) ist in den Bibliotheken der Programmiersprachen Delphi, C# und Java standardmäßig nicht enthalten.

Die erste Version des elektronischen Zirkels wurde bereits 1995 mit Delphi 1 programmiert. Dieser ist in der Klasse TSchnittKK implementiert und wird in den Projekten RG und SK verwendet.

Im Bild bewegen sich die großen Kreise diagonal und werden am Rand reflektiert, während die kleinen Kreise (die Schnittpunkte) eine Spur mit einer gewissen Länge hinter sich herziehen.

SK applet als Silverlight Application
SKIA screenshot

Es gab /gibt unzählige Varianten des Applets auf verschiedenen Plattformen.

Neben der Analyse der Schnittsituation und der Wahl des Lösungsweges (Verzweigung im Algorithmus) ist die Kennzeichnung der Schnittpunkte erforderlich: Wenn man vom Mittelpunkt M1 nach Mittelpunkt M2 blickt, dann liegt Schnittpunkt S1 links, Schnittpunkt S2 rechts, oder umgekehrt.

Die Bedeutung des elektronischen Zirkels liegt nicht zuletzt darin, dass grafische Lösungsverfahren/Denkweisen benutzt und damit einfache Lösungen gefunden werden können.

type
  TBemerkungKK = (
    bmKonzentrisch, 
    bmZwei, 
    bmEinerAussen, 
    bmEntfernt,
    bmEinerK1inK2, 
    bmEinerK2inK1, 
    bmK1inK2, 
    bmK2inK1, 
    bmRadiusFalsch
  );

  TSchnittEbene = (seXY, seYZ, seXZ);

  TSchnittKK = class(TObject)
  private
    { Private-Deklarationen }
    R1: double;
    R2: double;
    FM1: TRealPoint;
    FM2: TRealPoint;
    S1: TRealPoint;
    S2: TRealPoint;
    Ebene: TSchnittEbene;
    Bem: TBemerkungKK;
    NeedCalc: Boolean;
    sv: Boolean;
    procedure SetRadius1(Value: double);
    procedure SetRadius2(Value: double);
    procedure SetMittelPunkt1(Value: TRealPoint);
    procedure SetMittelPunkt2(Value: TRealPoint);
    procedure Schnitt;
    function GetSchnittPunkt1: TRealPoint;
    function GetSchnittPunkt2: TRealPoint;
    function GetBem: TBemerkungKK;
    function GetBemerkung: string;
    function Vorhanden: Boolean;
  protected
    { Protected-Deklarationen }
  public
    { Public-Deklarationen }
    property Radius1: double read R1 write SetRadius1;
    property Radius2: double read R1 write SetRadius2;
    property MittelPunkt1: TRealPoint read FM1 write SetMittelPunkt1;
    property MittelPunkt2: TRealPoint read FM2 write SetMittelPunkt2;
    property SchnittPunkt1: TRealPoint read GetSchnittPunkt1;
    property SchnittPunkt2: TRealPoint read GetSchnittPunkt2;
    property Status: TBemerkungKK read GetBem;
    property Bemerkung: string read GetBemerkung;
    property SPvorhanden: Boolean read Vorhanden;
    property SchnittEbene: TSchnittEbene read Ebene write Ebene;
  end;

sk msg example