diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/client/views/InkStrokeProperties.ts | 29 |
1 files changed, 12 insertions, 17 deletions
diff --git a/src/client/views/InkStrokeProperties.ts b/src/client/views/InkStrokeProperties.ts index 2048b9a19..a0fdfcd7f 100644 --- a/src/client/views/InkStrokeProperties.ts +++ b/src/client/views/InkStrokeProperties.ts @@ -156,29 +156,24 @@ export class InkStrokeProperties { }, true) /** - * Rotates the entire selected ink instance. + * Rotates ink stroke(s) about a point + * @param inkStrokes set of ink documentViews to rotate * @param angle The angle at which to rotate the ink in radians. + * @param scrpt The center point of the rotation in screen coordinates */ @undoBatch @action rotateInk = (inkStrokes: DocumentView[], angle: number, scrpt: { x: number, y: number }) => { this.applyFunction(inkStrokes, (view: DocumentView, ink: InkData, xScale: number, yScale: number, inkStrokeWidth: number) => { - const oldXrangeMin = Math.min(...ink.map(p => p.X)); - const oldYrangeMin = Math.min(...ink.map(p => p.Y)); - const docViewCenterPt = view.screenToLocalTransform().transformPoint(scrpt.x, scrpt.y); - const inkCenterPt = { - X: (docViewCenterPt[0] - inkStrokeWidth / 2) / xScale + oldXrangeMin, - Y: (docViewCenterPt[1] - inkStrokeWidth / 2) / yScale + oldYrangeMin - }; - const newPoints = ink.map(i => { - const pt = { X: i.X - inkCenterPt.X, Y: i.Y - inkCenterPt.Y }; - const newX = Math.cos(angle) * pt.X - Math.sin(angle) * pt.Y * yScale / xScale; - const newY = Math.sin(angle) * pt.X * xScale / yScale + Math.cos(angle) * pt.Y; - return { X: newX + inkCenterPt.X, Y: newY + inkCenterPt.Y }; - }); - const doc = view.rootDoc; - doc.rotation = NumCast(doc.rotation) + angle; - return newPoints; + view.rootDoc.rotation = NumCast(view.rootDoc.rotation) + angle; + const inkCenterPt = view.ComponentView?.ptFromScreen?.({ X: scrpt.x, Y: scrpt.y }); + return !inkCenterPt ? ink : + ink.map(i => { + const pt = { X: i.X - inkCenterPt.X, Y: i.Y - inkCenterPt.Y }; + const newX = Math.cos(angle) * pt.X - Math.sin(angle) * pt.Y * yScale / xScale; + const newY = Math.sin(angle) * pt.X * xScale / yScale + Math.cos(angle) * pt.Y; + return { X: newX + inkCenterPt.X, Y: newY + inkCenterPt.Y }; + }); }); } |