java实现计算机图形学中点画圆算法
计算机图形学实验一
采用中点画圆算法原理绘制1/8圆弧,然后利用圆的高度对称性,基于java的Graphics类,调用getGraphics()方法,在GUI界面上绘图,由于java的坐标位于左上角,所以我们可以将圆心移动至面板中心再进行算法进程:
package com.draw;
import javax.swing.*;
import java.awt.*;
import java.util.Scanner;
public class middle extends JFrame {
private Graphics ga;
public middle(){
ga = this.getGraphics();
setBounds(0, 0, 1000, 1000);
setVisible(true);
setBackground(Color.WHITE);
setLayout(null);
setResizable(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
if (ga != null)
paint(ga);
}
public void paint(Graphics g) {
double r = 200;
double x0, y0,t1,t2;
x0 = 0;
y0 = r;
g.setColor(Color.GREEN);
g.drawOval((int)x0,(int)y0,1,1);
double d = 1-r;//构造判别式
while(x0<y0){
if(d<0){
x0 = x0+1;
g.drawOval((int)(x0+300),(int)y0+400,5,5);//绘制1/8圆弧A
g.drawOval((int)(x0+300), (int) ((int)400-y0),5,5);//绘制A圆弧关于y=400的对称
g.drawOval((int)(-x0+300),(int)y0+400,5,5);//绘制关于x=300对称的1/8圆弧B
g.drawOval((int)(-x0+300),400-(int)y0,5,5);//绘制B关于y=400对称
g.drawOval((int)y0+300,(int)x0+400,5,5); //交换x,y使得填满1/4圆C
g.drawOval((int)y0+300,400-(int)x0,5,5); //绘制C关于y=400对称
g.drawOval((int)(300-y0),(int)(x0+400),5,5);//被填满的部分C的对称E
g.drawOval((int)(300-y0),400-(int)x0,5,5);//绘制E关于y=400对称
d = d+2*x0+3;
}else{
x0 = x0+1;
y0 = y0-1;
d = d +2*(x0-y0)+5;
g.drawOval((int)(x0+300),(int)y0+400,5,5);//绘制1/8圆弧
g.drawOval((int)(x0+300), (int) ((int)400-y0),5,5);//绘制1/8圆弧关于y=400的对称
g.drawOval((int)(-x0+300),(int)y0+400,5,5);//绘制关于x=300对称的1/8圆弧B
g.drawOval((int)(-x0+300),400-(int)y0,5,5);//绘制B关于y=400对称
g.drawOval((int)y0+300,(int)x0+400,5,5);//交换x,y使得填满1/4圆C
g.drawOval((int)y0+300,400-(int)x0,5,5); //绘制C关于y=400对称
g.drawOval((int)(300-y0),(int)(x0+400),5,5);//被填满的部分C的对称E
g.drawOval((int)(300-y0),400-(int)x0,5,5);//绘制E关于y=400对称
}
}
}
public static void main(String[] args) {
new middle();
}
}