Ist Punkt in rotierten Rechteck

Für allgemeine Fragen zur Programmierung mit PureBasic.
Lambda
Beiträge: 526
Registriert: 16.06.2011 14:38

Ist Punkt in rotierten Rechteck

Beitrag 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,
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Ist Punkt in rotierten Rechteck

Beitrag 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
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Lambda
Beiträge: 526
Registriert: 16.06.2011 14:38

Re: Ist Punkt in rotierten Rechteck

Beitrag 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.
Antworten