java制作风车图像的main方法_创意图形的绘制 会转的风车

要想绘制图形,就会用到Graphics类,Graphics类是所有图形上下文的抽象基类,允许应用程序在组件(已经在各种设备上实现)以及闭屏图像上进行绘制。 首先我们应该声明一个Graphics的变量,private Graphics g;然后想要在什么组件上进行绘画就要先获取画笔,比如我们在面板上进行绘画先创建一个面板对象JPanel jp = new JPanel();然后得到画笔

g=jp.getGraphics();这样就可以进行绘制了。

今天我就是想画一个转动的风车,但是熊哥说要用的队列,我还没有学到,但是我想了另一种方法,就是利用视觉暂留,我可以在面板上同一位置画出不同状态的风车,然后让他们逐个显现,这样就会有了转动的效果。当然这里面最重要的就是计算坐标,然后连线。

首先我利用鼠标监听器得到我鼠标点击的坐标,记为P点(x1,y1),然后在此基础上像上下左右延伸100个像素得到a,b,c,d点这样就有了一个基本的十字,然后还是在P点(x1,y1)的基础上,上下左右各取5000的开方(这是我定义的数,这样风车的扇叶就是斜边为100的等腰直角三角形)个像素,然后旋转45度,得到z,f,k,h点,当然根据简单的几何知识,勾股定理,可以很方便的算出z,f,k,h点的坐标,然后就是连线得到一个基本的风车。然后风车的旋转,就可以利用几何的基本知识算出旋转角度后的坐标,比如让风车每次旋转15度,就利用for循环,算出每转一次后的各个点的坐标,然后连线绘制出来。但是程序运行太快看不到for循环每后的形状,所以我们需要一个语句Thread.sleep(150);,这是让程序休眠150微妙,太少就不行啦,还没绘制完风车就到下一步了,就看不到完整的风车了。

下面是计算风车坐标的代码:

if (drawExample.getShapes().equals("小风车")) {

for (int i = 0; i < 100; i++) {

q = new Point(x1, y1);

try {

Thread.sleep(150);//使用休眠时会报异常,要用try catch语句解决

} catch (InterruptedException e1) {

e1.printStackTrace();

}

g.setColor(drawExample.getBackground());

g.fillRect(0, 0, 700, 700);

Color[] co = { Color.BLUE, Color.PINK, Color.RED, Color.CYAN,

Color.DARK_GRAY, Color.GREEN, Color.GREEN,

Color.LIGHT_GRAY, Color.MAGENTA, Color.ORANGE };

g.setColor(co[i % 10]);

a = new Point(x1, y1 - 100);

b = new Point(x1 + 100, y1);

c = new Point(x1, y1 + 100);

d = new Point(x1 - 100, y1);

z = new Point(x1 + 50, y1 - 50);

f = new Point(x1 + 50, y1 + 50);

k = new Point(x1 - 50, y1 + 50);

h = new Point(x1 - 50, y1 - 50);

a.x = (int) (x1 + 100 * Math.sin(PI / 60 * i));

a.y = (int) (y1 - 100 * Math.cos(PI / 60 * i));

b.x = (int) (x1 + 100 * Math.cos(PI / 60 * i));

b.y = (int) (y1 + 100 * Math.sin(PI / 60 * i));

c.x = (int) (x1 - 100 * Math.sin(PI / 60 * i));

c.y = (int) (y1 + 100 * Math.cos(PI / 60 * i));

d.x = (int) (x1 - 100 * Math.cos(PI / 60 * i));

d.y = (int) (y1 - 100 * Math.sin(PI / 60 * i));

draw(a, q);

draw(b, q);

draw(c, q);

draw(d, q);

z.x = (int) (x1 + Math.sqrt(5000)

* Math.sin(PI / 60 * i + PI / 4));

z.y = (int) (y1 - Math.sqrt(5000)

* Math.cos(PI / 60 * i + PI / 4));

f.x = (int) (x1 + Math.sqrt(5000)

* Math.cos(PI / 60 * i + PI / 4));

f.y = (int) (y1 + Math.sqrt(5000)

* Math.sin(PI / 60 * i + PI / 4));

k.x = (int) (x1 - Math.sqrt(5000)

* Math.sin(PI / 60 * i + PI / 4));

k.y = (int) (y1 + Math.sqrt(5000)

* Math.cos(PI / 60 * i + PI / 4));

h.x = (int) (x1 - Math.sqrt(5000)

* Math.cos(PI / 60 * i + PI / 4));

h.y = (int) (y1 - Math.sqrt(5000)

* Math.sin(PI / 60 * i + PI / 4));

draw(a, q);

draw(b, q);

draw(c, q);

draw(d, q);

this.draw(z, a);

this.draw(z, q);

this.draw(f, b);

this.draw(f, q);

this.draw(k, c);

this.draw(k, q);

this.draw(d, h);

this.draw(h, q);

}

}

