【问题标题】:Draw a straight line with java's graphic class用java图形类画一条直线
【发布时间】:2017-03-01 01:24:13
【问题描述】:

我需要从两点画一条线,到目前为止我所做的是使用drawLine(x1,y1,x2,y2)。但是我想做的是画一条与(x1,y1)(x2,y2)这两点相交的线。

我不想只是在它们之间画一条线,这是我拥有的和我想做的图像:

【问题讨论】:

    标签: java


    【解决方案1】:

    你可以使用一些数学。得到你的线路的增加。你应该知道函数

    f(x) = mx + b。有了你已经得到的两个点,你可以计算框架边界的另外两个点,并在它们之间画一条线

    【讨论】:

    • 是的,没错,但如果我能找到一个已经存在的函数那就太好了..但是谢谢,如果我找不到任何其他解决方案,我会使用它 :)
    • 我刚刚发现了这个问题 ;) stackoverflow.com/questions/12286687/…
    【解决方案2】:

    您需要计算线条与图形上下文边界相交的坐标。

    如果你有 (x1,y1) 和 (x2,y2),计算 x_a 和 y_a 使得 (x_a,0) 和 (0,y_a) 位于线上。 如果 x_a = 0,则该行将从左边缘开始。如果 y_a = 0,则线将从上边缘开始。

    重复该行的底部/右侧坐标。

    【讨论】:

      【解决方案3】:

      布雷森汉姆线算法

      private int sign (int x) {
          return (x > 0) ? 1 : (x < 0) ? -1 : 0;  
      }
      
      public void drawBresenhamLine (int xstart, int ystart, int xend, int yend, Graphics g){
          int x, y, dx, dy, incx, incy, pdx, pdy, es, el, err;
      
          dx = xend - xstart;
          dy = yend - ystart;
      
          incx = sign(dx);
      
          incy = sign(dy);
      
      
          if (dx < 0) dx = -dx;
          if (dy < 0) dy = -dy;
      
          if (dx > dy){
              pdx = incx; pdy = 0;
              es = dy;    el = dx;
          } else {
              pdx = 0;    pdy = incy;
              es = dx;    el = dy;
          }
      
          x = xstart;
          y = ystart;
          err = el/2;
          g.drawLine (x, y, x, y);
      
          for (int t = 0; t < el; t++)//if I multiply el a line will be longer
          {
              err -= es;
              if (err < 0) {
                  err += el;
                  x += incx;
                  y += incy;
              } else {
                  x += pdx;
                  y += pdy;
              }
      
              g.drawLine (x, y, x, y);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2016-07-09
        • 1970-01-01
        • 1970-01-01
        • 2012-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多