apply projection to angle 0 drag move as well

pull/8613/head
Ryan Di 5 months ago
parent da0481683a
commit 741c8dec31

@ -7938,8 +7938,7 @@ class App extends React.Component<AppProps, AppState> {
this.imageCache.get(croppingElement.fileId)?.image; this.imageCache.get(croppingElement.fileId)?.image;
if (image && !(image instanceof Promise)) { if (image && !(image instanceof Promise)) {
// scale the offset by at least a factor of 2 to improve ux const instantDragOffset = vectorScale(
let instantDragOffset = vectorScale(
vector( vector(
pointerCoords.x - lastPointerCoords.x, pointerCoords.x - lastPointerCoords.x,
pointerCoords.y - lastPointerCoords.y, pointerCoords.y - lastPointerCoords.y,
@ -7947,63 +7946,56 @@ class App extends React.Component<AppProps, AppState> {
Math.max(this.state.zoom.value, 2), Math.max(this.state.zoom.value, 2),
); );
if (croppingElement.angle !== 0) { const [x1, y1, x2, y2, cx, cy] = getElementAbsoluteCoords(
const [x1, y1, x2, y2, cx, cy] = getElementAbsoluteCoords( croppingElement,
croppingElement, elementsMap,
elementsMap, );
);
const topLeft = vectorFromPoint(
pointRotateRads(
pointFrom(x1, y1),
pointFrom(cx, cy),
croppingElement.angle,
),
);
const topRight = vectorFromPoint(
pointRotateRads(
pointFrom(x2, y1),
pointFrom(cx, cy),
croppingElement.angle,
),
);
const bottomLeft = vectorFromPoint(
pointRotateRads(
pointFrom(x1, y2),
pointFrom(cx, cy),
croppingElement.angle,
),
);
const topEdge = vectorNormalize(
vectorSubtract(topRight, topLeft),
);
const leftEdge = vectorNormalize(
vectorSubtract(bottomLeft, topLeft),
);
/** const topLeft = vectorFromPoint(
* project instantDrafOffset onto leftEdge and topEdge to decompose pointRotateRads(
*/ pointFrom(x1, y1),
pointFrom(cx, cy),
croppingElement.angle,
),
);
const topRight = vectorFromPoint(
pointRotateRads(
pointFrom(x2, y1),
pointFrom(cx, cy),
croppingElement.angle,
),
);
const bottomLeft = vectorFromPoint(
pointRotateRads(
pointFrom(x1, y2),
pointFrom(cx, cy),
croppingElement.angle,
),
);
const topEdge = vectorNormalize(
vectorSubtract(topRight, topLeft),
);
const leftEdge = vectorNormalize(
vectorSubtract(bottomLeft, topLeft),
);
instantDragOffset = vector( // project instantDrafOffset onto leftEdge and topEdge to decompose
vectorDot(instantDragOffset, topEdge), const offsetVector = vector(
vectorDot(instantDragOffset, leftEdge), vectorDot(instantDragOffset, topEdge),
); vectorDot(instantDragOffset, leftEdge),
} );
const nextCrop = { const nextCrop = {
...crop, ...crop,
x: clamp( x: clamp(
crop.x - crop.x -
instantDragOffset[0] * offsetVector[0] * Math.sign(croppingElement.scale[0]),
Math.sign(croppingElement.scale[0]),
0, 0,
image.naturalWidth - crop.width, image.naturalWidth - crop.width,
), ),
y: clamp( y: clamp(
crop.y - crop.y -
instantDragOffset[1] * offsetVector[1] * Math.sign(croppingElement.scale[1]),
Math.sign(croppingElement.scale[1]),
0, 0,
image.naturalHeight - crop.height, image.naturalHeight - crop.height,
), ),

Loading…
Cancel
Save