最初的目标
给定正多边形中心,给定正多边形边数,画一个正多边形出来。
需要使用的数学知识有
1.正多边形任意相邻两个顶点所成夹角相等,并且其度数为360/N(边数)
2.三角函数的知识,从下图可以得到任意顶点Px=(CenterX+cos(a*x),CenterY+sin(a*x));其中x为下标,(CenterX,CenterY)为中心坐标
接着实现就好;
图摘自简书文章https://www.jianshu.com/p/6d84b901becd
实现之后
在上面的基础上,做了如下改动
1.只单纯画顶点,而不连接边
2.让多边形的顶点以一定的概率成对连线,并且以动画的形式实现。具体代码如下
```
import edu.princeton.cs.algs4.StdDraw;
import edu.princeton.cs.algs4.StdRandom;
import java.util.Arrays;
public class StdTest {
public static void main(String[] args)
{
int N=10;
double rate=0.41;
double cirSize=5;
double distance=5;
int totalSize=50;
// Point[] points=new Point[N];
drawPolygon(45,rate);
}
static void drawPolygon(int N,double rate)
{
StdDraw.setCanvasSize(1000,1000);
StdDraw.setXscale(0,N);
StdDraw.setYscale(0,N);
StdDraw.setPenRadius(0.01);
double[] xs=new double[N];
double[] ys=new double[N];
double centerX=N/2.0;
double centerY=N/2.0;
xs[0]=N;
ys[0]=N/2.0;
for(int i=1;i<N;i++)
{
double radis=Math.PI*2/N*i;
xs[i]=Math.cos(radis)*N/2+centerX;
ys[i]=Math.sin(radis)*N/2+centerY;
}
// xs[N]=N;
// xs[N]=N/2.0;
System.out.println(Arrays.toString(xs));
System.out.println(Arrays.toString(ys));
for(int i=0;i<N;i++)
{
StdDraw.point(xs[i],ys[i]);
}
int startUp=0;
while (startUp<N-1)
{
for(int i=startUp+1;i<N;i++)
{
if(StdRandom.random()<=rate)
{
StdDraw.line(xs[startUp],ys[startUp],xs[i],ys[i]);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
startUp++;
}
}
}
```
程序所依赖的库可以在算法第四版这本书的配套网站下下载。程序比较简单,也没有什么可说的点。但是笔者表示虽然程序很简单。但是实现之后看起来的效果非常解压。
网友评论