/ / UIBezierPath-Pfadkreuzung - ios, swift, intersection, uibezierpath

Kreuzung des UIBezierPath-Pfads - IOS, Swift, Kreuzung, Uibezierpfad

Ich versuche festzustellen, ob a UIBezierPath dass ich zeichne schneidet mit einem anderen.

if path.containsPoint(touchPoint){
println("captured (touchPoint) ")
}

Jedoch, containsPoint(CGPoint:) funktioniert bei mir nicht, weil es true zurückgibt, wenn

the point is considered to be within the path’s enclosed area or false if it is not.

Nur um ein grafisches Beispiel zu liefern, wird dies zurückgegeben true (Ich zeichne den gestrichelten Pfad):

Die Frage ist also: Wie kann ich überprüfen, ob meine touchPoint gehört zu einem UIBezierPathin dem Sinne, dass es einen bestimmten Punkt dieses Pfades trifft?

Danke im Voraus

Antworten:

1 für die Antwort № 1

Ob es sich nur um einen Berührungspunkt handelt, den Sie bestimmen möchten, können Sie verwenden CGPathCreateCopyByStrokingPath Um eine geschlossene Pfadversion Ihres ursprünglichen offenen Pfads zu erstellen, versuchen Sie, test zu treffen. Dann können Sie mit diesem neu erstellten geschlossenen Pfad den containsPoint Methode, um die Prüfung durchzuführen.

Die Technik wird in diesem Blog-Beitrag ausführlich beschrieben. http://oleb.net/blog/2012/02/cgpath-hit-testing/

Möglicherweise müssen Sie diese Breite des kopierten Strichs erweitern, um fette Finger zu berücksichtigen. Im Blogbeitrag macht er zum Beispiel den Treffertestpfad mit mindestens 35 Punkten.


0 für die Antwort № 2

Ich bin ein bisschen spät dran, aber ich musste kürzlich etwas Ähnliches lösen und das könnte anderen helfen, die hier reinstolpern:

Liegt der Punkt in der Nähe der Linie?

Ich habe erst vor kurzem Open Sourcing ClippingBezier das kann helfen. Es enthält eine Kategoriemethode auf UIBezierPath So bestimmen Sie, wie nahe ein Eingabepunkt am Pfad liegt:

CGPoint pointOnPath = [path closestPointOnPathTo:touchPoint];
if(distance(pointOnPath, touchPoint) < 30){
// point is close to path
}

Dies gibt Ihnen eine Lösung, die Ray ähnlich istAntworten. Ich kenne die Leistung von CGPathCreateCopyByStrokingPath nicht, aber wenn Sie diese Geste in Echtzeit ausführen müssen, möchten Sie sie möglicherweise auch mit ClippingBezier vergleichen - sie wurde für diese Art von Echtzeit-Anwendungsfällen entwickelt.

Befindet sich der Punkt innerhalb des minimalen Begrenzungsrahmens?

Wenn Sie stattdessen feststellen möchten, ob sich der Punkt innerhalb des minimalen Begrenzungsrahmens des Bezier-Pfads befindet und nicht nur in der Nähe des Pfads, ist dies etwas schwieriger.

Das UIBezierPath"s bounds Eigenschaft ist nicht unbedingt der minimale Begrenzungsrahmen, es ist nur ein Begrenzungsrahmen. Um das Minimum zu finden, müsstest du:

  1. Drehen Sie den Pfad schrittweise um seine Mitte und überprüfen Sie die kleinsten Grenzen für jeden Grad der Drehung um 90 Grad
  2. Wenn Sie die kleinste Drehung gefunden haben, wenden Sie dieselbe Transformation auf den touchPoint an
  3. Überprüfen Sie dann den transformierten touchPoint an den Grenzen des transformierten Pfads

Das bringt dir nichts genau Minimum Bounding Box, aber es wird in der Praxis nahe genug sein. Um das genaue Minimum Bounding Box zu erhalten, würde es viel mehr Mathematik wie in dieser SO Antwort beschrieben.