Java 图形程序设计 jmysght.java

程序设计:谢山水 2003.10.1.

// 正弦波,多叶曲线:线宽、颜色、分段颜色、背景色、花叶数、显示速度
// 画图方向:向左画、向右画、向上画、向下画
// 位置:水平、垂直多条 iava 多叶曲线

import java.awt.*;

// 1.图形程序设计 jmysght 类继承框架 Frame
public class jmysght extends Frame {
public jmysght() {
setLayout(new BorderLayout()); // 设置边界布局
DrawPanel display = new DrawPanel();// 创建画图面板实例 display
add("Center", display); // 对中加入画图面板 display
}

// 2.关闭窗口,终止程序
public boolean handleEvent(Event e) {
switch (e.id) {
case Event.WINDOW_DESTROY: // 窗口关闭
System.exit(0); // 系统退出,终止程序
return true;
default:
return false;
}
}
// 3.程序入口 main
public static void main(String args[]) {
jmysght iavajmysght = new jmysght();
iavajmysght.setTitle("Java 语言图形程序设计 模拟手工画图 谢山水 2003.10.1.");
iavajmysght.setSize(800,600);
iavajmysght.show();
}
}

// 4.定义画板类,求x,y轴投影的方法,定义画图方法
class DrawPanel extends Panel {
int hy,y,rx,ry;
// 花叶,x,y原点,半径,椭圆长短轴
double x,PI=3.141596,i,i1=PI/1111;

// 定义边框花边函数 fx,fy
double fx(double i){ //定义求x轴投影和x轴坐标的方法
return x+(Math.cos(hy*i)*Math.cos(i))*rx;
// 调整x轴坐标原点,花叶数,x轴投影,花叶半径
}
double fy(double i){ //定义求y轴投影和y轴坐标的方法
return y+(Math.cos(hy*i)*Math.sin(i))*rx;
// 调整y轴坐标原点,花叶数,y轴投影,花叶半径
}

//定义正弦函数 fy1
double fy1(double x){
return y+Math.sin(x/25)*x/5;
// 调整垂直位置,波峰数,波幅度
}

// 定义椭圆函数 fx2,fy2
double fx2(double i){ //定义求x轴投影和x轴坐标的方法
return x+Math.cos(i)*rx;
// x轴坐标原点,椭圆长轴,x轴投影
}
double fy2(double i){ //定义求y轴投影和y轴坐标的方法
return y+Math.sin(i)*ry;
// y轴坐标原点,椭圆短轴,y轴投影
}

public void paint(Graphics g) { // 定义画图方法

// 5.画图纸边框
g.setColor(new Color(255,0,255)); // 设置画笔为紫色
g.drawRect(5,5,780,540); // 画图纸外边框

g.setColor(new Color(0,133,255)); // 设置画笔为青色
g.drawRect(15,15,760,520); // 画图纸内边框
g.drawRect(16,16,758,518);
g.drawRect(17,17,756,516);
g.drawRect(18,18,754,514);

// 6.绘制上水平3叶紫色花边
g.setColor(new Color(255,0,255)); //设置画笔为紫色
hy=3;rx=10;y=40; // 花叶数,半径,y原点,
for (x=50;x<755;x+=23){
for (i=0;i<=2*PI;i+=i1){
g.drawLine((int)fx(i),(int)fy(i),(int)fx(i+i1),(int)fy(i+i1));
}
}

// 7.绘制右垂直5叶绿色花边
g.setColor(new Color(0,155,0)); // 设置画笔为绿色
hy=5;x=750; // 花叶数,半径,x原点,
for (y=65;y<495;y+=23){
for (i=0;i<=2*PI;i+=i1){
g.drawLine((int)fx(i),(int)fy(i),(int)fx(i+i1),(int)fy(i+i1));
}
}

// 8.绘制下水平7叶青色花边
g.setColor(new Color(0,133,255)); // 设置画笔为青色
hy=7;y=510; // 花叶数,y原点,
for (x=740;x>30;x-=23){
for (i=0;i<=2*PI;i+=i1){
g.drawLine((int)fx(i),(int)fy(i),(int)fx(i+i1),(int)fy(i+i1));
}
}

// 9.绘制左垂直9叶橙色花边
g.setColor(new Color(255,200,0)); // 设置画笔为橙色
hy=9;x=45; // 花叶数,x原点
for (y=480;y>50;y-=23){
for (i=0;i<=2*PI;i+=i1){
g.drawLine((int)fx(i),(int)fy(i),(int)fx(i+i1),(int)fy(i+i1));
}
}

// 10.画左窗口和输出文字
Font fnt14 = new Font("TimesRoman",Font.PLAIN,14);
Font fnt22 = new Font("宋体",Font.BOLD,22); // 创建字体对象

g.setFont(fnt22); // 设置当前字体
g.setColor(new Color(0,133,0));
g.drawString("模拟手工画图",100,100); // 绿字

g.setFont(fnt14); // 设置当前字体
g.setColor(new Color(0,0,255));
g.drawString("程序设计:谢山水 2003.10.1.",80,130);// 蓝字

// 11.绘制山峰
g.setColor(new Color(0,0,255));
y=200;
for(x=65;x<500;x+=0.01){
for(int h=0;h<4;h++){
g.drawLine((int)x,(int)fy1(x)+h,(int)x+1,(int)fy1(x+1)+h);
}

// 13.绘制红山花
g.setColor(new Color(255,0,0)); 
hy=4;x=350;y=140;rx=30; // 花叶,x,y原点
for (i=0;i<=2*PI;i+=i1/33){
g.drawLine((int)fx(i),(int)fy(i),(int)fx(i+i1),(int)fy(i+i1));
}

// 14.绘制红太阳
x=600;y=100;
g.setColor(new Color(255,0,0));
g.fillOval((int)x,y,40,40);

// 15.绘制太阳光芒
for (rx=25;rx<65;rx++){
x=620;y=120;ry=rx;
for (i=0;i<2*PI;i+=PI/14){
g.drawLine((int)fx2(i),(int)fy2(i),(int)fx2(i+i1),(int)fy2(i+i1));
}
}

// 16.绘制大桥
g.setColor(new Color(222,222,0)); // 设置画笔为黄色
x=400;y=400;rx=320;ry=90;
for (i=PI;i<2*PI;i+=i1/22){
for(int h=0;h<4;h++){
g.drawLine((int)fx2(i),(int)fy2(i)+h,(int)fx2(i+i1),(int)fy2(i+i1)+h);
}
}

// 17.绘制桥孔
rx=25;ry=40;
for (x=150;x<700;x+=50){
for (i=PI;i<2*PI;i+=i1/2){
for(int h=0;h<3;h++){
g.drawLine((int)fx2(i),(int)fy2(i)+h,(int)fx2(i+i1),(int)fy2(i+i1)+h);
}
}
}

// 18.绘制水面
g.setColor(new Color(0,0,255));
y=405;
for (x=100;x<700;x+=x/9999){
g.drawLine((int)x,y,(int)x+1,y+1);
}

for(y=420;y<422;y++){
for (x=150;x<650;x+=x/9999){
g.drawLine((int)x,y,(int)x+1,y+1);
}
}

for(y=440;y<443;y++){
for (x=200;x<600;x+=x/9999){
g.drawLine((int)x,y,(int)x+1,y+1);
}
}

for(y=460;y<464;y++){
for (x=250;x<550;x+=x/9999){
g.drawLine((int)x,y,(int)x+1,y+1);
}
}

// 19.设置背景两次(黄色,橙色),可以使用画面不断刷新重画.
setBackground(new Color(255,255,0)); 
setBackground(new Color(111,255,255));

}
}