- From: Michael Day <mikeday@yeslogic.com>
- Date: Wed, 12 Sep 2012 17:07:12 +1000
- To: Ian Hickson <ian@hixie.ch>
- Cc: whatwg@lists.whatwg.org, Rik Cabanier <cabanier@gmail.com>
Hi Ian, > Yeah, that's why the spec hand-waves to transform the line too... but I > agree that that doesn't really work. > > Do you have any suggestion of how to spec this better? This is the most general arcTo situation: setTransform(M0) lineTo(x0, y0) setTransform(M) arcTo(x1, y1, x2, y2, radius, ...) To generate the arc we need three points: P0, P1, P2, all in the same coordinate system. The three points are: P0 = inverse(M) * M0 * (x0, y0) P1 = (x1, y1) P2 = (x2, y2) We are transforming (x0, y0) by M0, which is the transform current at the time the point was added to the path. This gives us a point in canvas coordinates that we can transform by the inverse of M, which is the transform current at the time the arc is added to the path. This gives us a point in the same coordinate space as P1 and P2. In the common case where M = M0, the transforms cancel each other out and P0 = (x0, y0). Once we have the three points in the same coordinate space we can generate the arc and then apply M to all of the points in the generated arc to draw the arc in canvas coordinates. Does this make sense? I don't think it is possible to specify this process without requiring an inverse transformation somewhere, to get all three points into the same coordinate space. If so, it is probably best to describe this explicitly, rather than ambiguously implying the need for it. Best regards, Michael
Received on Wednesday, 12 September 2012 07:07:42 UTC