考虑到旋转,使用 JS 调整多个对象的大小
Resize multiple objects with JS considering rotate
我正在开发可视化编辑器,其中包含对象和用户交互,例如移动、调整大小、旋转等...
我有调整大小和旋转功能。现在我已经实现了 multi-select 功能,当用户 select 多个对象并调整对象大小保持原始比例时。
该功能运行良好,但不适用于旋转的对象。我创建了一个简化的 codepen example。基本上问题是 - 如何调整 resize()
函数以确保它适用于旋转的对象。要重现问题,只需单击 "Rotate",然后单击 "Increase width & height" 一次或多次。
function resize(incrementX, incrementY, offsetX, offsetY) {
...
}
我不确定这是否是解决您问题的有效方法,但您可以在调整大小之前撤消旋转,然后再重置旋转。像这样。
function resize(incrementX, incrementY, offsetX, offsetY) {
var old_r = objmultiple.r
rotate(-objmultiple.r)
var ratioX = (objmultiple.w + incrementX) / objmultiple.w;
var ratioY = (objmultiple.h + incrementY) / objmultiple.h;
objmultiple.x += offsetX;
objmultiple.y += offsetY;
objmultiple.w = objmultiple.w + incrementX;
objmultiple.h = objmultiple.h + incrementY;
[obj1, obj2].forEach(function(obj) {
obj.x = (obj.x - objmultiple.x + offsetX) * ratioX + objmultiple.x;
obj.y = (obj.y - objmultiple.y + offsetY) * ratioY + objmultiple.y;
obj.w *= ratioX;
obj.h *= ratioY;
});
rotate(old_r)
}
Codepen here
我正在开发可视化编辑器,其中包含对象和用户交互,例如移动、调整大小、旋转等...
我有调整大小和旋转功能。现在我已经实现了 multi-select 功能,当用户 select 多个对象并调整对象大小保持原始比例时。
该功能运行良好,但不适用于旋转的对象。我创建了一个简化的 codepen example。基本上问题是 - 如何调整 resize()
函数以确保它适用于旋转的对象。要重现问题,只需单击 "Rotate",然后单击 "Increase width & height" 一次或多次。
function resize(incrementX, incrementY, offsetX, offsetY) {
...
}
我不确定这是否是解决您问题的有效方法,但您可以在调整大小之前撤消旋转,然后再重置旋转。像这样。
function resize(incrementX, incrementY, offsetX, offsetY) {
var old_r = objmultiple.r
rotate(-objmultiple.r)
var ratioX = (objmultiple.w + incrementX) / objmultiple.w;
var ratioY = (objmultiple.h + incrementY) / objmultiple.h;
objmultiple.x += offsetX;
objmultiple.y += offsetY;
objmultiple.w = objmultiple.w + incrementX;
objmultiple.h = objmultiple.h + incrementY;
[obj1, obj2].forEach(function(obj) {
obj.x = (obj.x - objmultiple.x + offsetX) * ratioX + objmultiple.x;
obj.y = (obj.y - objmultiple.y + offsetY) * ratioY + objmultiple.y;
obj.w *= ratioX;
obj.h *= ratioY;
});
rotate(old_r)
}
Codepen here