示例#1
0
  public static void main(String[] args) {
    // scale of the coordinate system
    StdDraw.setXscale(-1.0, 1.0);
    StdDraw.setYscale(-1.0, 1.0);

    double rx = 0.0, ry = 0.0;
    double rx2 = rx + 0.10, ry2 = ry + 0.10;
    double rx3 = rx2 + 0.10, ry3 = ry2 + 0.10;
    double vx = 0.005, vy = 0.003;
    double vx2 = vx + 0.05, vy2 = vy + 0.05;
    double vx3 = vx2 + 0.05, vy3 = vy2 + 0.05;
    double radius = 0.10;

    // main loop
    while (true) {
      // bounce off wall according to law of elastic collision
      if (Math.abs(rx + vx) > 1.0 - radius) vx = -vx;
      if (Math.abs(ry + vy) > 1.0 - radius) vy = -vy;
      if (Math.abs(rx2 + vx2) > 1.0 - radius) vx2 = -vx2;
      if (Math.abs(ry2 + vy2) > 1.0 - radius) vy2 = -vy2;
      if (Math.abs(rx3 + vx3) > 1.0 - radius) vx3 = -vx3;
      if (Math.abs(ry3 + vy3) > 1.0 - radius) vy3 = -vy3;

      // position
      rx += vx;
      ry += vy;

      rx2 = vx2 / Math.tan(vy / vx);
      ry2 = vy2 / Math.tan(vy / vx);

      rx3 += vx3;
      ry3 += vy3;

      // clear
      StdDraw.setPenColor(StdDraw.GRAY);
      StdDraw.filledSquare(0, 0, 1.0);

      // ball
      StdDraw.setPenColor(StdDraw.BLUE);
      StdDraw.filledCircle(rx, ry, radius);

      // ball2
      StdDraw.setPenColor(StdDraw.BLACK);
      StdDraw.filledCircle(rx2, ry2, radius / 2);

      // ball3
      StdDraw.setPenColor(StdDraw.YELLOW);
      StdDraw.filledCircle(rx3, ry3, radius / 2);

      // display and pause for 20 ms
      StdDraw.show(20);
    }
  }
 // draw the maze
 public void draw() {
   StdDraw.setPenColor(StdDraw.RED);
   StdDraw.filledCircle(N / 2.0 + 0.5, N / 2.0 + 0.5, 0.375);
   StdDraw.filledCircle(1.5, 1.5, 0.375);
   StdDraw.setPenColor(StdDraw.BLACK);
   for (int x = 1; x <= N; x++) {
     for (int y = 1; y <= N; y++) {
       if (south[x][y]) StdDraw.line(x, y, x + 1, y);
       if (north[x][y]) StdDraw.line(x, y + 1, x + 1, y + 1);
       if (west[x][y]) StdDraw.line(x, y, x, y + 1);
       if (east[x][y]) StdDraw.line(x + 1, y, x + 1, y + 1);
     }
   }
   StdDraw.show(1000);
 }
示例#3
0
 /**
  * @param tn - TreeNode object
  * @param even - Vertical or horizontal cuts
  * @param left - left or right
  * @param pivot - Pivot point This function recursively draws the binary tree and displays how the
  *     tree slices the unit square. It works by sending it the current node to draw, whether or
  *     not it is a vertical cut, whether or not it is a left node, and a "pivot" point. The pivot
  *     point tells the method where to start and stop the line.
  */
 private void drawPoints(TreeNode tn, boolean even, boolean left, double pivot) {
   if (tn == null) return;
   StdDraw.setPenColor();
   // StdDraw.filledCircle(tn.p.x(), tn.p.y(), .005);
   if (even) { // Vertical cuts
     StdDraw.setPenColor(Color.red);
     if (left) {
       StdDraw.line(tn.p.x(), 0, tn.p.x(), pivot);
     } else {
       StdDraw.line(tn.p.x(), pivot, tn.p.x(), 1);
     }
     pivot = tn.p.x();
   } else { // Horizontal cuts
     StdDraw.setPenColor(Color.blue);
     if (left) {
       StdDraw.line(0, tn.p.y(), pivot, tn.p.y());
     } else {
       StdDraw.line(pivot, tn.p.y(), 1, tn.p.y());
     }
     pivot = tn.p.y();
   }
   StdDraw.setPenColor();
   StdDraw.filledCircle(tn.p.x(), tn.p.y(), .007);
   drawPoints(tn.left, !even, true, pivot);
   drawPoints(tn.right, !even, false, pivot);
 } // End drawPoints() function
