Я хотел бы изменить размеры прямоугольников в двумерной системе координат (начиная с 0,0 с максимальным размером 1000, 1000) с помощью компьютерной мыши. Это не должно быть очень сложным, и у меня уже есть краткое решение для этого:
псевдокод
function setSize(shape, anchor)
mouseX, mouseY = GetCursorPosition();
if (anchor == "LEFT") then
diff = math.abs(mouseX - shape.left);
if (shape.left > mouseX) then
shape.width = shape.width + diff
else
shape.width = shape.width - diff
end
elseif (anchor == "TOPLEFT") then
diffX = math.abs(mouseX - shape.left);
diffY = math.abs(mouseY - shape.top);
if (shape.left > mouseX) then
shape.width = spahe.width + diffX
else
shape.width = shape.width - diffX
end
if (shape.top > mouseY) then
shape.height = shape.height - diffY
else
shape.height = shape.height + diffY
end
elseif (anchor == "TOP") then
diffY = math.abs(mouseY - shape.top);
if (shape.top > mouseY) then
shape.height = shape.height - diffY
else
shape.height = shape.height + diffY
end
elseif (anchor == "TOPRIGHT") then
diffX = math.abs(mouseX - shape.right);
diffY = math.abs(mouseY - shape.top);
if (shape.right > mouseX) then
shape.width = shape.width - diffX
else
shape.width = spahe.width + diffX
end
if (shape.top > mouseY) then
shape.height = shape.height - diffY
else
shape.height = shape.height + diffY
end
elseif (anchor == "RIGHT") then
diffX = math.abs(mouseX - shape.right);
if (shape.right > mouseX) then
shape.width = shape.width - diffX
else
shape.width = spahe.width + diffX
end
elseif (anchor == "BOTTOMRIGHT") then
diffX = math.abs(mouseX - shape.right);
diffY = math.abs(mouseY - shape.bottom);
if (shape.right > mouseX) then
shape.width = shape.width - diffX
else
shape.width = spahe.width + diffX
end
if (shape.bottom > mouseY) then
shape.height = shape.height + diffY
else
shape.height = shape.height - diffY
end
elseif (anchor == "BOTTOM") then
diffY = math.abs(mouseY - shape.bottom);
if (shape.bottom > mouseY) then
shape.height = shape.height + diffY
else
shape.height = shape.height - diffY
end
elseif (anchor == "BOTTOMLEFT") then
diffX = math.abs(mouseX - shape.left);
diffY = math.abs(mouseY - shape.bottom);
if (shape.left > mouseX) then
shape.width = spahe.width + diffX
else
shape.width = shape.width - diffX
end
if (shape.bottom > mouseY) then
shape.height = shape.height + diffY
else
shape.height = shape.height - diffY
end
end
end
Чего не хватает в коде, так это изменения положения прямоугольника и также поддержка для необязательного сохранения соотношения сторон прямоугольника. Несмотря на то, что в приведенном выше коде уже есть много символов if и elses, их будет гораздо больше, включая репозицию и соотношение сторон.
Я уверен, что должен быть очень элегантный способ сделать все это, но моя математика слишком слаба.