Как масштабировать множество фигур и сохранять одинаковую пропорцию - PullRequest
0 голосов
/ 10 марта 2011

У меня есть две фигуры, и я хочу сделать масштабирование, я использую следующий код

Iterator iter = objects.iterator();


    Shape shape;
    while(iter.hasNext()){
        shape = (Shape)iter.next();
        AffineTransform t = shape.getAffineTransform(); 
        int x = shape.getCenter().x;
        int y = shape.getCenter().y;            
        t.translate(-x, -y);
        t.scale(sx,sy);
        t.translate(x, y);
        shape.setAffineTransform(t);
    }

Фигуры увеличены, но расстояние между ними стало меньше Befor the zooming after the zomming

Я подумал сделать составную фигуру из двух фигур и затем масштабировать ее. Есть ли другой способ сохранить пропорции? спасибо

Ответы [ 4 ]

2 голосов
/ 10 марта 2011

Как я уже сказал в своем комментарии, поскольку вы масштабируете фигуры вокруг их соответствующих центров, центры, очевидно, не будут перемещаться.Если вы хотите, чтобы все было равномерно масштабировано, ничего не переводите:

  1. Найдите центральную точку исходного окна просмотра.Это та точка, с которой вы должны уменьшить масштаб.
  2. Масштабируйте все на (sx, sy).
  3. Переведите все на (origcentrex * (1-sx), origcentrey * (1-sy)) чтобы переместить центральную точку обратно в центр области просмотра.

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

0 голосов
/ 11 марта 2011

Спасибо всем за ответы, я нашел решение, которое работает для меня

    while(iter.hasNext()){
        shape = (Shape)iter.next();                     
        AffineTransform t = new AffineTransform();
        t.scale(sx,sy); 
        t.concatenate(shape.getAffineTransform());
        shape.setAffineTransform(t); 
    }
}
0 голосов
/ 11 марта 2011

Если вы хотите иметь истинное масштабирование, это означает масштабирование фигур и пустое пространство между ними.Если вы будете следовать наивному маршруту (масштабировать каждую фигуру, а затем масштабировать расстояние от фигуры до любой другой фигуры), результат будет неправильным.

Один из известных мне методов заключается в обработке расстояния междуцентр двух фигур как вектор "притягивающей" силы, имеющей фиксированное направление.Затем масштабируйте величину этих сил и найдите точки, которые снова приведут систему в равновесие.Математика должна быть где-то там.Я видел это так давно, что кажется, что это было в другой жизни.

0 голосов
/ 10 марта 2011

Код, который у вас есть, увеличивает каждую фигуру вокруг своего центра. Это означает, что нижние линии движутся вниз, а верхние - вверх. Вот почему они, кажется, двигаются вместе.

Чтобы этого не происходило, вы должны масштабировать фигуры вокруг точки на нижней границе (для верхней фигуры) и верхней границы (для нижней фигуры). Сделайте переменную "y" соответствующей границей.

В качестве альтернативного (и эквивалентного) подхода переведите каждую фигуру на соответствующую величину после ее увеличения.

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