0

我有两个形状,我想做一个缩放,我使用下面的代码

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);
    }

形状被放大,但它们之间的距离变小了 缩放前 缩放后

我想从这两个形状中制作一个复合形状,然后对其进行缩放。还有其他方法可以保持比例吗?谢谢

4

4 回答 4

2

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

  1. 找到原始视口的中心点。这是您必须缩小的点。
  2. 将所有内容放大 (sx,sy)。
  3. 通过 ( origcentrex*(1-sx), origcentrey*(1-sy)) 平移所有内容以将中心点移回视口的中心。

弄清楚这些变换的最好方法是拿起铅笔和纸,画一个坐标系,然后在纸上进行变换。

于 2011-03-10T20:41:44.990 回答
0

您拥有的代码围绕其中心缩放每个形状。这意味着下部线向下移动,而上部线向上移动。这就是为什么他们似乎一起移动。

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

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

于 2011-03-10T20:31:04.530 回答
0

如果你想要一个真正的缩放,这意味着缩放形状和它们之间的空白。如果您遵循幼稚的路线(缩放每个形状,然后缩放从一个形状到每个其他形状的距离),结果将是不正确的。

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

于 2011-03-10T21:30:02.477 回答
0

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

    while(iter.hasNext()){
        shape = (Shape)iter.next();                     
        AffineTransform t = new AffineTransform();
        t.scale(sx,sy); 
        t.concatenate(shape.getAffineTransform());
        shape.setAffineTransform(t); 
    }
}
于 2011-03-11T00:27:41.587 回答