我有一个40*40的图[原图],用GC画在一个可以随意缩放的Canvas里面,当Canvas缩放时,重画这个图[修改图],
canvas.addPaintListener(new PaintListener() {
  public void paintControl(PaintEvent e) {
    int nWidth = canvas.getClientArea().width;
    int nHeight = canvas.getClientArea().height;
    e.gc.drawImage(image, 0, 0, imageData.width, imageData.height, 0, 0, nWidth,nHeight);
  }
}
当鼠标点到这个[修改图]中的一个点时,可以得到坐标,但是我想得到[原图]的坐标,有什么好的办法吗??我之前的做法是使用BigDecimal对象,[修改图]宽度/[原图]宽度,得到一个宽度的对比度,然后再根据鼠标当前坐标得到原图坐标,可是当图很小的时候,误差很大请个一点提示,不胜感激

解决方案 »

  1.   

    就像一个游戏地图
    地图大小  40*40 ,色深8,也就是说一个像素是一个坐标,当前鼠标所指向的坐标可以通过下面的方法得到
    public void mouseDown(MouseEvent e) {
      imageData.getPixel(e.x, e.x)
    }假如Canvas被拉大到  80*80 ,可以这样得到
    public void mouseDown(MouseEvent e) {
      //imageData是原图的图像数据,因为当前图像是原图的两倍,所以可以通过除2来得到原图对应坐标
      imageData.getPixel(e.x/2, e.x/2)
    }但是假如Canvas被拉大到  291*379,那如何得到原图对应坐标?我用BigDecimal设置16个小数点,仍然有2,3个像素的差距
      

  2.   

    巧了,我正好有这么一个算法 ^ ^不过只是针对成倍数缩放的,希望对你有参考价值 private int getRealValue( int scaledValue, int zoomRate )
    { if( zoomRate == 0 )
    return 0;
    if( zoomRate == 1 )
    {
    return scaledValue;
    }
    /*
     * For example: 
     * if the scaledValue is 8, zoomRate is 8, then the real value is ( 8 - 1 )/8 + 1 = 1 
     * if the scaledValue is 9, zoomRate is 8, then the real value is ( 9 - 1 )/8 + 1 = 2
     * if the scaledValue is 4, zoomRate is -4, then the real value is -( 4 * (-4) = 16
     */
    int realValue = ( zoomRate > 0 ) ? ( ( scaledValue - 1 ) / zoomRate + 1 ) : ( -( scaledValue * zoomRate ) );
    return realValue;
    }
      

  3.   

    3Q,3Q,3Q,3Q,3Q,3Q,3Q,3Q,3Q,3Q!
    太谢谢啦.找了好久!