⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 painterpanel.java

📁 直线dda算法,直线bresenham算法,圆的中点算法,圆的bresenham算法,椭圆重点算法的java演示
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
import java.awt.*; 
import java.awt.event.*; 

import javax.swing.*; 
import javax.swing.event.*; 

import java.lang.Math.*;
import java.math.BigDecimal;

public class PainterPanel extends JPanel implements MouseListener{ 
    int shape=-1; //图案类型 
    Point[] point=new Point[2]; //记录鼠标拖动的起始点和终点 
    Point curPoint = new Point(-1,-1);
    int drawing = 0; //0为未画图,1为定好起点
    int display = 0; //0时不输出,1时输出内容
    				 //在画完第二个点时,display = 1,输出完后,修改display = 0
    
    static int newZeroX = 500;
    static int newZeroY = 300;
    static int tranScale = 50;
    static int lowX = -10;
    static int highX = 10;
    static int lowY = -6;
    static int highY = 6;
    
    private double getNewX(Point old){
    	return ((old.getX() - newZeroX) / tranScale);
    }
    
    private double getNewY(Point old){
    	return ((old.getY() - newZeroY) / tranScale);
    }
    
    private Point getOldPoint(double x, double y){
    	return new Point((int)(x * tranScale + newZeroX), (int)(y * tranScale + newZeroY));
    }
    
    public String getCurPoint(){
    	return(curPoint.getX() + "," + curPoint.getY());
    }
    
    public PainterPanel(){ 
        super();    //调用父类构造函数         
        this.setBackground(Color.white); //设置背景颜色 
       point[0]=new Point(-1,-1); //初始化变量 
       point[1]=new Point(-1,-1); 
        addMouseListener(this); //增加鼠标事件 
        addMouseMotionListener(new MouseMotionListener(){
        	@Override
			public void mouseMoved(MouseEvent e) {
				// TODO Auto-generated method stub
        		curPoint.setLocation(e.getX(), e.getY());
        		if (drawing == 1){
        	  		point[1] = curPoint;
        	  	}
    	  		repaint();
			}
			@Override
			public void mouseDragged(MouseEvent e) {
				// TODO Auto-generated method stub	
			}   	
        }       
        );
    }      

    public void mouseReleased(MouseEvent e){ //鼠标释放事件 
    } 
    public void mouseEntered(MouseEvent e){
  
    } 
    public void mouseExited(MouseEvent e){} 
    public void mouseClicked(MouseEvent e){
    	if(shape != -1){
	    	if (drawing == 0){//第一个点
	    		drawing = 1;
	    		point[0] = new Point(e.getX(), e.getY());
	    		PainterOutput.ResultClear();
	    	}
	    	else{
	    		drawing = 0;
	    		display = 1;
	    		point[1] = new Point(e.getX(), e.getY());
	    		repaint();
	    	}
    	}
    } 
    public void mousePressed(MouseEvent e){  //鼠标按下时事件 
    }    

     
    public void paint(Graphics gg){     
    	Graphics2D g = (Graphics2D)gg;
//    	g.setStroke(new BasicStroke(5.0F));
    	super.paint(g);
        displayAxe(g);
        showCoordinate(g);
        int radius = 0;
        switch (shape){  //根据shape值绘制图形 
            case 0: //直线DDA算法
                g.drawLine(point[0].x,point[0].y,point[1].x,point[1].y); //绘线
                DDALine(g);
                break;
            case 1: //直线Bresenham算法
            	g.drawLine(point[0].x,point[0].y,point[1].x,point[1].y); //绘线
            	BresenhamLine(g);
            	break;
            case 2: //圆的中点算法
            	radius = (int)Math.sqrt((Math.pow(point[1].getX() - point[0].getX(), 2) + 
            				 Math.pow(point[1].getY() - point[0].getY(), 2) ) );
            	drawCircle(g, point[0], radius);
            	MidPointCircle(g);
            	break;
            case 3: //圆的Bresenham算法
            	radius = (int)Math.sqrt((Math.pow(point[1].getX() - point[0].getX(), 2) + 
       				 Math.pow(point[1].getY() - point[0].getY(), 2) ) );
            	drawCircle(g, point[0], radius);
            	BresenhamCircle(g);
            	break;
            case 4: //椭圆的中点算法
                int width=point[1].x-point[0].x; 
                int height=point[1].y-point[0].y;
                int startx = point[0].x, starty = point[0].y;
                if(width < 0){
                	width = - width;
                	startx = point[0].x - width;
                }
                if(height < 0){
                	height = - height;
                	starty = point[0].y - height;
                }
                g.drawOval(startx,starty,width,height); //绘椭圆 
                MidPointEllipse(g, startx, starty, width, height);
                break; 
/*            case 1: 
                int width=point[1].x-point[0].x; 
                int height=point[1].y-point[0].y; 
                g.drawOval(point[0].x,point[0].y,width,height); //绘椭圆 
                break; 
            case 2: 
                width=point[1].x-point[0].x; 
                height=point[1].y-point[0].y; 
                g.drawRect(point[0].x,point[0].y,width,height);  //绘矩形 
                break;     */
        }         
    } 
     
