import javax.swing.*;
import java.awt.*;
import java.util.*;
public class Test extends JPanel {
static int a;
static int b;
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D)g;
g2d.translate(getWidth() / 2, getHeight() / 2);
g2d.scale(1, -1); //Graphics的坐标系的变换
int x,y;
double d;
x=0;y=b;;
d=b*b-a*a*b+0.25*a*a;
g.setColor(Color.blue);
g.fillRect(x, y, 1, 1);
while(b*b*x<a*a*y) { //椭圆斜率绝对值小于1情况
if(d<0) {d+=b*b*(2*x+3);x++;}
else {d+=b*b*(2*x+3)+a*a*(-2*y+2);x++;y--;}
g.setColor(Color.blue);
g.fillRect(x,y,1,1);
g.fillRect(x,-y,1,1);
g.fillRect(-x,y,1,1);
g.fillRect(-x,-y,1,1);
}
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+=a*a*(-2*y+3);y--;}
else {d+=b*b*(2*x+2)+a*a*(-2*y+3);x++;y--;}
g.setColor(Color.blue);
g.fillRect(x,y,1,1);
g.fillRect(x,-y,1,1);
g.fillRect(-x,y,1,1);
g.fillRect(-x,-y,1,1);
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入长轴(范围0——200)a:");
a=scanner.nextInt();
System.out.println("请输入短轴(范围0——a)b:");
b=scanner.nextInt();
JFrame frame = new JFrame("test");
frame.getContentPane().add(new Test());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 400);
frame.setVisible(true);
}
}
scale public abstract void scale(double sx,double sy)
使用缩放变换连接当前的Graphics2D
Transform
后续渲染根据相对于先前缩放比例的指定缩放因子进行调整大小。 这等同于调用transform(S)
,其中S是一个AffineTransform
由以下矩阵表示:
[ sx 0 0 ] [ 0 sy 0 ] [ 0 0 1 ]
参数
sx
- 后续渲染操作中的X坐标相对于以前的渲染操作相乘的量。
sy
- 后续渲染操作中的Y坐标相对于以前的渲染操作相乘的量。
-
translate
public abstract void translate(int x, int y)
将
Graphics2D
上下文的原点转换为当前Graphics2D
中的点( x , y )。 修改Graphics2D
上下文,使其新起点对应于Graphics2D
上下文的前坐标系中的点( x , y )。 在这种图形上下文中的后续渲染操作中使用的所有坐标都是相对于这个新的起点。Specified by:
参数
x
- 指定的x坐标y
- 指定的y坐标
-
translate
public abstract void translate(double tx, double ty)
将当前的Graphics2D
Transform
与平移变换相连。 随后的渲染相对于前一位置转换指定的距离。 这等同于调用变换(T),其中T是一个AffineTransform
由以下矩阵表示:[ 1 0 tx ] [ 0 1 ty ] [ 0 0 1 ]
参数
tx
- 沿x轴平移的距离ty
- 沿y轴平移的距离