AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Abfragen ob sich Maus in Kreis befindet
Thema durchsuchen
Ansicht
Themen-Optionen

Abfragen ob sich Maus in Kreis befindet

Ein Thema von Onkelrossie · begonnen am 20. Dez 2008 · letzter Beitrag vom 5. Jan 2009
 
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, 15: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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:04 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz