Search code examples
javamatrixtransformationcoordinate-systemsaffinetransform

Shape modified by AffineTransform is rendering reverse from expectations


I have a few geometric shapes which are in different co-ordinates that I want to be brought to the center of the panel. I have written a function called "Set Scale," which is bringing it in to center, but the shape is reversed.

My Code:

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

Solution

  • i Tried this... it Works:-)

    Thanks for the help:-)

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