feat: improve rotate scale logic

This commit is contained in:
chenshenhai 2023-02-25 09:57:35 +08:00
parent a4f4acab50
commit 2a97b5bfa9

View file

@ -219,105 +219,61 @@ function calcuScaleElemPosition(
break;
}
case 'top': {
if (elem.operation?.limitRatio === true) {
if (elem.angle === 0 || Math.abs(elem.angle) < limitQbliqueAngle) {
if (p.h - moveY > 0) {
p.y += moveY;
p.h -= moveY;
if (elem.angle === 0 || Math.abs(elem.angle) < limitQbliqueAngle) {
if (p.h - moveY > 0) {
p.y += moveY;
p.h -= moveY;
if (elem.operation?.limitRatio === true) {
p.x += ((moveY / elem.h) * elem.w) / 2;
p.w -= (moveY / elem.h) * elem.w;
}
} else if (elem.angle > 0 || elem.angle < 0) {
const angle =
elem.angle > 0 ? elem.angle : Math.max(0, elem.angle + 360);
let moveDist = calcMoveDist(moveX, moveY);
let centerX = p.x + elem.w / 2;
let centerY = p.y + elem.h / 2;
if (angle < 90) {
moveDist = 0 - changeMoveDistDirect(moveDist, moveY);
const radian = parseRadian(angle);
const centerMoveDist = moveDist / 2;
centerX = centerX + centerMoveDist * Math.sin(radian);
centerY = centerY - centerMoveDist * Math.cos(radian);
} else if (angle < 180) {
moveDist = changeMoveDistDirect(moveDist, moveX);
const radian = parseRadian(angle - 90);
const centerMoveDist = moveDist / 2;
centerX = centerX + centerMoveDist * Math.cos(radian);
centerY = centerY + centerMoveDist * Math.sin(radian);
} else if (angle < 270) {
moveDist = changeMoveDistDirect(moveDist, moveY);
const radian = parseRadian(angle - 180);
const centerMoveDist = moveDist / 2;
centerX = centerX - centerMoveDist * Math.sin(radian);
centerY = centerY + centerMoveDist * Math.cos(radian);
} else if (angle < 360) {
moveDist = 0 - changeMoveDistDirect(moveDist, moveX);
const radian = parseRadian(angle - 270);
const centerMoveDist = moveDist / 2;
centerX = centerX - centerMoveDist * Math.cos(radian);
centerY = centerY - centerMoveDist * Math.sin(radian);
}
if (p.h + moveDist > 0) {
p.h = p.h + moveDist;
}
} else if (elem.angle > 0 || elem.angle < 0) {
const angle =
elem.angle > 0 ? elem.angle : Math.max(0, elem.angle + 360);
let moveDist = calcMoveDist(moveX, moveY);
let centerX = p.x + elem.w / 2;
let centerY = p.y + elem.h / 2;
if (angle < 90) {
moveDist = 0 - changeMoveDistDirect(moveDist, moveY);
const radian = parseRadian(angle);
const centerMoveDist = moveDist / 2;
centerX = centerX + centerMoveDist * Math.sin(radian);
centerY = centerY - centerMoveDist * Math.cos(radian);
} else if (angle < 180) {
moveDist = changeMoveDistDirect(moveDist, moveX);
const radian = parseRadian(angle - 90);
const centerMoveDist = moveDist / 2;
centerX = centerX + centerMoveDist * Math.cos(radian);
centerY = centerY + centerMoveDist * Math.sin(radian);
} else if (angle < 270) {
moveDist = changeMoveDistDirect(moveDist, moveY);
const radian = parseRadian(angle - 180);
const centerMoveDist = moveDist / 2;
centerX = centerX - centerMoveDist * Math.sin(radian);
centerY = centerY + centerMoveDist * Math.cos(radian);
} else if (angle < 360) {
moveDist = 0 - changeMoveDistDirect(moveDist, moveX);
const radian = parseRadian(angle - 270);
const centerMoveDist = moveDist / 2;
centerX = centerX - centerMoveDist * Math.cos(radian);
centerY = centerY - centerMoveDist * Math.sin(radian);
}
if (p.h + moveDist > 0) {
if (elem.operation?.limitRatio === true) {
p.w = p.w + (moveDist / elem.h) * elem.w;
p.x = centerX - p.w / 2;
p.y = centerY - p.h / 2;
}
} else {
if (p.h - moveY > 0) {
p.y += moveY;
p.h -= moveY;
p.x -= moveX / 2;
p.w += moveX;
}
p.h = p.h + moveDist;
p.x = centerX - p.w / 2;
p.y = centerY - p.h / 2;
}
} else {
if (elem.angle === 0 || Math.abs(elem.angle) < limitQbliqueAngle) {
if (p.h - moveY > 0) {
p.y += moveY;
p.h -= moveY;
}
} else if (elem.angle > 0 || elem.angle < 0) {
const angle =
elem.angle > 0 ? elem.angle : Math.max(0, elem.angle + 360);
let moveDist = calcMoveDist(moveX, moveY);
let centerX = p.x + elem.w / 2;
let centerY = p.y + elem.h / 2;
if (angle < 90) {
moveDist = 0 - changeMoveDistDirect(moveDist, moveY);
const radian = parseRadian(angle);
const centerMoveDist = moveDist / 2;
centerX = centerX + centerMoveDist * Math.sin(radian);
centerY = centerY - centerMoveDist * Math.cos(radian);
} else if (angle < 180) {
moveDist = changeMoveDistDirect(moveDist, moveX);
const radian = parseRadian(angle - 90);
const centerMoveDist = moveDist / 2;
centerX = centerX + centerMoveDist * Math.cos(radian);
centerY = centerY + centerMoveDist * Math.sin(radian);
} else if (angle < 270) {
moveDist = changeMoveDistDirect(moveDist, moveY);
const radian = parseRadian(angle - 180);
const centerMoveDist = moveDist / 2;
centerX = centerX - centerMoveDist * Math.sin(radian);
centerY = centerY + centerMoveDist * Math.cos(radian);
} else if (angle < 360) {
moveDist = 0 - changeMoveDistDirect(moveDist, moveX);
const radian = parseRadian(angle - 270);
const centerMoveDist = moveDist / 2;
centerX = centerX - centerMoveDist * Math.cos(radian);
centerY = centerY - centerMoveDist * Math.sin(radian);
}
if (p.h + moveDist > 0) {
p.h = p.h + moveDist;
p.x = centerX - p.w / 2;
p.y = centerY - p.h / 2;
}
} else {
if (p.h - moveY > 0) {
p.y += moveY;
p.h -= moveY;
if (p.h - moveY > 0) {
p.y += moveY;
p.h -= moveY;
if (elem.operation?.limitRatio === true) {
p.x -= moveX / 2;
p.w += moveX;
}
}
}
@ -408,107 +364,63 @@ function calcuScaleElemPosition(
break;
}
case 'right': {
if (elem.operation?.limitRatio === true) {
if (elem.angle === 0 || Math.abs(elem.angle) < limitQbliqueAngle) {
if (elem.w + moveX > 0) {
p.w += moveX;
p.h += (moveX * elem.h) / elem.w;
if (elem.angle === 0 || Math.abs(elem.angle) < limitQbliqueAngle) {
if (elem.w + moveX > 0) {
p.w += moveX;
if (elem.operation?.limitRatio === true) {
p.y -= (moveX * elem.h) / elem.w / 2;
}
} else if (elem.angle > 0 || elem.angle < 0) {
const angle =
elem.angle > 0 ? elem.angle : Math.max(0, elem.angle + 360);
let moveDist = calcMoveDist(moveX, moveY);
let centerX = p.x + elem.w / 2;
let centerY = p.y + elem.h / 2;
if (angle < 90) {
moveDist = changeMoveDistDirect(moveDist, moveY);
const radian = parseRadian(angle);
const centerMoveDist = moveDist / 2;
centerX = centerX + centerMoveDist * Math.cos(radian);
centerY = centerY + centerMoveDist * Math.sin(radian);
} else if (angle < 180) {
moveDist = changeMoveDistDirect(moveDist, moveY);
const radian = parseRadian(angle - 90);
const centerMoveDist = moveDist / 2;
centerX = centerX - centerMoveDist * Math.sin(radian);
centerY = centerY + centerMoveDist * Math.cos(radian);
} else if (angle < 270) {
moveDist = changeMoveDistDirect(moveDist, moveY);
const radian = parseRadian(angle - 180);
const centerMoveDist = moveDist / 2;
centerX = centerX + centerMoveDist * Math.cos(radian);
centerY = centerY + centerMoveDist * Math.sin(radian);
moveDist = 0 - moveDist;
} else if (angle < 360) {
moveDist = changeMoveDistDirect(moveDist, moveX);
const radian = parseRadian(angle - 270);
const centerMoveDist = moveDist / 2;
centerX = centerX + centerMoveDist * Math.sin(radian);
centerY = centerY - centerMoveDist * Math.cos(radian);
}
if (p.w + moveDist > 0) {
p.w = p.w + moveDist;
p.h = p.h + (moveDist / elem.w) * elem.h;
p.x = centerX - p.w / 2;
p.y = centerY - p.h / 2;
}
} else {
if (elem.w + moveX > 0) {
p.w += moveX;
p.h += (moveX * elem.h) / elem.w;
p.y -= (moveX * elem.h) / elem.w / 2;
}
}
} else if (elem.angle > 0 || elem.angle < 0) {
const angle =
elem.angle > 0 ? elem.angle : Math.max(0, elem.angle + 360);
let moveDist = calcMoveDist(moveX, moveY);
let centerX = p.x + elem.w / 2;
let centerY = p.y + elem.h / 2;
if (angle < 90) {
moveDist = changeMoveDistDirect(moveDist, moveY);
const radian = parseRadian(angle);
const centerMoveDist = moveDist / 2;
centerX = centerX + centerMoveDist * Math.cos(radian);
centerY = centerY + centerMoveDist * Math.sin(radian);
} else if (angle < 180) {
moveDist = changeMoveDistDirect(moveDist, moveY);
const radian = parseRadian(angle - 90);
const centerMoveDist = moveDist / 2;
centerX = centerX - centerMoveDist * Math.sin(radian);
centerY = centerY + centerMoveDist * Math.cos(radian);
} else if (angle < 270) {
moveDist = changeMoveDistDirect(moveDist, moveY);
const radian = parseRadian(angle - 180);
const centerMoveDist = moveDist / 2;
centerX = centerX + centerMoveDist * Math.cos(radian);
centerY = centerY + centerMoveDist * Math.sin(radian);
moveDist = 0 - moveDist;
} else if (angle < 360) {
moveDist = changeMoveDistDirect(moveDist, moveX);
const radian = parseRadian(angle - 270);
const centerMoveDist = moveDist / 2;
centerX = centerX + centerMoveDist * Math.sin(radian);
centerY = centerY - centerMoveDist * Math.cos(radian);
}
if (p.w + moveDist > 0) {
if (elem.operation?.limitRatio === true) {
p.h = p.h + (moveDist / elem.w) * elem.h;
}
p.w = p.w + moveDist;
p.x = centerX - p.w / 2;
p.y = centerY - p.h / 2;
}
} else {
if (elem.angle === 0 || Math.abs(elem.angle) < limitQbliqueAngle) {
if (elem.w + moveX > 0) {
p.w += moveX;
}
} else if (elem.angle > 0 || elem.angle < 0) {
const angle =
elem.angle > 0 ? elem.angle : Math.max(0, elem.angle + 360);
let moveDist = calcMoveDist(moveX, moveY);
let centerX = p.x + elem.w / 2;
let centerY = p.y + elem.h / 2;
if (angle < 90) {
moveDist = changeMoveDistDirect(moveDist, moveY);
const radian = parseRadian(angle);
const centerMoveDist = moveDist / 2;
centerX = centerX + centerMoveDist * Math.cos(radian);
centerY = centerY + centerMoveDist * Math.sin(radian);
} else if (angle < 180) {
moveDist = changeMoveDistDirect(moveDist, moveY);
const radian = parseRadian(angle - 90);
const centerMoveDist = moveDist / 2;
centerX = centerX - centerMoveDist * Math.sin(radian);
centerY = centerY + centerMoveDist * Math.cos(radian);
} else if (angle < 270) {
moveDist = changeMoveDistDirect(moveDist, moveY);
const radian = parseRadian(angle - 180);
const centerMoveDist = moveDist / 2;
centerX = centerX + centerMoveDist * Math.cos(radian);
centerY = centerY + centerMoveDist * Math.sin(radian);
moveDist = 0 - moveDist;
} else if (angle < 360) {
moveDist = changeMoveDistDirect(moveDist, moveX);
const radian = parseRadian(angle - 270);
const centerMoveDist = moveDist / 2;
centerX = centerX + centerMoveDist * Math.sin(radian);
centerY = centerY - centerMoveDist * Math.cos(radian);
}
if (p.w + moveDist > 0) {
p.w = p.w + moveDist;
p.x = centerX - p.w / 2;
p.y = centerY - p.h / 2;
}
} else {
if (elem.w + moveX > 0) {
p.w += moveX;
if (elem.w + moveX > 0) {
p.w += moveX;
if (elem.operation?.limitRatio === true) {
p.h += (moveX * elem.h) / elem.w;
p.y -= (moveX * elem.h) / elem.w / 2;
}
}
}
break;
}
case 'bottom-right': {
@ -535,105 +447,62 @@ function calcuScaleElemPosition(
break;
}
case 'bottom': {
if (elem.operation?.limitRatio === true) {
if (elem.angle === 0 || Math.abs(elem.angle) < limitQbliqueAngle) {
if (elem.h + moveY > 0) {
p.h += moveY;
p.x -= ((moveY / elem.h) * elem.w) / 2;
p.w += (moveY / elem.h) * elem.w;
}
} else if (elem.angle > 0 || elem.angle < 0) {
const angle =
elem.angle > 0 ? elem.angle : Math.max(0, elem.angle + 360);
let moveDist = calcMoveDist(moveX, moveY);
let centerX = p.x + elem.w / 2;
let centerY = p.y + elem.h / 2;
if (angle < 90) {
moveDist = changeMoveDistDirect(moveDist, moveY);
const radian = parseRadian(angle);
const centerMoveDist = moveDist / 2;
centerX = centerX - centerMoveDist * Math.sin(radian);
centerY = centerY + centerMoveDist * Math.cos(radian);
} else if (angle < 180) {
moveDist = 0 - changeMoveDistDirect(moveDist, moveX);
const radian = parseRadian(angle - 90);
const centerMoveDist = moveDist / 2;
centerX = centerX - centerMoveDist * Math.cos(radian);
centerY = centerY - centerMoveDist * Math.sin(radian);
} else if (angle < 270) {
moveDist = changeMoveDistDirect(moveDist, moveX);
const radian = parseRadian(angle - 180);
const centerMoveDist = moveDist / 2;
centerX = centerX + centerMoveDist * Math.sin(radian);
centerY = centerY - centerMoveDist * Math.cos(radian);
} else if (angle < 360) {
moveDist = changeMoveDistDirect(moveDist, moveX);
const radian = parseRadian(angle - 270);
const centerMoveDist = moveDist / 2;
centerX = centerX + centerMoveDist * Math.cos(radian);
centerY = centerY + centerMoveDist * Math.sin(radian);
}
if (p.h + moveDist > 0) {
p.h = p.h + moveDist;
p.w = p.w + (moveDist / elem.h) * elem.w;
p.x = centerX - p.w / 2;
p.y = centerY - p.h / 2;
}
} else {
if (elem.h + moveY > 0) {
p.h += moveY;
if (elem.angle === 0 || Math.abs(elem.angle) < limitQbliqueAngle) {
if (elem.h + moveY > 0) {
p.h += moveY;
if (elem.operation?.limitRatio === true) {
p.x -= ((moveY / elem.h) * elem.w) / 2;
p.w += (moveY / elem.h) * elem.w;
}
}
} else if (elem.angle > 0 || elem.angle < 0) {
const angle =
elem.angle > 0 ? elem.angle : Math.max(0, elem.angle + 360);
let moveDist = calcMoveDist(moveX, moveY);
let centerX = p.x + elem.w / 2;
let centerY = p.y + elem.h / 2;
if (angle < 90) {
moveDist = changeMoveDistDirect(moveDist, moveY);
const radian = parseRadian(angle);
const centerMoveDist = moveDist / 2;
centerX = centerX - centerMoveDist * Math.sin(radian);
centerY = centerY + centerMoveDist * Math.cos(radian);
} else if (angle < 180) {
moveDist = 0 - changeMoveDistDirect(moveDist, moveX);
const radian = parseRadian(angle - 90);
const centerMoveDist = moveDist / 2;
centerX = centerX - centerMoveDist * Math.cos(radian);
centerY = centerY - centerMoveDist * Math.sin(radian);
} else if (angle < 270) {
moveDist = changeMoveDistDirect(moveDist, moveX);
const radian = parseRadian(angle - 180);
const centerMoveDist = moveDist / 2;
centerX = centerX + centerMoveDist * Math.sin(radian);
centerY = centerY - centerMoveDist * Math.cos(radian);
} else if (angle < 360) {
moveDist = changeMoveDistDirect(moveDist, moveX);
const radian = parseRadian(angle - 270);
const centerMoveDist = moveDist / 2;
centerX = centerX + centerMoveDist * Math.cos(radian);
centerY = centerY + centerMoveDist * Math.sin(radian);
}
if (p.h + moveDist > 0) {
if (elem.operation?.limitRatio === true) {
p.w = p.w + (moveDist / elem.h) * elem.w;
}
p.h = p.h + moveDist;
p.x = centerX - p.w / 2;
p.y = centerY - p.h / 2;
}
} else {
if (elem.angle === 0 || Math.abs(elem.angle) < limitQbliqueAngle) {
if (elem.h + moveY > 0) {
p.h += moveY;
}
} else if (elem.angle > 0 || elem.angle < 0) {
const angle =
elem.angle > 0 ? elem.angle : Math.max(0, elem.angle + 360);
let moveDist = calcMoveDist(moveX, moveY);
let centerX = p.x + elem.w / 2;
let centerY = p.y + elem.h / 2;
if (angle < 90) {
moveDist = changeMoveDistDirect(moveDist, moveY);
const radian = parseRadian(angle);
const centerMoveDist = moveDist / 2;
centerX = centerX - centerMoveDist * Math.sin(radian);
centerY = centerY + centerMoveDist * Math.cos(radian);
} else if (angle < 180) {
moveDist = 0 - changeMoveDistDirect(moveDist, moveX);
const radian = parseRadian(angle - 90);
const centerMoveDist = moveDist / 2;
centerX = centerX - centerMoveDist * Math.cos(radian);
centerY = centerY - centerMoveDist * Math.sin(radian);
} else if (angle < 270) {
moveDist = changeMoveDistDirect(moveDist, moveX);
const radian = parseRadian(angle - 180);
const centerMoveDist = moveDist / 2;
centerX = centerX + centerMoveDist * Math.sin(radian);
centerY = centerY - centerMoveDist * Math.cos(radian);
} else if (angle < 360) {
moveDist = changeMoveDistDirect(moveDist, moveX);
const radian = parseRadian(angle - 270);
const centerMoveDist = moveDist / 2;
centerX = centerX + centerMoveDist * Math.cos(radian);
centerY = centerY + centerMoveDist * Math.sin(radian);
}
if (p.h + moveDist > 0) {
p.h = p.h + moveDist;
p.x = centerX - p.w / 2;
p.y = centerY - p.h / 2;
}
} else {
if (elem.h + moveY > 0) {
p.h += moveY;
if (elem.h + moveY > 0) {
p.h += moveY;
if (elem.operation?.limitRatio === true) {
p.x -= ((moveY / elem.h) * elem.w) / 2;
p.w += (moveY / elem.h) * elem.w;
}
}
}
break;
}
case 'bottom-left': {
@ -665,8 +534,10 @@ function calcuScaleElemPosition(
if (elem.w - moveX > 0) {
p.x += moveX;
p.w -= moveX;
p.h -= (moveX / elem.w) * elem.h;
p.y += ((moveX / elem.w) * elem.h) / 2;
if (elem.operation?.limitRatio === true) {
p.h -= (moveX / elem.w) * elem.h;
p.y += ((moveX / elem.w) * elem.h) / 2;
}
}
} else if (elem.angle > 0 || elem.angle < 0) {
const angle =
@ -700,8 +571,10 @@ function calcuScaleElemPosition(
centerY = centerY + centerMoveDist * Math.cos(radian);
}
if (p.w + moveDist > 0) {
if (elem.operation?.limitRatio === true) {
p.h = p.h + (moveDist / elem.w) * elem.h;
}
p.w = p.w + moveDist;
p.h = p.h + (moveDist / elem.w) * elem.h;
p.x = centerX - p.w / 2;
p.y = centerY - p.h / 2;
}
@ -709,8 +582,10 @@ function calcuScaleElemPosition(
if (elem.w - moveX > 0) {
p.x += moveX;
p.w -= moveX;
p.h -= (moveX / elem.w) * elem.h;
p.y += ((moveX / elem.w) * elem.h) / 2;
if (elem.operation?.limitRatio === true) {
p.h -= (moveX / elem.w) * elem.h;
p.y += ((moveX / elem.w) * elem.h) / 2;
}
}
}
break;