示例#4
0
 private void drawNode(TreePosition p, Node x) {
   StdDraw.setPenColor(Color.GREEN);
   StdDraw.filledCircle(p.x, p.y, 0.3);
   StdDraw.setPenColor(Color.RED);
   StdDraw.text(p.x, p.y, x.key.toString());
   StdDraw.setPenColor(Color.BLACK);
 }
 @Override
 public void draw() {
   if (!hidden) {
     StdDraw.setPenColor(StdDraw.YELLOW);
     StdDraw.filledCircle(myX, myY, radius);
   }
 }
 // solve the maze using depth-first search
 private void solve(int x, int y) {
   if (x == 0 || y == 0 || x == N + 1 || y == N + 1) return;
   if (done || visited[x][y]) return;
   visited[x][y] = true;
   StdDraw.setPenColor(StdDraw.BLUE);
   StdDraw.filledCircle(x + 0.5, y + 0.5, 0.25);
   StdDraw.show(30);
   // reached middle
   if (x == N / 2 && y == N / 2) done = true;
   if (!north[x][y]) solve(x, y + 1);
   if (!east[x][y]) solve(x + 1, y);
   if (!south[x][y]) solve(x, y - 1);
   if (!west[x][y]) solve(x - 1, y);
   if (done) return;
   StdDraw.setPenColor(StdDraw.GRAY);
   StdDraw.filledCircle(x + 0.5, y + 0.5, 0.25);
   StdDraw.show(30);
 }
示例#7
0
 /**
  * 猫由身体(三角形)、头(圆形)、左耳(三角形)、右耳(三角形)构成 已知中心坐标(x, y) 身体三角形:(x, y + 3)、(x - 2.5, y - 9)、(x + 2.5, y -
  * 9) 头:圆心(x, y + 5),半径2.5 左耳三角形:(x, y + 5)、(x - 2.5, y + 5)、(x - 2.5, y + 10) 右耳三角形:(x, y + 5)、(x
  * + 2.5, y + 5)、(x + 2.5, y + 10)
  */
 private void drawCat(double x, double y) {
   StdDraw.setPenColor(StdDraw.BLACK);
   StdDraw.filledPolygon(new double[] {x, x - 2.5, x + 2.5}, new double[] {y + 3, y - 9, y - 9});
   StdDraw.filledCircle(x, y + 5, 2.5);
   StdDraw.filledPolygon(new double[] {x, x - 2.5, x - 2.5}, new double[] {y + 5, y + 5, y + 10});
   StdDraw.filledPolygon(new double[] {x, x + 2.5, x + 2.5}, new double[] {y + 5, y + 5, y + 10});
   StdDraw.setPenRadius(0.005);
   StdDraw.line(x - 2, y - 8, x - 5, y);
 }
示例#8
0
 // 描绘当前场景
 public void show(int t) {
   StdDraw.clear();
   StdDraw.setFont(font1);
   for (int i = 0; i < 9; i++) {
     for (int j = 0; j < 9; j++) {
       if (board[i][j] <= 0) StdDraw.setPenColor(StdDraw.LIGHT_GRAY);
       else StdDraw.setPenColor(StdDraw.ORANGE);
       StdDraw.filledCircle(getX(i, j), getY(i), 10); // 画格子
       if (board[i][j] == 20) drawShit(getX(i, j), getY(i)); // 画猫屎
       else if (board[i][j] > 0 && board[i][j] < 10) { // 填数字
         StdDraw.setPenColor(StdDraw.RED);
         StdDraw.text(getX(i, j), getY(i) - 2, String.valueOf(board[i][j]));
       }
     }
   }
   drawCat(getX(cat.getPos() / 9, cat.getPos() % 9), getY(cat.getPos() / 9)); // 画猫
   StdDraw.setFont(font2);
   StdDraw.setPenColor(StdDraw.ORANGE);
   StdDraw.text(175, 195, "已用:" + count + " 步"); // 右上角步数统计
   StdDraw.show(t); // 延时
 }
