📄 painterpanel.java
字号:
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 + -