    public void showCoordinate(Graphics g){
        g.drawString
        ("坐标: " + getNewX(curPoint) + "," + getNewY(curPoint),
        		0, PainterDemo.getWindowHeight() - 100);
    }
    
    public void displayAxe(Graphics gg){
    	Graphics2D g = (Graphics2D)gg;
    	g.setStroke(new BasicStroke(2.0F));
    	for(int i = lowX; i <= highX; i++)
    		for(int j = lowY; j <= highY; j++){
    			Point temp = getOldPoint(i, j);
    			drawPixel(gg, temp, 4.0F);
    		}
    	g.drawLine(0, newZeroY, newZeroX * 2, newZeroY);
    	g.drawLine(newZeroX, 0, newZeroX, newZeroY * 2);
    }
    
    public void drawPixel(Graphics gg, Point p, float value){
    	Graphics2D g = (Graphics2D)gg;
    	Stroke old = g.getStroke();
    	g.setStroke(new BasicStroke(value));
    	g.drawLine((int)p.getX(), (int)p.getY(), (int)p.getX(), (int)p.getY());
    	g.setStroke(old);
    }
    
    public void drawCircle(Graphics g, Point p, int radius){
    	g.drawOval(p.x - radius, p.y - radius, radius * 2, radius * 2);
    }
    
    public void DDALine(Graphics g){
    	int n, ix = 0, iy = 0, idx = 0, idy = 0;
    	int Flag;
    	int Length;
    	double x = 0, y = 0, dx, dy;
    	
    	double xe, ye, xs, ys;
    	xs = this.getNewX(point[0]);
    	ys = this.getNewY(point[0]);
    	xe = this.getNewX(point[1]);
    	ye = this.getNewY(point[1]);
    	
    	dx = xe - xs;
    	dy = ye - ys;
    	
    	if(display == 1) PainterOutput.ResultOut("直线DDA算法:");
    	if(Math.abs(dy) <= Math.abs(dx)){
    		Length = (int) Math.abs(getRound(xe) - getRound(xs));
    		Flag = 1;
    		idx = (int)Math.signum(dx);
    		ix = (int)getRound(xs);
    		y = ys + dy / dx * ((double)(ix) - xs);
    		dy = dy / Math.abs(dx);
    	}
    	else{
    		Length = (int) Math.abs(getRound(ye) - getRound(ys));
    		Flag = 0;
    		idy = (int)Math.signum(dy);
    		iy = (int)getRound(ys);
    		x = xs + dx / dy * ((double)(iy) - ys);
    		dx = dx / Math.abs(dy);
    	}
    	if(Flag == 1){
    		for(n = 0; n <= Length; n++){
    			if(display == 1) PainterOutput.ResultOut(ix + "," + -getRound(y));
    			Point temp = getOldPoint(ix, getRound(y));
    			drawPixel(g, temp, 8.0F);
    			ix += idx;
    			y += dy;
    		}
    	}
    	else{
    		for(n = 0; n <= Length; n++){
    			if(display == 1) PainterOutput.ResultOut(getRound(x) + "," + -iy);
    			Point temp = getOldPoint(getRound(x), iy);
    			drawPixel(g, temp, 8.0F);
    			iy += idy;
    			x += dx;
    		}
    	}
    	if(display == 1){
    		PainterOutput.ResultOut("直线DDA算法结束");
    		display = 0;
    	}
    }
    
    public void BresenhamLine(Graphics g){
    	int n, ix = 0, iy = 0, idx = 0, idy = 0, sx, sy;
    	int Flag;
    	int Length;
    	double x = 0, y = 0, dx, dy, NError;
    	
    	double xe, ye, xs, ys;
    	xs = this.getNewX(point[0]);
    	ys = this.getNewY(point[0]);
    	xe = this.getNewX(point[1]);
    	ye = this.getNewY(point[1]);
    	
    	x = getRound(xs);
    	y = getRound(ys);
    	dx = getRound(xe - xs);
    	dy = getRound(ye - ys);
    	sx = (int) Math.signum(xe - xs);
    	sy = (int) Math.signum(ye - ys);
    	
    	if(display == 1) PainterOutput.ResultOut("直线Bresenham算法:");
    	if(dy > dx){
    		//swap
    		double tempdb = dx;
    		dx = dy;
    		dy = tempdb;
    		Flag = 1;
    	}
    	else{
    		Flag = 0;
    	}
    	NError = 2 * dy - dx;
    	for(n = 1; n <= dx; n++){
    		if(display == 1) PainterOutput.ResultOut(x + ", " + -y);
    		Point temp = getOldPoint(x, y);
    		drawPixel(g, temp, 8.0F);
    		if(NError >= 0){

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -