Exercise1_1_31

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();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值