Java图形设计中,利用Bresenham算法实现直线线型,线宽的控制(NO 2D GRAPHICS)

原创 2002年04月29日 09:20:00

Java 2D Graphics提供了强大的画线功能,可以控制线型,线宽,刷子的形状等,但在JDK1.2以前,没有提供这样一个功能,为了保持与旧版JDK的相容,实现一个可控制线型,线宽的画直线方法还是有必要的,下面是我写的一个静态方法,可直接用来画各种类型的直线:

/**
 * Bresenham Line Algorithm
 * @author Turbo Chen
 * @version 1.0 copyright 2001
 * @email turbochen@163.com
 * @param dashedMask 设置线型的虚线的间隔,为0则画实线。
 * @param lineWidth 设置线宽。
 * @param x1 
 * @param y1
 * @param x2
 * @param y2
*/

public static void bresenhamLine(java.awt.Graphics g, int dashedMask, int lineWidth, int x1, int y1, int x2, int y2)
    {
        int  x, y;
        int  dx, dy;
        int  incx, incy;
        int  balance;
        int i=0;
        if (x2 >= x1)
        {
            dx = x2 - x1;
            incx = 1;
        }
        else
        {
            dx = x1 - x2;
            incx = -1;
        }

        if (y2 >= y1)
        {
            dy = y2 - y1;
            incy = 1;
        }
        else
        {
            dy = y1 - y2;
            incy = -1;
        }

        x = x1;
        y = y1;

        if (dx >= dy)
        {
            dy <<= 1;
            balance = dy - dx;
            dx <<= 1;

            while (x != x2)
            {
                if ( (i & dashedMask)==0 )
                g.fillOval(x, y,lineWidth,lineWidth);
                if (balance >= 0)
                {
                    y += incy;
                    balance -= dx;
                }
                balance += dy;
                x += incx;
                i ++;
            }
            if ( (i & dashedMask)==0 )
                g.fillOval(x, y,lineWidth,lineWidth);
        }
        else
        {
            dx <<= 1;
            balance = dx - dy;
            dy <<= 1;

            while (y != y2)
            {
                if ( (i & dashedMask)==0 )
                g.fillOval(x, y,lineWidth,lineWidth);
                if (balance >= 0)
                {
                    x += incx;
                    balance -= dy;
                }
                balance += dx;
                y += incy;
                i ++;
            }
            if ( (i & dashedMask)==0 )
                g.fillOval(x, y,lineWidth,lineWidth);
        }
    }

大家注意看程序中的g.fillOval()方法,也就是说我是用画圆点的方式来画线的,即刷子的样式是圆头型,你可以很容易的改变成g.fillRect()等其它方式,来实现刷子样式的设置.

 

计算机图形学考试-绘制一条任意线型和线宽的直线。

编程绘制一条任意线型和线宽的直线。(线型、线宽可由用户指定) 首先我们得了解一下线型和线宽的意思。 线型包括实线、虚线和点线等。线型的显示在扫描转换算法中可通过像素段的方法实现,即对各种虚线和点线,画...
  • Fitz1318
  • Fitz1318
  • 2016年12月28日 22:26
  • 1799

以DDA算法为例实现线宽函数及虚线

#include#include#include #define ROUND(a) (int)(a + 0.5)void setPixel(GLint x, GLint y) // 画点函数{ glB...
  • nanhaizhixin
  • nanhaizhixin
  • 2011年05月04日 15:32
  • 2005

画线算法 - Bresenham原理及Java实现

布氏(Bresenham)是绘制线段最有效率的算法之一,该算法仅仅使用整型加减及字节位操作运算 (省去了用于计算斜率的除法运算),因而计算效率非常高。其实现也非常的简单明了。本文以Java代码为例,一...
  • jinbing_peng
  • jinbing_peng
  • 2015年04月01日 03:22
  • 2179

java采用Bresenham算法画直线

  • 2011年11月12日 23:19
  • 2KB
  • 下载

在java中实现图形学中的直线算法

有同学向我要在java中实现图形学中的椭圆算法,画直线的算法的程序,在此就献丑了,把上大学时用java写的源代码给先学者做个参考,下面是实现直线的算法//author computer np/*tes...
  • niuping1982
  • niuping1982
  • 2005年11月03日 20:51
  • 1235

java三种画线算法

  • 2014年04月12日 23:31
  • 5KB
  • 下载

java实现Bresenham算法画圆

  • 2011年11月12日 23:18
  • 2KB
  • 下载

Bresenham算法

来自: 上回说到, 在看一本书《Windows游戏编程大师技巧》 (Tricks of Windows Game Programming Gurus). 这次继续书里的内容: 直线光...
  • jiangh33
  • jiangh33
  • 2014年03月15日 12:08
  • 1455

Java图形设计中,利用Bresenham算法实现直线线型,线宽的控制(NO 2D GRAPHICS)

Java 2D Graphics提供了强大的画线功能,可以控制线型,线宽,刷子的形状等,但在JDK1.2以前,没有提供这样一个功能,为了保持与旧版JDK的相容,实现一个可控制线型,线宽的画直线方法还是...
  • turbochen
  • turbochen
  • 2002年04月29日 09:20
  • 3259

JAVA实现 中点画线算法、Bresenham画线算法

  • 2012年04月22日 08:48
  • 294KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java图形设计中,利用Bresenham算法实现直线线型,线宽的控制(NO 2D GRAPHICS)
举报原因:
原因补充:

(最多只允许输入30个字)