要想绘制图形,就会用到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);//这里就可以写你想重画的内容了

}

创意图形的绘制 会转的风车相关推荐

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

    要想绘制图形,就会用到Graphics类,Graphics类是所有图形上下文的抽象基类,允许应用程序在组件(已经在各种设备上实现)以及闭屏图像上进行绘制. 首先我们应该声明一个Graphics的变量, ...

  2. 基于P5JS创意图形绘制

    基于P5JS创意图形绘制 使用p5,webgl等工具,尽量重现所给gif图库中的图像. 所选临摹图形为 主要过程 选用了P5JS在线编辑器进行实现,可以浏览P5JS网站并复制附件txt的代码查看效果. ...

  3. 视频教程-【吴刚】图形图标绘制表现技巧视频教程-UI

    [吴刚]图形图标绘制表现技巧视频教程 业内知名UID.UED.用户体验.品牌策略与创意设计师,十三年行业职业教育培训经验,业内"UI视频第一人",教学总监.视觉设计讲师. Adob ...

  4. 【吴刚】图形图标绘制表现技巧视频教程-吴刚-专题视频课程

    [吴刚]图形图标绘制表现技巧视频教程-267人已学习 课程介绍         本套教学视频系统化通过使用对相关软件(PS.AI)的软件实操应用,可以提高学员对基本软件工具的应用和实际操作能力. 课程 ...

  5. OpenCv Java 简单的图形轮廓绘制 (5)

    初学Opencv实现一点点的功能都感觉很是吃力,所以不得不写点东西记忆一下,不然明天又忘记了 好记星不如烂笔头 我就想能不能处分出图片中的正方形和圆形,标记出来,我们这边就绘制器图像,下一步就是认识图 ...

  6. 【MATLAB】基本绘图 ( 绘制多图 | 设置图形对话框在 Windows 界面的位置和大小 | 在一个图形上绘制多个小图形 )

    文章目录 一.绘制多图 1.绘制多图 2.代码示例 二.设置图形对话框在 Windows 界面的位置和大小 三.在一个图形上绘制多个小图形 一.绘制多图 1.绘制多图 存在一种绘图情况 , 需要同时展 ...

  7. 基于matlab的能级_波函数及几率密度图形的绘制,基于MATLAB的能级波函数及几率密度图形的绘制.pdf...

    基于MATLAB的能级波函数及几率密度图形的绘制.pdf 第 卷 第 期 大 学 物 理 实 验 年 月 出版 壬 刃协 卫 印 文 章编 号 一 ' 一 一 基 于 的能级 . 波 函数 及 几 率 ...

  8. 箱线图和散点图叠加图形的绘制——R language

    前几日偶然从科学网上看到了一副特别漂亮的统计图形,如下图(摘自博文:http://blog.sciencenet.cn/blog-397960-456174.html)所示: 感觉美翻了都,刚好在学习 ...

  9. tilemap 菱形_使用Cocos creator制作【治愈七夕】-音乐游戏图形api绘制跳舞的线

    专栏概述及目录:笑苍天Smile:专栏概述及目录​zhuanlan.zhihu.com 游戏截图: 游戏地址:微信扫一扫 游戏源码 游戏技术:前端引擎-Cocos creator,语言-Ts. 写作目 ...

最新文章

  1. Pytorch的优化器推荐
  2. java守护线程和用户线程
  3. 【Qt】2D绘图之涂鸦板
  4. CSS position 属性
  5. python查找字符串出现次数_Python搜索文本文件并计算指定字符串的出现次数
  6. 关于阿里云OSS报错-java.lang.ClassNotFoundException: org.jdom.input.JDOMParseException
  7. python程序双向链表_Python 实现双向链表(图解)
  8. Android Cloud to Device Messaging 服务介绍 – 如何使用云计算推送消息到手机(转载)...
  9. Unity3D-射线效果
  10. 程序员自学成才-老程序员给新手的四条自学经验
  11. Ghostexp.exe
  12. 动态效果html wow,bootstrap 动态效果WOW animate插件
  13. 设计符合人需求层次模型的商业模式——揭密冰桶挑战背后,不为人知的商业秘密!
  14. 游戏攻略 一 天堂W(韩)
  15. .考试倒计时43天!来提分啦!
  16. Web全栈~28.网络编程
  17. CryptoJS与JSEncrypt 加密算法
  18. 黑链详解。黑链的含义
  19. u盘启动android系统安装程序,怎么在U盘上运行Android x86系统
  20. Android Studio编译JNI时指定CPU种类

热门文章

  1. 野山参怎么吃好,这样炖是不是效果最好
  2. glide 加载图片宽度填满,高度自适应图片比列
  3. #牛客网 吐泡泡 (栈)
  4. xxxxxxxxxxxxxx
  5. 忍者必须死代码 免费
  6. mysql单节点扩展为主从复制_MySQL主从复制
  7. 1.5 深入理解常见类
  8. python使用aip库识别图片中文字
  9. 有MDF文件和LDF文件之后怎么创建数据库
  10. 小程序引入字体集方式