Seite 1 von 1

Ist Punkt in rotierten Rechteck

Verfasst: 29.12.2012 15:35
von Lambda
Hallo PBler,

die Lösung dafür ist relativ simpel. Der Punkt (Cursor) wird zurückgedreht, darauf folgt eine simple bounding Box Prüfung. Leider ist die Funktion zur Rotation scheinbar recht CPU lastig wenn sie permanent aufgerufen wird.

Vielleicht finden sich ja ASM Gurus die es beschleunigen können. :) Wichtig ist aber auch den Rotations-Punkt festlegen zu können.

Code: Alles auswählen

Structure POINTF
  x.f
  y.f
EndStructure

Procedure Rotate(*PointF.POINTF, angle.f, *Center.POINTF=#Null)
  Protected x.f, y.f
  Protected Sin.f = Sin(Radian(angle)), Cos.f = Cos(Radian(angle))
  If *Center
    x = *PointF\x - *Center\x
    y = *PointF\y - *Center\y
  EndIf
  *PointF\x = Cos*x - Sin*y
  *PointF\y = Sin*x + Cos*y
  If *Center
    *PointF\x + *Center\x
    *PointF\y + *Center\y
  EndIf
  ProcedureReturn *PointF
EndProcedure

Define Mouse.POINTF  : Mouse\x = 10  : Mouse\y = 10
Define Center.POINTF : Center\x = 0 : Center\y = 0

Rotate(@Mouse, 45, @Center)

Debug Mouse\x
Debug Mouse\y
lG,

Re: Ist Punkt in rotierten Rechteck

Verfasst: 29.12.2012 19:29
von STARGÅTE
cOoki3druqs hat geschrieben:Leider ist die Funktion zur Rotation scheinbar recht CPU lastig wenn sie permanent aufgerufen wird.
Na zum glück! Wenn diese Funktion im dauerbetrieb nicht die ganze CPU nutzen würde, wäre es schlecht, weil der Prozessor dann irgendwo "langeweile" hat.
"Alle" Berechungen sollten ohne zugeschaltete Pause die CPU zu 100% nutzen.

Was du meinst ist sicher, dass die Funktion recht langsam arbeitet.
Du kannst es beschleunigen, indem du ein Array mit Sin und Cos von 0° bis 360° vorrechnest und dann einfach den Winkel einsetzt.
Je nach genauigkeit dann halt in 1° oder 0,1° schritten.

Edit: Im übrigen hast du einen Fehler drin: Wenn kein Center getzt ist, sind x.f, y.f beide 0, dort müsstest du noch den Point einsetzen

Re: Ist Punkt in rotierten Rechteck

Verfasst: 30.12.2012 07:55
von Lambda
Ja sie arbeitet langsam, und mit permanent meine ich "nicht nur beim Klick". Hatte eine von Java übersetzte Lösung die wesentlich fixer war, allerdings etwas anderst gelöst und ohne Rotationspunkt.