Как элегантно изменить размер прямоугольников с сохранением соотношения сторон - PullRequest
0 голосов
/ 27 февраля 2020

Я хотел бы изменить размеры прямоугольников в двумерной системе координат (начиная с 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, их будет гораздо больше, включая репозицию и соотношение сторон.

Я уверен, что должен быть очень элегантный способ сделать все это, но моя математика слишком слаба.

1 Ответ

1 голос
/ 28 февраля 2020

Существует startpos (возможно, ваш якорь) и текущая позиция мыши (X,Y). Образец прямоугольника имеет размеры (sw, sh) (например, 320x240).

Результат прямоугольник имеет левый верхний угол позиции (rx0, ry0) и размер rw, rh

  nw = X - startpos.x
  nh = Y - startpos.y
  anw = Abs(nw)
  anh = Abs(nh)

  if anw * sh < anh * sw:
      rh = anh
      rw = rh * sw // sh     #integer division if important
      ry0 = Min(Y, startpos.y)
      rx0 = Min(startpos.x, startpos.x + rw * Sign(nw))
  else:
      rw = anw
      rh = rw * sh // sw
      rx0 = Min(X, startpos.x)
      ry0 = Min(startpos.y, startpos.y + rh * Sign(nh))

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...