用Graphic2D画一个中国地图,用jpanel显示。相同的数据我用matlab画,图很好很正确。但是java出来之后有一部分是直线。点集已经有了(点坐标很大,基本在10^6左右),但是由于drawLine方法只能支持int型的坐标,不支持float坐标,所以缩放之后,精度不够造成图不正确。
所以请教一下有没有方法可以解决的。我自己有几个方案
1、先把图按照最大比例画出来,再把图缩小
2、或者有什么方法能叫它支持float型
3、有没有其他好用的jar包可以画图?不知道如何实现。

解决方案 »

  1.   

    看一下 java.awt.Shape 接口
      

  2.   

    你真的有看过JAVA 2D嘛/? 搞清楚再下结论也不迟,祝你好运!
    最少有三种高精度的方法绘制你的说的直线
    Line2D.Float(float X1, float Y1, float X2, float Y2)
    Line2D.Float(Point2D p1, Point2D p2)
    Path.createPath, 
    MoveTo, 
    Path.end
      

  3.   

    public void drawmap(Graphics g) throws FileNotFoundException, IOException{
      Graphics2D g2d=(Graphics2D) g;  
      //清屏
      g2d.clearRect(0, 0, WIDTH, HEIGHT);
      g2d.setColor(Color.white);
      g2d.fill3DRect(0, 0, WIDTH, HEIGHT,true);
      //画笔颜色
      g2d.setColor(Color.BLUE);
      g2d.setFont(new Font("隶书", Font.PLAIN, 45));
      g2d.drawString(title, 200, 30); 
      //站点
      g2d.setColor(Color.RED);    
      g2d.setFont(new Font("宋体", Font.PLAIN, 10));
      
      File f = new File("C:\\map.txt");
      InputStream input = new FileInputStream(f);
      BufferedReader b = new BufferedReader(new InputStreamReader(input));
      //StringBuffer buffer = new StringBuffer();
      String value = b.readLine();
      int k = 0;
      while(value != null){//如果行不为空
       
          //buffer.append(" "+value);
       //把该行转换为数组   
        String[] temp = value.toString().replaceFirst(" ","").split("\\s+");
        //int [] number = new int[temp.length];
       float[] number = new float[temp.length];
        for(int i=0;i<temp.length;i++){
            try{
             //number[i] = Integer.parseInt(temp[i]);
             number[i] = Float.parseFloat(temp[i]);
             //System.out.print(number[i]+" ");
            }catch(Exception e){
             System.out.println("文件中存在非数字字符!");
            }
        }
        //画图
        for(int j=1;j<number.length-2;)
         {
                                
    //                            Line2D.Float((number[j]/1000+3150)/rate,
    //                                        (number[j+1]/1000-1950)/rate, 
    //                                       (number[j+2]/1000+3150)/rate, 
    //                                        (number[j+1]/1000-1950)/rate);     g2d.drawLine((int)((number[j]/1000+3150)/rate),
                                            (int)((number[j+1]/1000-1950)/rate), 
                                            (int)((number[j+2]/1000+3150)/rate), 
                                            (int)((number[j+1]/1000-1950)/rate));
                                    j+=2;
         } 
       // System.out.println("\n");
       value = b.readLine();//读取下一行
       k++;
       if (k==100){
       break;
       }
      }    
        }我是把这个画直线的方法重构JPanel的paint()方法,然后用JPanel显示画好的地图。number是一个数组,里面是各个点的xyxyxy值。数组第一个数是点数,没什么用。所以读取的时候从number[1]开始。
    Line2D那个您能不能给我一个详细的例子?我直接用,他说缺少float类。刚刚接触java画图,不胜感激!
      

  4.   

    另外我还有一个问题,我看有人用mapx和java做的地理信息图。csdn有例子下载。但是我搜不到com.mapinfo 的包。不知道哪儿能下载。
    http://download.csdn.net/detail/climbingpig/1322662#comment
    这个地址。
      

  5.   

    我发现
    g2d.drawLine((int)((number[j]/1000+3150)/rate),
                                            (int)((number[j+1]/1000-1950)/rate), 
                                            (int)((number[j+2]/1000+3150)/rate), 
                                            (int)((number[j+1]/1000-1950)/rate));
    最后一句应该是j+3!啊。写错了