package chapterone;
import java.awt.Color;
import java.util.Scanner;
import com.algs4.stdlib.StdDraw;
import com.algs4.stdlib.StdRandom;
public class Exercise1_1_31 {
public static void drawRandConn(int N, double p) {
StdDraw.setCanvasSize(500, 500);// 设置画布大小,顺序不能和下面的语句交换。
StdDraw.setScale(-1.0, 1.0);// 设置x和y 轴的范围
StdDraw.setPenRadius(.015);// 设置画笔的大小
double[][] d = new double[N][2];
for (int i = 0; i < N; i++) {// 获取每一个点的坐标, 核心代码
d[i][0] = Math.cos(2 * Math.PI * i / N);// x坐标
d[i][1] = Math.sin(2 * Math.PI * i / N);// y坐标
/***
* 一个数的cos和sin值的范围为-1到1,这就决定了上面的x,y轴的范围。
* 又因为同一个数的sin的平方,和cos的平方相加的和为1, 所以,(x,y)肯定在以(0,0)为圆心,半径为1的圆上。
*/
// 输出各点坐标
String xx = String.format("%.2f", 2 * Math.PI * i / N);
String yy = String.format("%.2f", 2 * Math.PI * i / N);
String x = String.format("%.2f", d[i][0]);
String y = String.format("%.2f", d[i][1]);
System.out.println(i + 1 + ": " + xx + ", " + yy + " " + x
+ ", " + y);
/***
* 坐标输出结果如下: 1: 0.00, 0.00 1.00, 0.00 2: 0.42, 0.42 0.91, 0.41 3:
* 0.84, 0.84 0.67, 0.74 4: 1.26, 1.26 0.31, 0.95 5: 1.68, 1.68
* -0.10, 0.99 6:2.09, 2.09 -0.50, 0.87 7: 2.51, 2.51 -0.81, 0.59 8:
* 2.93, 2.93 -0.98, 0.21 9: 3.35, 3.35 -0.98, -0.21 10: 3.77, 3.77
* -0.81,-0.59 11: 4.19, 4.19 -0.50, -0.87 12: 4.61, 4.61 -0.10,
* -0.99 13:5.03, 5.03 0.31, -0.95 14: 5.45, 5.45 0.67, -0.74 15:
* 5.86, 5.86 0.91, -0.41
*
* 由此可知代码d[i][0] = Math.cos(2 * Math.PI * i/N);
*
* 中除以N的用途:平分0~N之间的数。
*/
StdDraw.point(d[i][0], d[i][1]);// 在指定的坐标处画一个点
}
StdDraw.setPenRadius();// 画笔半径默认值为0.002
for (int i = 0; i < N - 1; i++)
for (int j = i + 1; j < N; j++)
if (StdRandom.bernoulli(p))// 概率判断
/***
* boolean bernoull(double p){ return uniform()<p; }
*
* double uniform(){ return random.nextDouble(); }
*/
StdDraw.line(d[i][0], d[i][1], d[j][0], d[j][1]);
// 坐标判断
StdDraw.setPenRadius(0.05);
StdDraw.setPenColor(Color.RED);
StdDraw.point(-1, 0);
StdDraw.setPenColor(Color.BLUE);
StdDraw.point(1, 0);
StdDraw.setPenColor(Color.green);
StdDraw.point(0.91, 0.41);
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
// int N = scan.nextInt();
int N = 15;
// double p = scan.nextDouble();
double p = 1;
p = Math.max(0, Math.min(1, p));// 值得学习的写法
drawRandConn(N, p);
scan.close();
}
}
Exercise1_1_31
最新推荐文章于 2020-02-11 04:18:42 发布