`
fancyCR7
  • 浏览: 7363 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

创意图形的绘制 会转的风车

阅读更多

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

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

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

首先我利用鼠标监听器得到我鼠标点击的坐标,记为P点(x1y1),然后在此基础上像上下左右延伸100个像素得到a,b,c,d点这样就有了一个基本的十字,然后还是在P点(x1y1)的基础上,上下左右各取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);//这里就可以写你想重画的内容了

}

分享到:
评论

相关推荐

    风车转动很可爱

    标题“风车转动很可爱”可能是指一个编程项目或应用,它包含了一个视觉元素,如一个动态的风车图形,该图形在用户交互下能够旋转,给人以可爱和趣味性的感受。描述中的“很可爱”进一步强调了这个元素的设计风格,...

    Android 风车效果源码.zip

    3. **绘图API**:在自定义View中,开发者会用到Android的绘图API,如Path、Paint、Rect等,来绘制风车的叶片、轴心等元素,并控制它们的颜色、线宽和透明度。 4. **动画控制**:利用ObjectAnimator或ValueAnimator...

    Android高级应用源码-android 之旋转罗盘 风车 开发 Android 随手指旋转图片.zip

    总的来说,这份源码提供了一个实践案例,帮助开发者深入了解Android中的图形绘制、动画制作、手势识别以及自定义View开发等高级技术。通过研究和学习,开发者可以提升自己的技能,创造出更富创意和互动性的Android...

    风车3D模型设计

    理解并掌握风车3D模型的设计,可以帮助我们更好地在虚拟空间中重现现实世界中的风车结构,从而进行仿真、演示或创意表达。 首先,"3D模型"是通过计算机图形学技术构建的三维几何对象,由多边形网格组成,包含了颜色...

    安卓Android源码——安卓Android使用SurfaceView实现墨迹天气的风车效果.zip

    在安卓应用开发中,SurfaceView ...总之,通过理解SurfaceView的工作机制,我们可以利用其特性实现高性能的图形绘制,如这个例子中的风车效果。通过不断学习和实践,开发者可以创造出更多富有创意和互动性的安卓应用。

    TweenMax.js+svg实现漂亮的农场风车风景动画效果源码.zip

    在这个农场风车场景中,我们可能需要用到`&lt;svg&gt;`元素来定义画布,`&lt;path&gt;`元素来绘制风车叶片的路径,以及`&lt;rect&gt;`元素来描绘风车的基座和农场背景等元素。 为了实现风车旋转的动画,我们需要修改SVG中的`transform...

    北师大六年级数学上册欣赏与设计PPT课件.pptx

    首先,风车图通常是由多个等腰三角形或正方形旋转拼接而成,这种图形展示了旋转对称性的概念,学生可以通过观察和绘制风车图来理解旋转和平移的几何变换。此外,风车图还可以引申出关于角度、周长和面积的计算问题,...

    用Python画小女孩放风筝的示例

    这篇用Python绘制小女孩放风筝的示例文章,实际上是一段完整的Python代码,通过turtle模块实现图形绘制。turtle是Python的一个标准库,它提供了一个绘图板,可以让我们用代码绘制各种图形。这篇文章中的代码利用了...

    电脑美术二PPT学习教案.pptx

    2. **绘图工具**:包括线条工具、箭头工具、铅笔工具、椭圆工具、矩形工具、多角星形工具以及文字工具,这些都是绘制图形和文本的基础。 3. **关键帧的创建**:关键帧标记了动画中的重要状态,插入关键帧可以创建新...

    彩纸旋转效果的flash加载_Fla源文件

    彩纸旋转效果的实现关键在于对图形的绘制和旋转动画的设置。在Flash CS4中,开发者可以使用绘图工具绘制出卡纸形状,由于Flash的矢量特性,这些图形在放大时不会失真,保持清晰。在绘制过程中,可以使用“形状补间”...

    Arduino-Scratch课程

    - **角色创建**:学习使用不同方法创建角色,如绘制、上传图片等。 - **光强检测**:了解如何利用传感器检测环境光强度。 - **条件循环语句**:掌握条件语句(如果…那么…)和循环语句(重复执行),实现根据...

    Adobe_Photoshop_CS制作技巧.doc

    32. **风车字**:可能涉及文字变形和旋转,形成风车旋转的样子。 33. **星空效果**:通过星星纹理、噪点滤镜和发光效果,创建星夜的背景。 34. **贴图字**:将图像作为文字的填充,实现纹理化的文字效果。 35. **...

    flash教程 内含flash下载网站

    3. **基础操作**: Flash教程涵盖了基础操作,如绘制图形、编辑形状、颜色填充、图层管理等。理解这些基础操作是制作动画的前提,也是进一步深入学习的关键。 4. **动画原理**: Flash利用关键帧和补间动画的概念,...

    ps 标志制作

    例如,选择工具用于精确选取图形区域,画笔工具则用于自由绘制和着色。 2. **形状与路径**:在标志设计中,形状工具是非常重要的,它们允许创建标准几何形状,如圆形、矩形和多边形。路径工具则可以创建自定义形状...

Global site tag (gtag.js) - Google Analytics