要想绘制图形,就会用到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);//这里就可以写你想重画的内容了
}
相关推荐
用风车形容可能不太准确,也不知道怎么形容,反正差不多都这么转 C语言图形动画绘制——风车 C语言图形动画绘制——风车 C语言图形动画绘制——风车 C语言图形动画绘制——风车
此压缩包包含文档和代码工程,打开工程需要用社区版的visual stdio 2015,如果用其他版本的vs打开,则可以利用文档中的代码,可以作为OpenGL入门程序或者作业递交程序。
真实感图形绘制-纹理处理,绘制真实图形的纹理,代码清晰,可以更换图片
windows图形绘制代码 windows图形绘制代码 windows图形绘制代码
40页创意图形绘制信息可视化ppt图表合集.pptx
纯属原创,存在图形设备绘制相关的且隐藏比较深的缺陷,虽然已经知道是由于添加了多级缓冲区所致,但为了绘图移动防止绘图闪烁,只好这样,不知怎么修补。 广大朋友在面向对象,与操作系统图形界面有兴趣的可以来看...
用MFC实现的旋转风车,适用于vc++初学者,是个不错的实例代码
复习并深入理解图形格式,数学原理及绘制技术;掌握VisualC++6.0图形类,熟悉相关绘图函数的使用;研究并掌握Windows画图附件的功能模块; 使用VC++编写仿Windows画图软件,实现线条、矩形等基本图形绘制。
用API函数绘制转动的风车,主要用到setTimer()函数
基本图形绘制.rar基本图形绘制.rar基本图形绘制.rar基本图形绘制.rar
4,GUI人机实验-TFTLCD触摸屏实验--2D图形绘制.rar
C#二维三维图形绘制 工程实例宝典
关于图形绘制的相关代码,用于初级学员学习使用,能够跟好的理解vc图形绘制技术
完整的基本图形绘制系统 完整的基本图形绘制系统
4,TFTLCD触摸屏实验--2D图形绘制.rar
Qt基础图形绘制,使用QPainter进行图形绘制,实现槽函数链接实例.
VC++实现数学函数图形绘制 数学函数 图形绘制 模板数组 三次样条
这是一个风车程序,使用MFC编写,是我当年的作业啊~~
基本图形绘制、图形变换、自由曲线绘制、图形裁剪、图形填充 二、二级子菜单(基本图形绘制) 1.直线绘制: 1)Bresenham绘制直线 2)DDA绘制直线 3)改进的Bresenham绘制直线 4)系统库函数绘制直线——直线线宽、...