Autor Beitrag
Carnivean
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 36

Win 2000, Win Xp Prof
D3 Prof, D7 Prof, D2005 Pers
BeitragVerfasst: Sa 29.10.05 20:22 
Hi,
ich möchte folgendes verwirklichen. Ich zeichne ein um x grad gedrehtes rechteck mit Hilfe dieser Funktion(so werden die 4 Endpunkte berechnet, es wird um den ersten Punkt gedreht):

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TRechteckMoebel.BerechnePunkte;
begin
  Setlength(Points,4);

  Points[0].X := PositionX;
  Points[0].Y := PositionY;

  Points[1].X := Points[0].X + Round(cos(DegToRad(Drehwinkel)) * Breite);
  Points[1].Y := Points[0].Y - Round(sin(DegToRad(Drehwinkel)) * Breite);

  Points[3].X := Points[0].X + Round(sin(DegToRad(Drehwinkel)) * Laenge);
  Points[3].Y := Points[0].Y + Round(cos(DegToRad(Drehwinkel)) * Breite);

  Points[2].X := Points[3].X + (Points[1].X - Points[0].X);
  Points[2].Y := Points[1].Y + (Points[3].Y - Points[0].Y);
end;


Das funktioniert auch problemlos, nun will überprüfen, ob ein Mausklick innerhalb des Rechteckes liegt oder nicht, dafür sortiere ich zuerst alle aus, die nich mal in einem nicht gedrehten rechteck liegen, das man um dieses Zeichnen könnte:
Hier ein Bild zur Verdeutlichung:
user defined image

Und nun guck ich ob der Klick innerhalb der ausgemalten roten bereiche lag, dies mach ich durch 4 separate Abfragen:

Ich nehm jeweils den X Wert der Mauskoordinate und berechne den Wert, den der Y Wert maximal bzw minimal haben dürfte und Vergleich dieses, nur irgendwo muss da ein fehler drin sein, da dies nur manchmal funktioniert und teilweise auch Werte nicht annimt, die inenrhalb sind.... :?

Diese Abfrage ist für alle Winkel unterhalb von 90 Grad, hab aber schon ne Idee um es auf alle Winkel zu ändern, wenn die Abfrage erstmal funktioniert...

ausblenden volle Höhe Delphi-Quelltext
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:
function TRaum.CheckFor90(Rechteck: TRechteckmoebel; cX, cY: Integer): boolean;
var Check: TPoint;
begin
  Result := true;

  Check.Y := Rechteck.Points[0].Y - (Round(cos(DegToRad(Rechteck.Drehwinkel)) * (abs(cX - Rechteck.Points[0].X))));

  if ((cY < Check.Y) {and (cX < Rechteck.Points[1].X)}) then
  begin
    Result := false;
  end
  else
    ShowMessage(inttostr(Check.Y) + ' # ' + inttostr(cY));

  Check.X := Rechteck.Points[1].X + (Round(cos(DegToRad(Rechteck.Drehwinkel)) * (abs(cY - Rechteck.points[1].Y))));

  if ((cX > Check.X) {and (cY < Rechteck.Points[2].Y)}) then
  begin
    Result := false;
  end;

  Check.Y := Rechteck.points[2].Y + (Round(cos(DegToRad(Rechteck.Drehwinkel)) * (abs(cX - Rechteck.points[2].X))));

  if ((cY >  Check.Y) {and (cX > Rechteck.Points[3].X)}) then
  begin
    Result := false;
  end
  else
    ShowMessage(inttostr(Check.Y) + ' # ' + inttostr(cY));

  Check.X := Rechteck.Points[3].X - (Round(cos(DegToRad(Rechteck.Drehwinkel)) * (abs(cY - Rechteck.points[3].Y))));

  if ((cX < Check.X) {and (cY > Rechteck.Points[0].Y)}) then
  begin
    Result := false;
  end;

end;


Ich hoffe ihr versteht den Quelltext, bei Fragen postet einfach...

Gruß
Carni

_________________
Gruß
Carnivean
Grishnak
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 221

Windows XP Home
Delphi 7 PE, Delphi 2005 PE
BeitragVerfasst: Sa 29.10.05 20:51 
Unterteil das gedrehte Rechteck in zwei Dreiecke und prüfe, ob der Klick in einem der Dreiecke stattgefunden hat (Link)

_________________
Mach' etwas idiotensicher und irgendjemand erfindet einen besseren Idioten!
Carnivean Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 36

Win 2000, Win Xp Prof
D3 Prof, D7 Prof, D2005 Pers
BeitragVerfasst: So 30.10.05 14:06 
Hi,
wär super nett wenn du mir bei der Funtkion den folgenden Schritt erklären könntest, bzw verdeutlichen, kann es mir irgendwie nicht vorstellen, was der da berechnen soll :/.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
Orin := (x2 - x1) * (py - y1) - (px - x1) * (y2 - y1);

  if Orin > 0.0 then Result := +1    (* Orientaion is to the right-hand side  *)
  else if Orin < 0.0 then Result := -1  (* Orientaion is to the left-hand side   *)
  else
    Result := 0;

Hoffe das kann mir jemand verständlich erklären....

gruß

Carni

_________________
Gruß
Carnivean
Grishnak
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 221

Windows XP Home
Delphi 7 PE, Delphi 2005 PE
BeitragVerfasst: So 30.10.05 14:27 
Mein Mathe-Abi ist schon eine Weile her, aber ich versuchs mal:

Diese Zeilen testen, ob ein Punkt links oder rechts einer Geraden liegen. Dieses Links oder Rechts ist mWn abhängig vom Richtungsvektor der Geraden.

Die Funktion, die prüft, ob ein Punkt in einem Dreieck liegt, "verlängert" die Seiten zu Geraden und prüft, ob der gesuchte Punkt bei allen drei Geraden auf der jeweils gleichen Seite (= innerhalb des Dreiecks) liegt.

Genauer kann ich das auf die Schnelle nicht erklären!

_________________
Mach' etwas idiotensicher und irgendjemand erfindet einen besseren Idioten!