📄 drawline.java
字号:
package line;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Graphics;
import java.awt.FlowLayout;
import javax.swing.JButton;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.Point;
public class DrawLine extends JFrame{
/**
*
*/
private static final long serialVersionUID = -5195355608331797606L;
private UCanvas canvas;
private Dimension size=new Dimension(400,400);
public DrawLine() {
super("绘制直线");
getContentPane().setLayout(new BorderLayout());
final JPanel panel = new JPanel();
final FlowLayout flowLayout = new FlowLayout();
flowLayout.setAlignment(FlowLayout.RIGHT);
panel.setLayout(flowLayout);
getContentPane().add(panel, BorderLayout.SOUTH);
final JButton ddaButton = new JButton();
ddaButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
canvas.setDDAType();
canvas.repaint();
}
});
ddaButton.setText("DDA");
panel.add(ddaButton);
final JButton bresenhamButton = new JButton();
bresenhamButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
canvas.setBresenhamType();
canvas.repaint();
}
});
bresenhamButton.setText("Bresenham");
panel.add(bresenhamButton);
final JPanel mainPanel = new JPanel();
mainPanel.setLayout(new BorderLayout());
getContentPane().add(mainPanel, BorderLayout.CENTER);
canvas=new UCanvas();
mainPanel.add(canvas);
this.setSize(size);
this.setLocation((int)((Toolkit.getDefaultToolkit().getScreenSize().width-size.width)/2),(int)((Toolkit.getDefaultToolkit().getScreenSize().height-size.height)/2));
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
class UCanvas extends Canvas{
/**
*
*/
private static final long serialVersionUID = 9214273591307628106L;
final public static int DDA_TYPE=0;
final public static int BRESENHAM_TYPE=1;
Point p1,p2;
private int type;
public UCanvas(){
this(0);
}
public UCanvas(int t){
type=t;
p1=new Point(30,30);
p2=new Point(100,100);
this.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e){
p1=new Point(e.getX(),e.getY());
UCanvas.this.getGraphics().drawRect(p1.x, p1.y, 1, 1);
}
});
this.addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(MouseEvent e) {
p2=new Point(e.getX(),e.getY());
repaint();
}
});
this.setBackground(Color.white);
}
public void paint(Graphics g){
if(type==DDA_TYPE){
g.drawString("DDA直线 拖动鼠标可以改变位置", 10, 20);
DDA(p1.x,p1.y,p2.x,p2.y,g);
}
else if(type==BRESENHAM_TYPE){
g.drawString("Bresenham直线 拖动鼠标可以改变位置", 10, 20);
Bresenham(p1.x,p1.y,p2.x,p2.y,g);
}
}
public void DDA(int x1,int y1,int x2,int y2,Graphics g){
float add_x,add_y,x,y;
int dx, dy,steps;
dx=x2-x1;
dy=y2-y1;
if(Math.abs(dx)>Math.abs(dy))
steps=Math.abs(dx);
else
steps=Math.abs(dy);
add_x=(float)dx/steps;
add_y=(float)dy/steps;
x=x1;y=y1;
g.drawRect((int)x, (int)y, 0, 0);
for(int i=1;i<steps;i++){
x+=add_x;
y+=add_y;
g.drawRect((int)(x+0.5), (int)(y+0.5), 0, 0);
}
}
public void Bresenham(int x1,int y1,int x2,int y2,Graphics g){
int dx,dy,x,y;
int p;
int const1,const2;
int inc;
int tmp;
dx=x2-x1;
dy=y2-y1;
if(dx*dy>=0)
inc=1;
else
inc=-1;
if(Math.abs(dx)>Math.abs(dy)){
if(dx<0){
tmp=x1;
x1=x2;
x2=tmp;
tmp=y1;
y1=y2;
y2=tmp;
dx=-dx;
dy=-dy;
}
const1=dy<<1;
p=const1-dx;
const2=(dy-dx)<<1;
x=x1;y=y1;
while(x<x2){
x++;
if(p<0)
p+=const1;
else{
y+=inc;
p+=const2;
}
g.drawRect(x, y, 0, 0);
}
}else{
if(dy<0){
tmp=x1;
x1=x2;
x2=tmp;
tmp=y1;
y1=y2;
y2=tmp;
dx=-dx;
dy=-dy;
}
const1=dx<<1;
p=dx-const1;
const2=(dx-dy)<<1;
x=x1;y=y1;
while(y<y2){
y++;
if(p<0)
p+=const1;
else{
x+=inc;
p+=const2;
}
g.drawRect(x, y, 0, 0);
}
}
}
public void setDDAType(){
type=0;
}
public void setBresenhamType(){
type=1;
}
}
public static void main(String args[]){
new DrawLine();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -