Einzelnen Beitrag anzeigen

Onkelrossie

Registriert seit: 7. Aug 2006
43 Beiträge
 
Delphi 7 Architect
 
#8

Re: Abfragen ob sich Maus in Kreis befindet

  Alt 20. Dez 2008, 16:02
So, ich habe das nun wie folgt umgesetzt:

Delphi-Quellcode:
unit Unit4;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TForm4 = class(TForm)
    shp1: TShape;
    shp2: TShape;
    procedure shp2MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    procedure shp1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    procedure FormCreate(Sender: TObject);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  private
    { Private declarations }
    procedure Simulate (X, Y: Integer);
  public
    { Public declarations }
  end;

var
  Form4: TForm4;

implementation

{$R *.dfm}

procedure TForm4.FormCreate(Sender: TObject);
begin
  Doublebuffered := True;
end;

procedure TForm4.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  Simulate(X, Y);
end;

procedure TForm4.shp1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  Simulate(shp1.Left + X, shp1.Top + Y);
end;

procedure TForm4.shp2MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  Simulate(shp2.Left + X, shp2.Top + Y);
end;

function PointInRgn(R: TRect): Boolean;
var rHandle: THandle;
    p: TPoint;
begin
  Result := True;
  rHandle := CreateEllipticRgnIndirect(R);
  if rHandle <> 0 then
    begin
      p := Form4.ScreenToClient(Mouse.CursorPos);
      Result := PtInRegion(rHandle,p.X,p.Y);
      DeleteObject(rHandle);
    end;
end;

procedure TForm4.Simulate (X, Y: Integer);
var
  rKreis1, rKreis2: Integer;
  Kreis1posX, Kreis1posY: Integer;
  Kreis2posX, Kreis2posY: Integer;
  R: TRect;
begin
  Refresh;

  rKreis1 := shp1.Width div 2;
  rKreis2 := shp2.Width div 2;

  Kreis1posX := shp1.Left + rKreis1;
  Kreis1posY := shp1.Top + rKreis1;
  Kreis2posX := shp2.Left + rKreis2;
  Kreis2posY := shp2.Top + rKreis2;

  R.TopLeft := Point(shp2.Left - rKreis1, shp2.Top - rKreis1);
  R.BottomRight := Point(shp2.Left + shp2.Width + rKreis1 +2, shp2.Top + shp2.Height + rKreis1 +2);
  Canvas.MoveTo(Kreis1posX, Kreis1posY);

  Canvas.Ellipse(X + rKreis1, Y + rKreis1, X - rKreis1, Y - rKreis1);
  Canvas.LineTo(X, Y);

  if PointInRgn(R) then
  begin
    Canvas.LineTo(5 * rKreis2 * (X - Kreis2posX)
      , 5 * rKreis2 * (Y - Kreis2posY));
    Canvas.MoveTo(Kreis2posX, Kreis2posY);
    Canvas.LineTo(-(5 * rKreis2 * (X - Kreis2posX))
      , -(5 * rKreis2 * (Y - Kreis2posY)));
  end;

end;
end.
Der Reflextionspunkt des großen Kreises wird auch richtig angezeigt aber der des kleinen leider nicht. Hat jemand eine Lösung um den Ausfallswinkel der kleinen Kugel zu berechnen und anzeigen zu lassen? Weiterhin hätte ich noch das Problem das ich mit der Maus außen den großen Kreis streifen muss damit die exakte Richtung angezeigt wird. Sobald ich mit der Maus in den großen Kreis gehe wird mir alles falsch berechnet. Ich habe mir überlegt das ich die Linie die vom kleines Kreis aus geht als Kollisionsabfrage benutze d.h. sobald die Linie auf den großen Kreis trifft wird mir die neue Richtung beider Kreise angezeigt. Leider bin ich noch nicht so gut was das Programmieren in Delphi anbelangt und die Suche konnte mir auch nicht weiterhelfen. Ich habe zwar ein paar Interessante Lösungsansätze gefunden nur basieren die alle auf Billardspiele bzw. Kugeln. Die mathematische Seite um das zu berechnen ist mir soweit klar aber ich habe keine Ahnung wie ich das in Delphi umsetzen soll.

Bitte um Hilfe!

Vielen Dank schonmal im Voraus.


Gruß
Onkelrossie
Angehängte Dateien
Dateityp: zip projekt2_143.zip (211,5 KB, 10x aufgerufen)
  Mit Zitat antworten Zitat