📄 drawcircle.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 DrawCircle extends JFrame{
private UCanvas canvas;
private Dimension size=new Dimension(400,400);
public DrawCircle() {
super("绘制圆");
getContentPane().setLayout(new BorderLayout());
final JPanel mainPanel = new JPanel();
mainPanel.setLayout(new BorderLayout());
getContentPane().add(mainPanel, BorderLayout.CENTER);
canvas=new UCanvas(UCanvas.BRESENHAM_TYPE);
mainPanel.add(canvas);
final JPanel panel = new JPanel();
final FlowLayout flowLayout = new FlowLayout();
flowLayout.setAlignment(FlowLayout.RIGHT);
panel.setLayout(flowLayout);
mainPanel.add(panel, BorderLayout.SOUTH);
final JButton button = new JButton();
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
canvas.setAddType();
canvas.repaint();
}
});
button.setText("逐点比较插补");
panel.add(button);
final JButton breaButton = new JButton();
breaButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
canvas.setBresenhamType();
canvas.repaint();
}
});
breaButton.setText("Bresenham");
panel.add(breaButton);
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{
final public static int DDA_TYPE=0;
final public static int BRESENHAM_TYPE=1;
Point p1;
int r;
int type;
public UCanvas(){
this(0);
}
public UCanvas(int t){
type=t;
p1=new Point(150,150);
r=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) {
r=Math.abs(e.getX()-p1.x);
repaint();
}
});
this.setBackground(Color.white);
}
public void paint(Graphics g){
if(type==BRESENHAM_TYPE){
g.drawString("Bresenham圆 拖动鼠标可以改变位置", 10, 20);
bresenhamCircle(p1.x,p1.y,r,g);
} else if(type==DDA_TYPE){
g.drawString("逐点比较插补圆 拖动鼠标可以改变位置", 10, 20);
stepDrawCircle(p1.x,p1.y,r,g);
}
}
public void bresenhamCircle(int x1,int y1,int r,Graphics g){
int x,y;
int e;
x=0;
y=r;
e=3-r<<2;
while(x<=y){
addCirclePoints(x1, y1, x, y,g);
if(e<0)
e+=(x<<2)+6;
else{
e+=((x-y)<<2)+10;
y--;
}
x++;
}
}
public void stepDrawCircle(int x1,int y1,int r,Graphics g){
int x=r;
int y=0;
int steps=r;
int e=0;
while(steps-->0){
if(e<0){
y++;
e+=(y<<1)+1;
}else{
x--;
e+=1-(x<<1);
}
addCirclePoints(x1,y1,x, y,g);
}
}
private void addCirclePoints(int xc,int yc,int x,int y,Graphics g){
g.drawRect(xc+x,yc+y, 0, 0);
g.drawRect(xc-x,yc+y, 0, 0);
g.drawRect(xc+x,yc-y, 0, 0);
g.drawRect(xc-x,yc-y, 0, 0);
g.drawRect(xc+y,yc+x, 0, 0);
g.drawRect(xc-y,yc+x, 0, 0);
g.drawRect(xc+y,yc-x, 0, 0);
g.drawRect(xc-y,yc-x, 0, 0);
}
public void setAddType(){
type=0;
}
public void setBresenhamType(){
type=1;
}
}
public static void main(String args[]){
new DrawCircle();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -