• 分形和数据结构之抛色子


    今天是2016年6月5日,必须要说,今天才真正懂得身为一个程序员的幸福。今天是我和何思小伙伴在蓝杰十多天的学习以来第一次独立写代码。虽然我们写的慢,很多方法的运用都不是很熟练,在今天的写代码的过程中甚至还怀疑自己的智商,BUT当那个美丽的图形出现的那一瞬间,世界都美丽了,熊哥都变帅了! 当然我也要总结一下我暴露无遗的缺点

    第一点就是还没有想清楚思路就开始动手写,没有总局思想降低的不止是速度,还会使自己思维混乱;

    第二点就是性格太轴,第一步没有写出来就绝对不会考虑第二步,其实可以把后面的写出来。再根据运行的结果不断去改进自己的代码;

    第三点是没有充分考虑到优质程序的时间复杂度和空间复杂度;

    下面就来展示一下我的成果:

    package 文雅0605;

    import java.awt.FlowLayout;

    import java.awt.Graphics;

    import javax.swing.JFrame;

    public class paintingFrame  extends JFrame{

          public static void main(String[] args) {

            paintingFrame pf =new paintingFrame();

            pf.initUI();

          }

          public void initUI(){

                 setTitle("美丽的图画");

                 setSize(600,500);

                 setDefaultCloseOperation(3);

                 setLocationRelativeTo(null);

                 setLayout(new FlowLayout());

                 setVisible(true); 

                 Graphics g = getGraphics();

                 paintingListener pf = new paintingListener();

                 addMouseListener(pf);

                 pf.setGraphics(g);

          }

    }

    package 文雅0605;

    import java.awt.BasicStroke;

    import java.awt.Graphics;

    import java.awt.Graphics2D;

    import java.awt.event.MouseEvent;

    import java.awt.event.MouseListener;

    import java.util.Random;

    public class paintingListener implements MouseListener {

          public int x1, y1, x2, y2, x3, y3, x4, y4;

          public int x, y;

          public int i = 0;// 控制点击数

          public int s;// 控制会扔到A,B,C中的哪一个

          public int j;// 控制次数

          // public int ex, ey;

          private Graphics g;

          public void setGraphics(Graphics gra) {

                 g = (Graphics2D) gra;

          }

          public void mouseClicked(MouseEvent e) {

                 // ((Graphics2D) g).setStroke(new BasicStroke(3));

    //原来的做法:

    for(i=0;i<4;i++){

    x1 = e.getX();

    y1 = e.getY();

    x2 = e.getX();

    y2= e.getY();

    x1==x2;

    y1==y2;

    g.drawLine(x1, y1, x2, y2);

    }

    结果就是:四个点之后并没有停止继续画点,因为public void mouseClicked(MouseEvent e) {}本来就是一个循环了,再在方法体里面加上一个循环是画蛇添足了,他会在画完四个点之后的下一次点击后继续画点,然后就有无数个点了。这种写法不仅是一种静态的死思维,更是在浪费时间和空间,而且没有保存。真是醉醉的了。

    然而我在一条道上走到了黑,当我得知public void mouseClicked(MouseEvent e){}是一个循环的时候,我的第一反应是break。于是乎我是这么写的:

    Switch(i++){

    Case  i==0:

    g.drawLine(x1, y1, x2, y2);

    break;

    case  i==1:

    g.drawLine(x1, y1, x2, y2);

    case  i==2:

    g.drawLine(x1, y1, x2, y2);

    case  i==3:

    g.drawLine(x1, y1, x2, y2);

    }

    依然没有保存,而且吧程序复杂化了。

     

                 if (i < 4) {

                        x = e.getX();

                        y = e.getY();

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

                        if (i == 0) {//一定要把点存起来

                               x1 = x;

                               y1 = y;

                        }

                        else if (i == 1) {

                               x2 = x;

                               y2 = y;

                        }

                        else if (i == 2) {

                               x3 = x;

                               y3 = y;

                        }

                        else if (i == 3) {

                               x4 = x;

                               y4 = y;

                        }

                        i++;

                 }

                 else {//这个地方我原来写的是:if(i>=4){}这个直接导致我运行程序的结果是:点到第四个点的时候图像就出来了,用elsek就会是在第五个点后才出来图像。其原因不是代码的错,是我自己的逻辑错了。而且也会加大代码的时间复杂度和空间复杂度。

                        Random rand = new Random();

                        for (j = 0; j < 1900000; j++) {

                               int s = rand.nextInt(3);// 随机决定要画的点数

                               if (s == 0) {// 如果选中的是A点

                                      x4 = (x1 + x4) / 2;

                                      y4 = (y1 + y4) / 2;

                                      // ex = Math.abs(x1 - x4) / 2 + Math.min(x1, x4);

                                      // ey = Math.abs(y1 - y4) / 2 + Math.min(y1, y4);

                                      // g.drawLine(ex, ey, ex, ey);

                                      // x4 = ex;

                                      // y4 = ey;//这么写加大了代码的时间复杂度

                               } else if (s == 1) {// 如果选中的是B点

                                      x4 = (x2 + x4) / 2;

                                      y4 = (y2 + y4) / 2;

                                      // ex = Math.abs(x2 - x4) / 2 + Math.min(x2, x4);

                                      // ey = Math.abs(y2 - y4) / 2 + Math.min(y2, y4);

                                      // g.drawLine(ex, ey, ex, ey);

                                      // x4 = ex;

                                      // y4 = ey;

                               } else {// 如果选中的是C点

                                      x4 = (x3 + x4) / 2;

                                      y4 = (y3 + y4) / 2;

                                      // ex = Math.abs(x3 - x4) / 2 + Math.min(x3, x4);

                                      // ey = Math.abs(y3 - y4) / 2 + Math.min(y3, y4);

                                      // g.drawLine(ex, ey, ex, ey);

                                      // x4 = ex;

                                      // y4 = ey;

                               }

                               g.drawLine(x4, y4, x4, y4);

                               i = 0;//使得能够重新再绘制图形

                        }

                 }

          }

          /**

           * Invoked when a mouse button has been pressed on a component.

           */

          public void mousePressed(MouseEvent e) {

          }

          /**

           * Invoked when a mouse button has been released on a component.

           */

          public void mouseReleased(MouseEvent e) {

          }

          /**

           * Invoked when the mouse enters a component.

           */

          public void mouseEntered(MouseEvent e) {

          }

          /**

           * Invoked when the mouse exits a component.

           */

          public void mouseExited(MouseEvent e) {

          }

    }

     

    胡哥说,没有写错的程序。但是为什么运行结果和你想的不一样呢?因为你不了解它的思维,它的构造。所以以后写程序不仅要专注于消除语法上的bug,更要注重思维上的bug。

  • 相关阅读:
    新机自动创建yum库
    一段自动添加证书命令
    一段托盘程序
    date
    1234567890 转换成 1,234,567,890
    删除localStorage数组中其中一个元素(根据元素中的属性key)
    xcode6 ios launchimage
    画分割线
    裁剪和打水印
    UITextView添加一个placeholder功能
  • 原文地址:https://www.cnblogs.com/java-7/p/5575612.html
Copyright © 2020-2023  润新知