算法(第4版本)1.1.31

随机连接

编写一段程序,从命令行接受一个整数N和double值p(0到1之间)作为参数,在一个圆上画出大小为0.05且间距相等的N个点,然后将每对点按照概率p用灰线连接。

可参看 https://github.com/aistrate/AlgorithmsSedgewick 给出的解答,我在他答案基础上,进行了理解。(以前的几何知识全忘记了。。。)

算法(第4版本)1.1.31_第1张图片


private static void test31(){
      int N = 5;
      double p = 0.3;
      double x0 = 0.5;
      double y0 = 0.5;
      double r = 0.2;
      StdDraw.setCanvasSize(500, 500);
      StdDraw.setPenRadius(0.0005);
      StdDraw.setPenColor(Color.RED);
      StdDraw.circle(x0, y0, r);//(x-x0)^2+(y-x0)^2=r^2 圆的公式
      
      //cosa * cosa + sina * sina = 1
      //所以下面的points点满足圆的公式;
      //两点间距离公式:(AB)^2 = (x1-x2)^2 + (y1-y2)^2
      //cosAcosB+sinAsinB=cos(A-B)
      //(cosA)^2+(sinA)^2 = r^2;
      //(cosB)^2+(sinB)^2 = r^2;
      //套入距离公式x1:cosA y1:sinA x2:cosB y2:sinB,就可知点1(cosA,sinA)点2(cosB,sinB)点3(cosC,sinC)只有能满足
      //A-B = B-C,就能满足点1,点2,点3间距相等
      double[][] points = new double[N][2];
      StdDraw.setPenRadius(0.05);
      for (int i = 0; i < N; i++) {
          points[i][0] = Math.cos(2 * Math.PI * i / N) / 5.0 + x0;
          points[i][1] = Math.sin(2 * Math.PI * i / N) / 5.0 + y0;
          System.out.println(i + " : " + (points[i][0] * points[i][0] + points[i][1] * points[i][1]) );
          StdDraw.point(points[i][0], points[i][1]);
      }
      
      StdDraw.setPenRadius();

      for (int i = 0; i < N - 1; i++){
          for (int j = i + 1; j < N; j++){
              if (StdRandom.bernoulli(p)){
                  StdDraw.line(points[i][0], points[i][1], points[j][0], points[j][1]);
              }
          }
      }
  }


你可能感兴趣的:(算法第4版学习笔记)