CGPath um Mittelpunkt drehen *Knoten im Hirn bezüglich Translate -> Rotate -> Translate*

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • CGPath um Mittelpunkt drehen *Knoten im Hirn bezüglich Translate -> Rotate -> Translate*

    Hi,

    angeregt durch PaintCode spiele ich gerade ein wenig mit Pfaden am iPhone herum.
    Hab beim drehen über Transforms dann schnell gemerkt, dass sich die Pfade dabei nicht um den Mittelpunkt, sondern ihren Ursprung drehen.
    Besteht der Pfad also z.B. aus einem Quadrat, welches vom Punkt 0.0 bis 50.50 geht, "bewegt" sich das Quadrat beim drehen.

    Die Lösung schien schnell klar zu sein: statt einem Transform brauche ich drei:
    - Pfad verschieben, dass der Mittelpunkt des Pfades auf dem Ursprung (0,0) liegt
    - Pfad drehen
    - Pfad wieder zurückschieben

    so sieht das im Code aus:

    Quellcode

    1. CGRect pathBounds = CGPathGetPathBoundingBox(myPath);
    2. transform = CGAffineTransformMakeTranslation(-CGRectGetMidX(pathBounds), -CGRectGetMidY(pathBounds));
    3. transform = CGAffineTransformRotate(transform, 90 / 180.0 * M_PI);
    4. transform = CGAffineTransformTranslate(transform, CGRectGetMidX(pathBounds), CGRectGetMidY(pathBounds));
    5. CGPathRef newPath = CGPathCreateCopyByTransformingPath(self.backspaceBezierPath.CGPath, &transform);
    6. // <-- Hier wird dann dem CAShapeLayer der neue Pfad zugewiesen
    7. CGPathRelease(newPath);


    Dummerweise wird es dadurch noch schlimmer, das Quadrat ist noch weiter ab vom Schuß.
    Hab dann rausgefunden, dass es funktioniert wenn ich die Minus-Zeichen von Zeile 3 nach Zeile 5 verschiebe:

    Quellcode

    1. CGRect pathBounds = CGPathGetPathBoundingBox(myPath);
    2. transform = CGAffineTransformMakeTranslation(CGRectGetMidX(pathBounds), CGRectGetMidY(pathBounds));
    3. transform = CGAffineTransformRotate(transform, 90 / 180.0 * M_PI);
    4. transform = CGAffineTransformTranslate(transform, -CGRectGetMidX(pathBounds), -CGRectGetMidY(pathBounds));
    5. CGPathRef newPath = CGPathCreateCopyByTransformingPath(self.backspaceBezierPath.CGPath, &transform);
    6. // <-- Hier wird dann dem CAShapeLayer der neue Pfad zugewiesen
    7. CGPathRelease(newPath);


    Kann mir jemand erklären warum?

    Wenn die Koordinaten der Punkte des Pfads alle positiv sind, müsste ich meinem Verständnis nach den Pfad erst in Richtung negativer Werte verschieben,
    und nach dem Drehen dann wieder in die positive Richtung.

    Warum ist das gerade andersrum?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Tobse001 ()

  • Verstehe ich das richtig, ich verschiebe also mein Koordinatensystem/den Ursprung und nicht den Pfad selbst?
    Wenn ja, ist klar warum mir das invertiert vorkommt. :P

    Da fällt mir auf, die letzten Zeilen des Codes hat irgendwie Copy & Paste nicht überlebt.
    Hab es oben eingefügt.


    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Tobse001 ()

  • Kurze Anmerkung. wenn ich Dich überhaupt richtig verstanden habe.
    Du kannst aber auch in PaintCode den Ursprung versetzen.

    Meist ist es dafür notwendig hilflinien/Kreise zu ziehen, die es dir erlauben, den Schnittpunkt korrekt auszuwählen (snap to point/intersection)
    Also ganz einfaches Beispiel, Bei einem Quadrat benötigst Du entweder ein ensprechendes Raster oder 2 Hilfslinien, von oben link nach unten rechts und von oben rechts nach unten links. der Schnittpunkt
    ist dann die Mitte und darauf snapt dann auch der Ursprung.
  • Hi entwickler,

    das ist schon klar. :)
    Aber irgendwie kommt es mir normaler vor, vom Origin zu zeichnen als um ihn herum.

    Die Frage ist ja auch nicht spezifisch auf dieses Problem gemünzt (welches sich durch invertieren des Vorzeichens ja lösen lies) sondern ich würde das allgemein gern verstehen.
    Irgendwie stehe ich auf dem Schlauch.

    Wenn ich mir ein Element vorstelle:
    - Dessen Koordinatensystem oben links beginnt und nach rechts und unten wächst
    - Dessen Ursprung beim Ursprung des Koordinatensystem beginnt und ebenfalls nach rechts und unten wächst
    - Also ein Objekt das komplett im positiven Bereich (sowohl X- als auch Y-Achse betreffend) des Koordiantensystem liegt.

    Dann muss ich das Objekt meiner Meinung nach um einen negativen Wert verschieben um es mittig auf dem Ursprung zu platzieren.
    Würde ich es um einen positiven Wert verschieben, müsste es sich weiter vom Ursprung entfernen.

    Um das Element nun um seinen Mittelpunkt zu drehen, muss ich es ja erst ein wenig nach oben links verschieben um es mittig auf dem Ursprung zu platzieren.
    Dann Drehen und wieder zurückschieben.

    Meine Frage ist daher, ob sich bei Pfaden und einem Translate irgendwas anders verhält als bei z.B. UIViews.
    Wende ich einen CGAffineTransform auf eine UIView an, dann wandert die bei positiven Werten nach rechts und nach unten.

    Wenn ich mir meinen Code von oben anschaue, scheint sich der Pfad aber invertiert zu verhalten.
    Er wandert bei positiven Werten eines Translates nach links oben.

    Verschiebe ich bei einem Pfad also nicht die einzelnen Punkte des Pfades,
    sondern den Ursprung des Koordinatensystems?