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

📄 painterpanel.java

📁 直线dda算法,直线bresenham算法,圆的中点算法,圆的bresenham算法,椭圆重点算法的java演示
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
    			if(Flag == 1)
    				x = x + sx;
    			else y = y + sy;
    			NError = NError - 2 * dx;
    		}
    		if (Flag == 1)
    			y = y + sy;
    		else x = x + sx;
    		NError = NError + 2 * dy;
    	}
    	if(display == 1){
    		PainterOutput.ResultOut("直线Bresenham算法结束");
    		display = 0;
    	}
    }
    
    public void MidPointCircle(Graphics g){
    	int radius = (int)Math.sqrt((Math.pow(point[1].getX() - point[0].getX(), 2) + 
				 Math.pow(point[1].getY() - point[0].getY(), 2) ) );
    	radius = radius / tranScale;
    	if(display == 1) PainterOutput.ResultOut("圆的中点算法:");
    	if(display == 1) PainterOutput.ResultOut("");
    	int x = 0;
    	int y = radius;
    	int d = 1 - radius;
    	int dt = 3;
    	int db = - 2 * radius + 5;
    	while(y>=x){
        	if(display == 1) PainterOutput.ResultOut("以点(" + x + "," + y + ")生成");
    		drawCirclePoint(g, x, y);
    		if(d<0){
    			d += dt;
    			dt += 2;
    			db += 2;
    		}
    		else{
    			d += db;
    			dt += 2;
    			db += 4;
    			y --;
    		}
    		x ++;
    	}
    	if(display == 1){
    		PainterOutput.ResultOut("圆的中点算法结束");
    		display = 0;
    	}
    }
    
    public void BresenhamCircle(Graphics g){
    	int radius = (int)Math.sqrt((Math.pow(point[1].getX() - point[0].getX(), 2) + 
				 Math.pow(point[1].getY() - point[0].getY(), 2) ) );
    	radius = radius / tranScale;
    	if(display == 1) PainterOutput.ResultOut("圆的Bresenham算法:");
    	int x = 0;
    	int y = radius;
    	int d = 3 - 2 * radius;
    	while(x<=y){
        	if(display == 1) PainterOutput.ResultOut("以点(" + x + "," + y + ")生成");
    		drawCirclePoint(g, x, y);
    		if(d<=0)
    			d += 4 * x + 6;
    		else{
    			d += 4 * (x - y) + 10;
    			y = y - 1;
    		}
    		x = x + 1;
    	}
    	if(display == 1){
    		PainterOutput.ResultOut("圆的Bresenham算法结束");
    		display = 0;
    	}
    }
    
    public void MidPointEllipse(Graphics g, int px, int py, int width, int height){
    	int a = (int) (getRound((double)width / tranScale) / 2);
    	int b = (int) (getRound((double)height / tranScale) / 2);
    	int x = 0;
    	int y = b;
    	if(display == 1) PainterOutput.ResultOut("椭圆的中点算法:");
    	double d = b * b - a * a * (b - 0.25);
    	if(display == 1) PainterOutput.ResultOut("以首点(" + x + "," + y + ")生成");
    	drawEcllipsePoint(g, x, y);
    	while(a * a * (y - 0.5) > b * b * (x + 1)){
    		if(d<0)
    			d += b * b * (2 * x + 3);
    		else{
    			d += b * b * (2 * x + 3) + a * a * ( -2 * y + 2);
    			y --;
    		}
    		x++;
    		if(display == 1) PainterOutput.ResultOut("以点(" + x + "," + y + ")生成");
    		drawEcllipsePoint(g, x, y);
    	}
    	d = b * b * (x + 0.5) * (x + 0.5) + a * a * (y - 1) * (y - 1) - a * a * b * b;
       	while(y>=0){
    		if(d<0){
    			d += b * b * (2 * x + 2) + a * a * (-2 * y + 3);
       			x ++;
    		}
    		else
    			d += a * a * (-2 * y + 3);
    		y --;
    		if(display == 1) PainterOutput.ResultOut("以点(" + x + "," + y + ")生成");
    		drawEcllipsePoint(g, x, y);
    	}
    	if(display == 1){
    		PainterOutput.ResultOut("椭圆的中点算法结束");
    		display = 0;
    	}
    }
    
    public void drawEcllipsePoint(Graphics g, int x, int y){
    	Point centre = new Point((point[0].x + point[1].x)/2, (point[0].y + point[1].y)/2);
    	int shiftX = ((int) getRound(getNewX(centre))) * tranScale;
    	int shiftY = ((int) getRound(getNewY(centre))) * tranScale;
    	int outputx, outputy;
    	
    	if(display == 1){
    		outputx = x + getRound(getNewX(centre));
    		outputy = y - getRound(getNewY(centre));
    		PainterOutput.ResultOut(outputx + "," + outputy);
    	}
    	Point temp = getOldPoint(x, y);
    	temp.x += shiftX;
    	temp.y += shiftY;
    	drawPixel(g, temp, 8.0F);
    	
    	if(display == 1){
    		outputx = -x + getRound(getNewX(centre));
    		outputy = y - getRound(getNewY(centre));
    		PainterOutput.ResultOut(outputx + "," + outputy);
    	}
    	temp = getOldPoint(-x, y);
    	temp.x += shiftX;
    	temp.y += shiftY;
    	drawPixel(g, temp, 8.0F);
    	
    	if(display == 1){
    		outputx = x + getRound(getNewX(centre));
    		outputy = -y - getRound(getNewY(centre));
    		PainterOutput.ResultOut(outputx + "," + outputy);
    	}
    	temp = getOldPoint(x, -y);
    	temp.x += shiftX;
    	temp.y += shiftY;
    	drawPixel(g, temp, 8.0F);
    	
    	if(display == 1){
    		outputx = -x + getRound(getNewX(centre));
    		outputy = -y - getRound(getNewY(centre));
    		PainterOutput.ResultOut(outputx + "," + outputy);
    	}
    	temp = getOldPoint(-x, -y);
    	temp.x += shiftX;
    	temp.y += shiftY;
    	drawPixel(g, temp, 8.0F);
    }
    
    public void drawCirclePoint(Graphics g, int x, int y){
    	int shiftX = ((int) getRound(getNewX(point[0]))) * tranScale;
    	int shiftY = ((int) getRound(getNewY(point[0]))) * tranScale;
     	int outputx, outputy;
    	if(display == 1){
    		outputx = x + getRound(getNewX(point[0]));
    		outputy = y - getRound(getNewY(point[0]));
    		PainterOutput.ResultOut(outputx + "," + outputy);
    	}
    	Point temp = getOldPoint(x, y);
    	temp.x += shiftX;
    	temp.y += shiftY;
		drawPixel(g, temp, 8.0F);
		
    	if(display == 1){
    		outputx = y + getRound(getNewX(point[0]));
    		outputy = x - getRound(getNewY(point[0]));
    		PainterOutput.ResultOut(outputx + "," + outputy);
    	}
	  	temp = getOldPoint(y, x);
    	temp.x += shiftX;
    	temp.y += shiftY;
		drawPixel(g, temp, 8.0F);
		
    	if(display == 1){
    		outputx = y + getRound(getNewX(point[0]));
    		outputy = -x - getRound(getNewY(point[0]));
    		PainterOutput.ResultOut(outputx + "," + outputy);
    	}
		temp = getOldPoint(y, -x);
    	temp.x += shiftX;
    	temp.y += shiftY;
		drawPixel(g, temp, 8.0F);
		
    	if(display == 1){
    		outputx = x + getRound(getNewX(point[0]));
    		outputy = -y - getRound(getNewY(point[0]));
    		PainterOutput.ResultOut(outputx + "," + outputy);
    	}
		temp = getOldPoint(x, -y);
    	temp.x += shiftX;
    	temp.y += shiftY;
		drawPixel(g, temp, 8.0F);
		
    	if(display == 1){
    		outputx = -x + getRound(getNewX(point[0]));
    		outputy = -y - getRound(getNewY(point[0]));
    		PainterOutput.ResultOut(outputx + "," + outputy);
    	}
		temp = getOldPoint(-x, -y);
    	temp.x += shiftX;
    	temp.y += shiftY;
		drawPixel(g, temp, 8.0F);
		
    	if(display == 1){
    		outputx = -y + getRound(getNewX(point[0]));
    		outputy = -x - getRound(getNewY(point[0]));
    		PainterOutput.ResultOut(outputx + "," + outputy);
    	}
		temp = getOldPoint(-y, -x);
    	temp.x += shiftX;
    	temp.y += shiftY;
		drawPixel(g, temp, 8.0F);
		
    	if(display == 1){
    		outputx = -y + getRound(getNewX(point[0]));
    		outputy = x - getRound(getNewY(point[0]));
    		PainterOutput.ResultOut(outputx + "," + outputy);
    	}
		temp = getOldPoint(-y, x);
    	temp.x += shiftX;
    	temp.y += shiftY;
		drawPixel(g, temp, 8.0F);
		
    	if(display == 1){
    		outputx = -x + getRound(getNewX(point[0]));
    		outputy = y - getRound(getNewY(point[0]));
    		PainterOutput.ResultOut(outputx + "," + outputy);
    	}
		temp = getOldPoint(-x, y);
    	temp.x += shiftX;
    	temp.y += shiftY;
		drawPixel(g, temp, 8.0F);
    }
    

    public int getRound(double dSource){
	    int iRound;
	    //BigDecimal的构造函数参数类型是double
	    BigDecimal deSource = new BigDecimal(dSource);
	    //deSource.setScale(0,BigDecimal.ROUND_HALF_UP) 返回值类型 BigDecimal
	    //intValue() 方法将BigDecimal转化为int
	    iRound= deSource.setScale(0,BigDecimal.ROUND_HALF_UP).intValue();
	    return iRound;
    } 
       
    public void drawShape(int shape){ 
        this.shape=shape;
        point[0].x = -1;
        point[0].y = -1;
        point[1].x = -1;
        point[1].y = -1;
        if(shape == 1)
        	JOptionPane.showMessageDialog(null,
        			"实现的Bresenham算法中, 终点需要在起点的右下方", "注意", JOptionPane.INFORMATION_MESSAGE);
    } 
} 

⌨️ 快捷键说明

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