AffineTransform修改的形状与预期相反

时间:2013-03-06 04:30:13

标签: java matrix transformation coordinate-systems affinetransform

我有几个不同坐标的几何形状,我想把它们带到面板的中心。我写了一个名为“Set Scale”的函数,它将它带到中心,但形状相反。

我的代码:

private void SetScale1(Graphics2D gr, int gr_width , int gr_height, double left_x , double right_x , double top_y , double bottom_y ){


    Rectangle2D drawing_rect = new Rectangle2D.Double(left_x, top_y, right_x - left_x, bottom_y - top_y);
 double drawing_cx=( left_x+ right_x) / 2;
 double drawing_cy =(top_y + bottom_y) / 2;

AffineTransform at = AffineTransform.getTranslateInstance(-1 * drawing_cx, -1 * drawing_cy);
//gr.translate(-1 * drawing_cx, -1 * drawing_cy);
//gr.TranslateTransform(0, 0)
double scale_x=gr_width / drawing_rect.getWidth();
double scale_y=gr_height / Math.abs(drawing_rect.getHeight());

scale_x = Math.min(scale_x, scale_y);
scale_y = scale_x;
scale_x = Math.abs(scale_x);
// at = AffineTransform.getScaleInstance(scale_x, -1 * scale_y);
//gr.transform(tt);
gr.transform(at);

//' Translate to center over the drawing area.
double graphics_cx =gr_width / 2;
double graphics_cy = gr_height / 2;
gr.translate(graphics_cx, graphics_cy);
}

2 个答案:

答案 0 :(得分:0)

根据给出的描述,我建议你看一下转换矩阵:

AffineTransform at = AffineTransform.getTranslateInstance(-1 * drawing_cx, -1 * drawing_cy);

您确定您的tx和ty参数是否正确?以下是getTranslationInstance返回的矩阵:

[   1    0    tx  ]
[   0    1    ty  ]
[   0    0    1   ]

你在getTranslationInstance的参数中设置的-1值似乎对我有误......除非我错过了什么,否则我没有看到任何理由为什么它们应该是否定的。负值应该mirror the result,这可能就是你看到逆转的原因。尝试更改它们(它们将分别更改上面矩阵中的tx和ty字段)并告诉我们它是否有帮助。

答案 1 :(得分:0)

我试过这个......它有效: - )

感谢您的帮助: - )

Rectangle2D drawing_rect = new Rectangle2D.Double(left_x,top_y,right_x - left_x,bottom_y - top_y);       drawing_cx =(left_x + right_x)/ 2;       drawing_cy =(top_y + bottom_y)/ 2;

 at= AffineTransform.getTranslateInstance( -1* drawing_cx,  -1*drawing_cy);
//gr.translate(-1 * drawing_cx, -1 * drawing_cy);
//gr.TranslateTransform(0, 0)
double scale_x=gr_width / drawing_rect.getWidth();
double scale_y=gr_height / Math.abs(drawing_rect.getHeight());

scale_x = Math.min(scale_x, scale_y);
scale_y = scale_x;
scale_x = Math.abs(scale_x);
// at = AffineTransform.getScaleInstance(scale_x, -1 * scale_y);

gr.scale(Math.round(scale_x), Math.round( scale_y));
//gr.scale(1.2, 1.2);
//gr.transform(tt);
gr.transform(at);

//' Translate to center over the drawing area.
 graphics_cx =gr_width / 2;
 graphics_cy = gr_height / 2;
gr.translate(graphics_cx, graphics_cy);