使用Java实现两点间的直线绘制简单,但是我想取得两点间这个直线所经历的坐标点,不知道该如何获取,求算法,谢谢各位高手了啊

解决方案 »

  1.   


    float xieLv = (endY-beginY) * 1.0 / (endX-beginX);
    for(int i = befinX; i < endX; i++) {
      int x = i;
      float y = xieLv * (x - beginX) + beginY;
    }
    这是一个算法,你自己调整一下,需要处理四舍五入之类的问题。也不保证代码正确,这里给你写个大概意思。
      

  2.   

    是求屏幕上的像素坐标,还是自己做坐标模拟?
    如果是Swing中,或者有现成的图形界面的框架,那直线的上所有的坐标应该都不难找到。
    就算是自己做坐标来计算,我觉得也不困难。x,y的差值算出来设为(a,b),然后根据相似三角形来推算直线上每点的坐标。无论差值怎么变,a/b的值肯定是不变的。
    困难的是,如果这个直线非常接近水品,那么斜线将出现锯齿状。这个时候看的坐标,就要好好考虑下怎么算了
      

  3.   

    如果Swing中有这样的方法也可以啊 只要能实现getXY(int startX,int startY,int endX,int endY)这样一个给出两点 就能得到两点间直线的所有坐标点(x,y)算法就可以。但是我找Swing中也没找到现成的方法啊
      

  4.   

        BufferedImage img = new BufferedImage(1000, 800, BufferedImage.TYPE_INT_ARGB);
        Graphics g = img.getGraphics();
        Color color = Color.BLACK;
        g.setColor(color);
        g.drawLine(20, 50, 300, 600);
        int[] rgbArray = new int[img.getWidth()];
        List<Point> list = new ArrayList<Point>();
        for (int y = 0; y < img.getHeight(); y++) {
          img.getRGB(0, y, img.getWidth(), 1, rgbArray, 0, img.getWidth());
          for (int x = 0; x < rgbArray.length; x++) {
            if (rgbArray[x] == color.getRGB()) {
              list.add(new Point(x, y));
            }
          }
        }
        System.out.println(list);
      

  5.   

    谢谢各位了,尤其谢谢13楼shine333,原来我也想了两种思路 一个是找一个算法算出坐标点,还有就是你的这个思路,通过分析像素点来提取。第二个思路还没开始想 呵呵,看来如果真找不到算法思路的话,就只能分析像素点了。谢谢您的代码
      

  6.   

    啊 是么,麻烦shine333了 期待中...哈
      

  7.   

        int x1 = 20, y1 = 50, x2 = 300, y2 = 600;
        List<Point> list = new ArrayList<Point>();
        if (x1 == x2) {
          // Tangent = NaN
          int from = Math.min(y1, y2);
          int to = Math.max(y1, y2);
          for (int y = from; y <= to; y++) {
            list.add(new Point(x1, y));
          }
        } else {
          double slope = ((double) (y2 - y1)) / ((double) (x2 - x1));
          int step = (x2 > x1) ? 1 : -1;
          for (int x = x1; x != x2; x += step) {
            int y = (int)((x - x1) * slope + y1);
            list.add(new Point(x, y));
          }
        }
        System.out.println(list);两者的区别,在于画的时候会渲染,导致结果出现了同一个x有两个不同的y。对此,我试试看改变渲染的方式,关闭抗锯齿,但似乎没效果。
        Graphics2D g2d = (Graphics2D) g;
        // 关闭抗锯齿
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
      

  8.   

    shine333 太谢谢了,高手啊 哈 我再试试啊,分肯定要给您了哈,有问题再请教你啊 
      

  9.   

    有的时候好像有断点啊 int x1 = 21;
    int y1 = 91;
    int x2 = 2;
    int y2 = 9;