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):
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:
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...
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) ) 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) ) 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) ) 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) ) then begin Result := false; end;
end; |
Ich hoffe ihr versteht den Quelltext, bei Fragen postet einfach...
Gruß
Carni