里面的Draw方法是我写的画两点连线的方法

public void draw(Point a, Point b) {

g.drawLine(a.x, a.y, b.x, b.y);

}

但是当我们将画板窗体最小化或者改变窗体大小的时候,我们先前画出来的东西就全都没了,这是因为当窗体在屏幕上显示的时候,首先是将窗体对象的数据从内存中取出来放到缓存中,再在屏幕上进行绘制。当窗体发生改变的时候,程序会重新从内存中获取更新后的数据绘制。在系统中JFrame类的父类中提供有一个paint(Graphics g)的方法来负责将窗体数据在屏幕上绘制出来。我们画过的形状之所以会消失,就在于我们没有把划过的形状存放到内存中间去,所以当窗体发生重绘时,就不会绘制了。所以我们要将船体继承JFrame类,然后重写paint方法,将我们需要重绘的内容写入paint方法中。

public void paint(Graphics g){

super.paint(g);//一定得先调用父类的方法画出窗体

g.drawLine(2,2,3,3);//这里就可以写你想重画的内容了

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是用OpenGL绘制旋转风车的代码示例。首先,我们需要定义风车的各个部分,包括风车的支架、风车的叶片等。然后,我们需要定义风车的旋转角度,以及旋转中心点的坐标。最后,我们使用OpenGL的旋转函数来实现风车的旋转效果。 ```c++ #include <GL/glut.h> #include <math.h> #define PI 3.1415926535898 // 定义风车的各个部分 void drawWindmill() { // 绘制风车的支架 glBegin(GL_POLYGON); glColor3f(0.5, 0.5, 0.5); glVertex2f(-0.05, 0); glVertex2f(0.05, 0); glVertex2f(0.05, 1.5); glVertex2f(-0.05, 1.5); glEnd(); // 绘制风车的叶片 glBegin(GL_POLYGON); glColor3f(0.9, 0.9, 0.9); glVertex2f(0, 1.5); glVertex2f(0.2, 1.8); glVertex2f(0, 2.1); glVertex2f(-0.2, 1.8); glEnd(); } // 定义风车的旋转角度和旋转中心点的坐标 float angle = 0; float centerX = 0; float centerY = 0; // 定义绘制函数 void display() { // 清空颜色缓存和深度缓存 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 绘制风车,并进行旋转 glPushMatrix(); glTranslatef(centerX, centerY, 0); glRotatef(angle, 0, 0, 1); glTranslatef(-centerX, -centerY, 0); drawWindmill(); glPopMatrix(); // 刷新缓存区 glutSwapBuffers(); } // 定义定时器函数,用于控制旋转角度 void timer(int value) { angle += 5; if (angle >= 360) { angle -= 360; } glutPostRedisplay(); glutTimerFunc(50, timer, 0); } // 定义窗口大小和标题 int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(400, 400); glutCreateWindow("Windmill"); // 设置背景颜色为白色 glClearColor(1, 1, 1, 0); // 设置投影矩阵 glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(-2, 2, -2, 2); // 注册回调函数 glutDisplayFunc(display); glutTimerFunc(50, timer, 0); // 进入主循环 glutMainLoop(); return 0; } ``` 在上述代码中,我们首先定义了风车的支架和叶片的绘制函数`drawWindmill()`,并且定义了风车的旋转角度和旋转中心点的坐标。在绘制函数`display()`中,我们使用OpenGL的旋转函数`glRotatef()`来实现风车的旋转效果。在定时器函数`timer()`中,我们控制旋转角度的变化,并且在每次旋转时调用`glutPostRedisplay()`函数来刷新缓存区。 最后,在`main()`函数中,我们设置窗口大小和标题,并且注册回调函数。在`gluOrtho2D()`函数中,我们定义了投影矩阵,使得绘制图形不会因为窗口大小的改变而变形。在主循环中,我们使用`glutMainLoop()`函数进入消息循环。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值