如何缩放多个形状并保持相同的比例

时间:2011-03-10 20:10:42

标签: java 2d shape

我有两种形状,我想进行缩放,我使用以下代码

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 个答案:

答案 0 :(得分:2)

像我在评论中说的那样,因为你在各自的中心周围缩放形状,所以中心显然不会移动。如果您希望统一缩放所有内容,请不要翻译任何内容:

  1. 找到原始视口的中心点。这是你必须缩小的点。
  2. 通过(sx,sy)扩展所有内容。
  3. 通过(origcentrex *(1-sx),origcentrey *(1-sy))翻译所有内容,将中心点移回视口的中心。
  4. 计算这些转换的最佳方法是抓取铅笔和纸张,绘制坐标系并按照纸张上的变换进行操作。

答案 1 :(得分:0)

您的代码围绕其中心缩放每个形状。这意味着下面的线向下移动,上面的线向上移动。这就是他们似乎一起搬家的原因。

为了不发生这种情况,您必须缩放下边界(上部形状)和上部边界(下部形状)上的点的形状。使“y”变量成为适当的边界。

作为替代(和等效)方法,在缩放后将每个形状转换为适当的数量。

答案 2 :(得分:0)

如果您想要真正的缩放,这意味着缩放形状和它们之间的空白区域。如果你按照天真的路线(缩放每个形状,然后缩放从形状到其他每个形状的距离),结果就不对了。

我所知道的一种方法是将两个形状的中心之间的距离视为具有固定方向的“吸引”力的矢量。然后缩放这些力量的大小,找到使他的系统再次平衡的点。在某个地方,数学应该在那里。我很久以前就看到它似乎在另一个生命中。

答案 3 :(得分:0)

谢谢大家的答案,我找到了一个适合我的解决方案

    while(iter.hasNext()){
        shape = (Shape)iter.next();                     
        AffineTransform t = new AffineTransform();
        t.scale(sx,sy); 
        t.concatenate(shape.getAffineTransform());
        shape.setAffineTransform(t); 
    }
}