2021-03-25 19:16:32 +08:00
|
|
|
/* eslint-disable no-lonely-if */
|
|
|
|
import { calculateRotatedPointCoordinate, getCenterPoint } from './translate'
|
|
|
|
|
|
|
|
const funcs = {
|
2021-06-01 13:40:26 +08:00
|
|
|
lt: calculateLeftTop,
|
|
|
|
t: calculateTop,
|
|
|
|
rt: calculateRightTop,
|
|
|
|
r: calculateRight,
|
|
|
|
rb: calculateRightBottom,
|
|
|
|
b: calculateBottom,
|
|
|
|
lb: calculateLeftBottom,
|
|
|
|
l: calculateLeft
|
2021-03-25 19:16:32 +08:00
|
|
|
}
|
|
|
|
|
2022-10-22 22:32:44 +08:00
|
|
|
function calculateLeftTop(style, curPosition, proportion, needLockProportion, pointInfo) {
|
2021-06-01 13:40:26 +08:00
|
|
|
const { symmetricPoint } = pointInfo
|
2022-10-22 22:32:44 +08:00
|
|
|
let newCenterPoint = getCenterPoint(curPosition, symmetricPoint)
|
|
|
|
let newTopLeftPoint = calculateRotatedPointCoordinate(curPosition, newCenterPoint, -style.rotate)
|
2021-06-01 13:40:26 +08:00
|
|
|
let newBottomRightPoint = calculateRotatedPointCoordinate(symmetricPoint, newCenterPoint, -style.rotate)
|
2021-03-25 19:16:32 +08:00
|
|
|
|
2021-06-01 13:40:26 +08:00
|
|
|
let newWidth = newBottomRightPoint.x - newTopLeftPoint.x
|
|
|
|
let newHeight = newBottomRightPoint.y - newTopLeftPoint.y
|
2021-03-25 19:16:32 +08:00
|
|
|
|
2021-06-01 13:40:26 +08:00
|
|
|
if (needLockProportion) {
|
|
|
|
if (newWidth / newHeight > proportion) {
|
|
|
|
newTopLeftPoint.x += Math.abs(newWidth - newHeight * proportion)
|
|
|
|
newWidth = newHeight * proportion
|
|
|
|
} else {
|
|
|
|
newTopLeftPoint.y += Math.abs(newHeight - newWidth / proportion)
|
|
|
|
newHeight = newWidth / proportion
|
2021-03-25 19:16:32 +08:00
|
|
|
}
|
2021-06-01 13:40:26 +08:00
|
|
|
|
|
|
|
// 由于现在求的未旋转前的坐标是以没按比例缩减宽高前的坐标来计算的
|
|
|
|
// 所以缩减宽高后,需要按照原来的中心点旋转回去,获得缩减宽高并旋转后对应的坐标
|
|
|
|
// 然后以这个坐标和对称点获得新的中心点,并重新计算未旋转前的坐标
|
|
|
|
const rotatedTopLeftPoint = calculateRotatedPointCoordinate(newTopLeftPoint, newCenterPoint, style.rotate)
|
|
|
|
newCenterPoint = getCenterPoint(rotatedTopLeftPoint, symmetricPoint)
|
|
|
|
newTopLeftPoint = calculateRotatedPointCoordinate(rotatedTopLeftPoint, newCenterPoint, -style.rotate)
|
|
|
|
newBottomRightPoint = calculateRotatedPointCoordinate(symmetricPoint, newCenterPoint, -style.rotate)
|
|
|
|
|
|
|
|
newWidth = newBottomRightPoint.x - newTopLeftPoint.x
|
|
|
|
newHeight = newBottomRightPoint.y - newTopLeftPoint.y
|
|
|
|
}
|
|
|
|
|
|
|
|
if (newWidth > 0 && newHeight > 0) {
|
|
|
|
style.width = Math.round(newWidth)
|
|
|
|
style.height = Math.round(newHeight)
|
|
|
|
style.left = Math.round(newTopLeftPoint.x)
|
|
|
|
style.top = Math.round(newTopLeftPoint.y)
|
|
|
|
}
|
2021-03-25 19:16:32 +08:00
|
|
|
}
|
|
|
|
|
2022-10-22 22:32:44 +08:00
|
|
|
function calculateRightTop(style, curPosition, proportion, needLockProportion, pointInfo) {
|
2021-06-01 13:40:26 +08:00
|
|
|
const { symmetricPoint } = pointInfo
|
2022-10-22 22:32:44 +08:00
|
|
|
let newCenterPoint = getCenterPoint(curPosition, symmetricPoint)
|
|
|
|
let newTopRightPoint = calculateRotatedPointCoordinate(curPosition, newCenterPoint, -style.rotate)
|
2021-06-01 13:40:26 +08:00
|
|
|
let newBottomLeftPoint = calculateRotatedPointCoordinate(symmetricPoint, newCenterPoint, -style.rotate)
|
2021-03-25 19:16:32 +08:00
|
|
|
|
2021-06-01 13:40:26 +08:00
|
|
|
let newWidth = newTopRightPoint.x - newBottomLeftPoint.x
|
|
|
|
let newHeight = newBottomLeftPoint.y - newTopRightPoint.y
|
|
|
|
|
|
|
|
if (needLockProportion) {
|
|
|
|
if (newWidth / newHeight > proportion) {
|
|
|
|
newTopRightPoint.x -= Math.abs(newWidth - newHeight * proportion)
|
|
|
|
newWidth = newHeight * proportion
|
|
|
|
} else {
|
|
|
|
newTopRightPoint.y += Math.abs(newHeight - newWidth / proportion)
|
|
|
|
newHeight = newWidth / proportion
|
2021-03-25 19:16:32 +08:00
|
|
|
}
|
2021-06-01 13:40:26 +08:00
|
|
|
|
|
|
|
const rotatedTopRightPoint = calculateRotatedPointCoordinate(newTopRightPoint, newCenterPoint, style.rotate)
|
|
|
|
newCenterPoint = getCenterPoint(rotatedTopRightPoint, symmetricPoint)
|
|
|
|
newTopRightPoint = calculateRotatedPointCoordinate(rotatedTopRightPoint, newCenterPoint, -style.rotate)
|
|
|
|
newBottomLeftPoint = calculateRotatedPointCoordinate(symmetricPoint, newCenterPoint, -style.rotate)
|
|
|
|
|
|
|
|
newWidth = newTopRightPoint.x - newBottomLeftPoint.x
|
|
|
|
newHeight = newBottomLeftPoint.y - newTopRightPoint.y
|
|
|
|
}
|
|
|
|
|
|
|
|
if (newWidth > 0 && newHeight > 0) {
|
|
|
|
style.width = Math.round(newWidth)
|
|
|
|
style.height = Math.round(newHeight)
|
|
|
|
style.left = Math.round(newBottomLeftPoint.x)
|
|
|
|
style.top = Math.round(newTopRightPoint.y)
|
|
|
|
}
|
2021-03-25 19:16:32 +08:00
|
|
|
}
|
2021-06-01 13:40:26 +08:00
|
|
|
|
2022-10-22 22:32:44 +08:00
|
|
|
function calculateRightBottom(style, curPosition, proportion, needLockProportion, pointInfo) {
|
2021-06-01 13:40:26 +08:00
|
|
|
const { symmetricPoint } = pointInfo
|
2022-10-22 22:32:44 +08:00
|
|
|
let newCenterPoint = getCenterPoint(curPosition, symmetricPoint)
|
2021-06-01 13:40:26 +08:00
|
|
|
let newTopLeftPoint = calculateRotatedPointCoordinate(symmetricPoint, newCenterPoint, -style.rotate)
|
2022-10-22 22:32:44 +08:00
|
|
|
let newBottomRightPoint = calculateRotatedPointCoordinate(curPosition, newCenterPoint, -style.rotate)
|
2021-03-25 19:16:32 +08:00
|
|
|
|
2021-06-01 13:40:26 +08:00
|
|
|
let newWidth = newBottomRightPoint.x - newTopLeftPoint.x
|
|
|
|
let newHeight = newBottomRightPoint.y - newTopLeftPoint.y
|
2021-03-25 19:16:32 +08:00
|
|
|
|
2021-06-01 13:40:26 +08:00
|
|
|
if (needLockProportion) {
|
|
|
|
if (newWidth / newHeight > proportion) {
|
|
|
|
newBottomRightPoint.x -= Math.abs(newWidth - newHeight * proportion)
|
|
|
|
newWidth = newHeight * proportion
|
|
|
|
} else {
|
|
|
|
newBottomRightPoint.y -= Math.abs(newHeight - newWidth / proportion)
|
|
|
|
newHeight = newWidth / proportion
|
2021-03-25 19:16:32 +08:00
|
|
|
}
|
2021-06-01 13:40:26 +08:00
|
|
|
|
|
|
|
const rotatedBottomRightPoint = calculateRotatedPointCoordinate(newBottomRightPoint, newCenterPoint, style.rotate)
|
|
|
|
newCenterPoint = getCenterPoint(rotatedBottomRightPoint, symmetricPoint)
|
|
|
|
newTopLeftPoint = calculateRotatedPointCoordinate(symmetricPoint, newCenterPoint, -style.rotate)
|
|
|
|
newBottomRightPoint = calculateRotatedPointCoordinate(rotatedBottomRightPoint, newCenterPoint, -style.rotate)
|
|
|
|
|
|
|
|
newWidth = newBottomRightPoint.x - newTopLeftPoint.x
|
|
|
|
newHeight = newBottomRightPoint.y - newTopLeftPoint.y
|
|
|
|
}
|
|
|
|
|
|
|
|
if (newWidth > 0 && newHeight > 0) {
|
|
|
|
style.width = Math.round(newWidth)
|
|
|
|
style.height = Math.round(newHeight)
|
|
|
|
style.left = Math.round(newTopLeftPoint.x)
|
|
|
|
style.top = Math.round(newTopLeftPoint.y)
|
|
|
|
}
|
2021-03-25 19:16:32 +08:00
|
|
|
}
|
2021-06-01 13:40:26 +08:00
|
|
|
|
2022-10-22 22:32:44 +08:00
|
|
|
function calculateLeftBottom(style, curPosition, proportion, needLockProportion, pointInfo) {
|
2021-06-01 13:40:26 +08:00
|
|
|
const { symmetricPoint } = pointInfo
|
2022-10-22 22:32:44 +08:00
|
|
|
let newCenterPoint = getCenterPoint(curPosition, symmetricPoint)
|
2021-06-01 13:40:26 +08:00
|
|
|
let newTopRightPoint = calculateRotatedPointCoordinate(symmetricPoint, newCenterPoint, -style.rotate)
|
2022-10-22 22:32:44 +08:00
|
|
|
let newBottomLeftPoint = calculateRotatedPointCoordinate(curPosition, newCenterPoint, -style.rotate)
|
2021-03-25 19:16:32 +08:00
|
|
|
|
2021-06-01 13:40:26 +08:00
|
|
|
let newWidth = newTopRightPoint.x - newBottomLeftPoint.x
|
|
|
|
let newHeight = newBottomLeftPoint.y - newTopRightPoint.y
|
2021-03-25 19:16:32 +08:00
|
|
|
|
2021-06-01 13:40:26 +08:00
|
|
|
if (needLockProportion) {
|
|
|
|
if (newWidth / newHeight > proportion) {
|
|
|
|
newBottomLeftPoint.x += Math.abs(newWidth - newHeight * proportion)
|
|
|
|
newWidth = newHeight * proportion
|
|
|
|
} else {
|
|
|
|
newBottomLeftPoint.y -= Math.abs(newHeight - newWidth / proportion)
|
|
|
|
newHeight = newWidth / proportion
|
2021-03-25 19:16:32 +08:00
|
|
|
}
|
|
|
|
|
2021-06-01 13:40:26 +08:00
|
|
|
const rotatedBottomLeftPoint = calculateRotatedPointCoordinate(newBottomLeftPoint, newCenterPoint, style.rotate)
|
|
|
|
newCenterPoint = getCenterPoint(rotatedBottomLeftPoint, symmetricPoint)
|
|
|
|
newTopRightPoint = calculateRotatedPointCoordinate(symmetricPoint, newCenterPoint, -style.rotate)
|
|
|
|
newBottomLeftPoint = calculateRotatedPointCoordinate(rotatedBottomLeftPoint, newCenterPoint, -style.rotate)
|
|
|
|
|
|
|
|
newWidth = newTopRightPoint.x - newBottomLeftPoint.x
|
|
|
|
newHeight = newBottomLeftPoint.y - newTopRightPoint.y
|
|
|
|
}
|
|
|
|
|
|
|
|
if (newWidth > 0 && newHeight > 0) {
|
|
|
|
style.width = Math.round(newWidth)
|
|
|
|
style.height = Math.round(newHeight)
|
|
|
|
style.left = Math.round(newBottomLeftPoint.x)
|
|
|
|
style.top = Math.round(newTopRightPoint.y)
|
|
|
|
}
|
2021-03-25 19:16:32 +08:00
|
|
|
}
|
|
|
|
|
2022-10-22 22:32:44 +08:00
|
|
|
function calculateTop(style, curPosition, proportion, needLockProportion, pointInfo) {
|
2021-06-01 13:40:26 +08:00
|
|
|
const { symmetricPoint, curPoint } = pointInfo
|
2022-10-22 22:32:44 +08:00
|
|
|
const rotatedcurPosition = calculateRotatedPointCoordinate(curPosition, curPoint, -style.rotate)
|
2021-06-01 13:40:26 +08:00
|
|
|
const rotatedTopMiddlePoint = calculateRotatedPointCoordinate({
|
|
|
|
x: curPoint.x,
|
2022-10-22 22:32:44 +08:00
|
|
|
y: rotatedcurPosition.y
|
2021-06-01 13:40:26 +08:00
|
|
|
}, curPoint, style.rotate)
|
|
|
|
|
|
|
|
// 勾股定理
|
|
|
|
const newHeight = Math.sqrt((rotatedTopMiddlePoint.x - symmetricPoint.x) ** 2 + (rotatedTopMiddlePoint.y - symmetricPoint.y) ** 2)
|
|
|
|
|
|
|
|
if (newHeight > 0) {
|
|
|
|
const newCenter = {
|
|
|
|
x: rotatedTopMiddlePoint.x - (rotatedTopMiddlePoint.x - symmetricPoint.x) / 2,
|
|
|
|
y: rotatedTopMiddlePoint.y + (symmetricPoint.y - rotatedTopMiddlePoint.y) / 2
|
2021-03-25 19:16:32 +08:00
|
|
|
}
|
2021-06-01 13:40:26 +08:00
|
|
|
|
|
|
|
let width = style.width
|
|
|
|
// 因为调整的是高度 所以只需根据锁定的比例调整宽度即可
|
|
|
|
if (needLockProportion) {
|
|
|
|
width = newHeight * proportion
|
|
|
|
}
|
|
|
|
|
|
|
|
style.width = width
|
|
|
|
style.height = Math.round(newHeight)
|
|
|
|
style.top = Math.round(newCenter.y - (newHeight / 2))
|
|
|
|
style.left = Math.round(newCenter.x - (style.width / 2))
|
|
|
|
}
|
2021-03-25 19:16:32 +08:00
|
|
|
}
|
2021-06-01 13:40:26 +08:00
|
|
|
|
2022-10-22 22:32:44 +08:00
|
|
|
function calculateRight(style, curPosition, proportion, needLockProportion, pointInfo) {
|
2021-06-01 13:40:26 +08:00
|
|
|
const { symmetricPoint, curPoint } = pointInfo
|
2022-10-22 22:32:44 +08:00
|
|
|
const rotatedcurPosition = calculateRotatedPointCoordinate(curPosition, curPoint, -style.rotate)
|
2021-06-01 13:40:26 +08:00
|
|
|
const rotatedRightMiddlePoint = calculateRotatedPointCoordinate({
|
2022-10-22 22:32:44 +08:00
|
|
|
x: rotatedcurPosition.x,
|
2021-06-01 13:40:26 +08:00
|
|
|
y: curPoint.y
|
|
|
|
}, curPoint, style.rotate)
|
|
|
|
|
|
|
|
const newWidth = Math.sqrt((rotatedRightMiddlePoint.x - symmetricPoint.x) ** 2 + (rotatedRightMiddlePoint.y - symmetricPoint.y) ** 2)
|
|
|
|
if (newWidth > 0) {
|
|
|
|
const newCenter = {
|
|
|
|
x: rotatedRightMiddlePoint.x - (rotatedRightMiddlePoint.x - symmetricPoint.x) / 2,
|
|
|
|
y: rotatedRightMiddlePoint.y + (symmetricPoint.y - rotatedRightMiddlePoint.y) / 2
|
2021-03-25 19:16:32 +08:00
|
|
|
}
|
2021-06-01 13:40:26 +08:00
|
|
|
|
|
|
|
let height = style.height
|
|
|
|
// 因为调整的是宽度 所以只需根据锁定的比例调整高度即可
|
|
|
|
if (needLockProportion) {
|
|
|
|
height = newWidth / proportion
|
|
|
|
}
|
|
|
|
|
|
|
|
style.height = height
|
|
|
|
style.width = Math.round(newWidth)
|
|
|
|
style.top = Math.round(newCenter.y - (style.height / 2))
|
|
|
|
style.left = Math.round(newCenter.x - (newWidth / 2))
|
|
|
|
}
|
2021-03-25 19:16:32 +08:00
|
|
|
}
|
2021-06-01 13:40:26 +08:00
|
|
|
|
2022-10-22 22:32:44 +08:00
|
|
|
function calculateBottom(style, curPosition, proportion, needLockProportion, pointInfo) {
|
2021-06-01 13:40:26 +08:00
|
|
|
const { symmetricPoint, curPoint } = pointInfo
|
2022-10-22 22:32:44 +08:00
|
|
|
const rotatedcurPosition = calculateRotatedPointCoordinate(curPosition, curPoint, -style.rotate)
|
2021-06-01 13:40:26 +08:00
|
|
|
const rotatedBottomMiddlePoint = calculateRotatedPointCoordinate({
|
|
|
|
x: curPoint.x,
|
2022-10-22 22:32:44 +08:00
|
|
|
y: rotatedcurPosition.y
|
2021-06-01 13:40:26 +08:00
|
|
|
}, curPoint, style.rotate)
|
|
|
|
|
|
|
|
const newHeight = Math.sqrt((rotatedBottomMiddlePoint.x - symmetricPoint.x) ** 2 + (rotatedBottomMiddlePoint.y - symmetricPoint.y) ** 2)
|
|
|
|
if (newHeight > 0) {
|
|
|
|
const newCenter = {
|
|
|
|
x: rotatedBottomMiddlePoint.x - (rotatedBottomMiddlePoint.x - symmetricPoint.x) / 2,
|
|
|
|
y: rotatedBottomMiddlePoint.y + (symmetricPoint.y - rotatedBottomMiddlePoint.y) / 2
|
2021-03-25 19:16:32 +08:00
|
|
|
}
|
2021-06-01 13:40:26 +08:00
|
|
|
|
|
|
|
let width = style.width
|
|
|
|
// 因为调整的是高度 所以只需根据锁定的比例调整宽度即可
|
|
|
|
if (needLockProportion) {
|
|
|
|
width = newHeight * proportion
|
|
|
|
}
|
|
|
|
|
|
|
|
style.width = width
|
|
|
|
style.height = Math.round(newHeight)
|
|
|
|
style.top = Math.round(newCenter.y - (newHeight / 2))
|
|
|
|
style.left = Math.round(newCenter.x - (style.width / 2))
|
|
|
|
}
|
2021-03-25 19:16:32 +08:00
|
|
|
}
|
2021-06-01 13:40:26 +08:00
|
|
|
|
2022-10-22 22:32:44 +08:00
|
|
|
function calculateLeft(style, curPosition, proportion, needLockProportion, pointInfo) {
|
2021-06-01 13:40:26 +08:00
|
|
|
const { symmetricPoint, curPoint } = pointInfo
|
2022-10-22 22:32:44 +08:00
|
|
|
const rotatedcurPosition = calculateRotatedPointCoordinate(curPosition, curPoint, -style.rotate)
|
2021-06-01 13:40:26 +08:00
|
|
|
const rotatedLeftMiddlePoint = calculateRotatedPointCoordinate({
|
2022-10-22 22:32:44 +08:00
|
|
|
x: rotatedcurPosition.x,
|
2021-06-01 13:40:26 +08:00
|
|
|
y: curPoint.y
|
|
|
|
}, curPoint, style.rotate)
|
|
|
|
|
|
|
|
const newWidth = Math.sqrt((rotatedLeftMiddlePoint.x - symmetricPoint.x) ** 2 + (rotatedLeftMiddlePoint.y - symmetricPoint.y) ** 2)
|
|
|
|
if (newWidth > 0) {
|
|
|
|
const newCenter = {
|
|
|
|
x: rotatedLeftMiddlePoint.x - (rotatedLeftMiddlePoint.x - symmetricPoint.x) / 2,
|
|
|
|
y: rotatedLeftMiddlePoint.y + (symmetricPoint.y - rotatedLeftMiddlePoint.y) / 2
|
2021-03-25 19:16:32 +08:00
|
|
|
}
|
2021-06-01 13:40:26 +08:00
|
|
|
|
|
|
|
let height = style.height
|
|
|
|
if (needLockProportion) {
|
|
|
|
height = newWidth / proportion
|
|
|
|
}
|
|
|
|
|
|
|
|
style.height = height
|
|
|
|
style.width = Math.round(newWidth)
|
|
|
|
style.top = Math.round(newCenter.y - (style.height / 2))
|
|
|
|
style.left = Math.round(newCenter.x - (newWidth / 2))
|
|
|
|
}
|
2021-03-25 19:16:32 +08:00
|
|
|
}
|
|
|
|
|
2022-10-22 22:32:44 +08:00
|
|
|
export default function calculateComponentPositionAndSize(name, style, curPosition, proportion, needLockProportion, pointInfo) {
|
|
|
|
funcs[name](style, curPosition, proportion, needLockProportion, pointInfo)
|
2021-06-01 13:40:26 +08:00
|
|
|
}
|