From 58307a96dceed4e9d4600c73b0ce0bf521a8ea3c Mon Sep 17 00:00:00 2001 From: Ryan Di Date: Wed, 9 Oct 2024 18:16:09 +0800 Subject: [PATCH] normalize before projection to improve rotated crop region drag --- packages/excalidraw/components/App.tsx | 36 ++++++++------------------ 1 file changed, 11 insertions(+), 25 deletions(-) diff --git a/packages/excalidraw/components/App.tsx b/packages/excalidraw/components/App.tsx index 54b90778b4..319445dac0 100644 --- a/packages/excalidraw/components/App.tsx +++ b/packages/excalidraw/components/App.tsx @@ -456,7 +456,7 @@ import { vectorFromPoint, vectorSubtract, vectorDot, - vectorMagnitude, + vectorNormalize, } from "../../math"; import { cropElement } from "../element/cropElement"; @@ -7969,34 +7969,20 @@ class App extends React.Component { croppingElement.angle, ), ); - const topEdge = vectorSubtract(topRight, topLeft); - const leftEdge = vectorSubtract(bottomLeft, topLeft); + const topEdge = vectorNormalize( + vectorSubtract(topRight, topLeft), + ); + const leftEdge = vectorNormalize( + vectorSubtract(bottomLeft, topLeft), + ); /** - * project instantDrafOffset onto leftEdge to find out the y scalar - * topEdge to find out the x scalar + * project instantDrafOffset onto leftEdge and topEdge to decompose */ - const scaleY = - vectorDot(instantDragOffset, leftEdge) / - vectorDot(leftEdge, leftEdge); - const scaleX = - vectorDot(instantDragOffset, topEdge) / - vectorDot(topEdge, topEdge); - - instantDragOffset = vectorScale( - vector(scaleX, scaleY), - /** - * projection results in small x and y scalars - * scale to account for this - */ - Math.min( - Math.max( - vectorMagnitude(topEdge), - vectorMagnitude(leftEdge), - ), - 100, - ), + instantDragOffset = vector( + vectorDot(instantDragOffset, topEdge), + vectorDot(instantDragOffset, leftEdge), ); }