示例#9
0
  public NFADemo(String regexp) {
    // use stack to keep track of the positions of '('and '|'
    // issue : or的优先级最低
    Stack<Integer> ops = new Stack<Integer>();
    re = regexp.toCharArray();
    M = re.length;
    G = new Digraph(M + 1);

    // 第一次遍历,确定层次,仅为作图用
    int[] levels = new int[M]; // levels仅在 * 和 | 处非零
    for (int i = 0; i < M; i++) {
      int lp = i;
      if (re[i] == '(' || re[i] == '|') ops.push(i);
      else if (re[i] == ')') {
        int or = ops.pop();
        if (re[or] == '|') {
          lp = ops.pop();
          levels[or] = maxOfArr(levels, lp, i) + 1;
        } else lp = or;
      }
      if (i < M - 1 && re[i + 1] == '*') levels[i + 1] = maxOfArr(levels, lp, i + 1) + 1;
    }
    int maxLevel = maxOfArr(levels, 0, M);

    StdDraw.setCanvasSize(800, 800 * 2 * maxLevel / M);
    StdDraw.setXscale(0, M);
    StdDraw.setYscale(-maxLevel, maxLevel);

    double r = 0.2;
    for (int v = 0; v < G.V(); v++) {
      if (v < M) {
        StdDraw.circle((double) v, 0.0, r);
        StdDraw.text((double) v, 0.0, (new Character(re[v]).toString()));
      } else StdDraw.filledCircle((double) v, 0.0, r);
    }

    StdDraw.setPenColor(StdDraw.RED);
    StdDraw.setPenRadius(0.005);
    ops = new Stack<Integer>();
    for (int i = 0; i < M; i++) {
      int lp = i;
      if (re[i] == '(' || re[i] == '|') ops.push(i);
      else if (re[i] == ')') {
        int or = ops.pop();
        if (re[or] == '|') {
          lp = ops.pop();
          G.addEdge(lp, or + 1);
          G.addEdge(or, i);

          // connect (lp, or+1), (or, i)
          double level = (double) levels[or];
          StdDraw.line(or, r, or, level);
          StdDraw.line(or, level, i, level);
          StdDraw.arrow(i, level, i, r);
          StdDraw.line(lp, -r, lp, -level);
          StdDraw.line(lp, -level, or + 1, -level);
          StdDraw.filledArrow(or + 1, -level, or + 1, -r);
        } else lp = or; // 此时是'(', 在后面跟的是*时会用到
      }
      if (i < M - 1 && re[i + 1] == '*') {
        // look ahead
        G.addEdge(lp, i + 1);
        G.addEdge(i + 1, lp);

        // connect (lp, i+1), (i+1, lp)
        double level = (double) levels[i + 1];
        StdDraw.line(i + 1, r, i + 1, level);
        StdDraw.line(i + 1, level, lp, level);
        StdDraw.filledArrow(lp, level, lp, r);
        StdDraw.line(lp, -r, lp, -level);
        StdDraw.line(lp, -level, i + 1, -level);
        StdDraw.filledArrow(i + 1, -level, i + 1, -r);
      }
      if (re[i] == '(' || re[i] == '*' || re[i] == ')') {
        G.addEdge(i, i + 1);
        StdDraw.filledArrow(i + r, 0.0, i + 1 - r, 0.0);
      } else if (re[i] != '|') { // match transitions
        StdDraw.setPenColor();
        StdDraw.filledArrow(i + r, 0.0, i + 1 - r, 0.0);
        StdDraw.setPenColor(StdDraw.RED);
      }
    }
  }