//作家斯图亚特·埃罗尔·安德森;// 2015// stuart.errol.anderson@gmail.com//n-gon等边多边形,角度乘以pi/n#包括#包括#包括#包括#包括#包括#包括#包括#包括#定义PI 3.14159265358979323846/////////////////////////////////使用命名空间标准;结构点{双x;双y;};结构边缘{点p;点q;};//给定三个共线点p、q、r,该函数检查//点q位于线段“pr”上段上的bool(点p、点q、点r){如果(q.x<=标准::最大(p.x,r.x)&&q.x>=标准:&&q.y<=标准值::最大值(p.y,r.y)&&q.y>=标准值返回true;返回false;}//求有序三元组(p,q,r)的方向。//函数返回以下值//0-->p、q和r共线//1-->顺时针//2-->逆时针int方向(点p、点q、点r){//有关公式的推导,请参阅以下链接中的第10张幻灯片// http://www.dcs.gla.ac.uk/~pat/52233/slides/Geometry1x1.pdf双val=(q.y-p.y)*(r.x-q.x)-(q.x-p.x)*(r.y-q.y);双ε=0.000001;如果(abs(val)<epsilon)返回0;//共线返回(val>0)?1: 2; // 顺时针或逆时针}//如果线段“p1q1”,则返回true的主函数//和“p2q2”相交。布尔doIntersect(点p1,点q1,点p2,点q2){//找出一般和//特殊情况int o1=方向(p1,q1,p2);int o2=方向(p1,q1,q2);int o3=方向(p2,q2,p1);int o4=方向(p2,q2,q1);//一般情况如果(o1!=o2&&o3!=o4)返回true;//特殊情况//p1、q1和p2共线,p2位于段p1q1上如果(o1==0&&onSegment(p1,p2,q1))返回true;//p1、q1和p2共线,q2位于段p1q1上如果(o2==0&&onSegment(p1,q2,q1))返回true;//p2、q2和p1共线并且p1位于片段p2q2上如果(o3==0&&onSegment(p2,p1,q2))返回true;//p2、q2和q1共线,q1位于段p2q2上如果(o4==0&&onSegment(p2,q1,q2))返回true;返回false;//不属于上述任何情况}void polygonSearch(标准::矢量&ixs,const std::矢量&endPerIndex,无符号int currentIndex,unsigned int n){if(currentIndex==ixs.size()){//计算多边形路径顶点的x、y分量;多边形是等边的;从头到尾添加矢量无符号int sum=0;双sx=0.0;双sy=0.0;矢量Vx;矢量Vy;双倍d=0.0;双ε=0.000001;字符串str;字符串文件名;串流ss;流myfile的;for(unsigned int c=0;c!=n-1;c++){//第一个顶点总是(1,0)Vx.push_back(cos((c*n-sum)*PI/n));sx+=Vx[c];Vx[c]=sx;Vy.推回(sin((c*n-sum)*PI/n));sy+=Vy[c];Vy[c]=sy;总和+=ixs[c];//ixs[c]包含c-th指数的值。} //不需要第n个回路,因为我们可以使用n-gon的内角之和=(n-2)*180,无符号int li=(n-2)*n-sum;//最后一个索引li=(n-2)*n-前n-1个角度之和[n个角度倍数=180=pi]如果((总和>=(n-2)*n)|(li>2*n-1))返回;//拒绝这些情况(在最后一个索引上获取-ve)或角度>=2piVx.push_back(cos((n*(n-1)-sum)*PI/n));sx+=Vx[n-1];Vx[n-1]=sx;Vy.推回(sin((n*(n-1)-sum)*PI/n));sy+=Vy[n-1];Vy[n-1]=sy;sum+=li;//ixs[c]包含c-th指数的值。d=sqrt(sx*sx+sy*sy);如果(d角度;for(无符号整数j=0;j!=n-1;j++){角度推回(ixs[j]);}角度推回(li);内部温度=0;长整数;无符号int索引1=0;long int min=pow(n,n);for(无符号整数k=0;k!=n;k++){//右移位循环阵列元素1位置温度=角度[0];for(无符号整数j=0;j!=n;j++){角度[j]=角度[j+1];}角度[angle.size()-1]=温度;//从数组值中生成以2n-2为基数的数字数字=0;for(无符号整数j=0;j!=n;j++){数字+=角度[j]*pow(n,n-j-1);}//如果它是目前为止最小的,则使其最小,保存移位值if(数字<分钟){min=数量;指数1=k;} 数字=0;}//将数组值右循环b位以获得正则角度排序for(无符号整数k=0;k!=索引1+1;k++){//右移位循环阵列元素1位置temp=角度[0];for(无符号整数j=0;j!=n;j++){角度[j]=角度[j+1];}角度[angle.size()-1]=温度;}for(无符号整数k=0;k!=n;k++){cout公司<边缘;for(无符号整数a=0;an) 避免=true;}if(intersect_count>0){避免=true;}//将A4页面中的多边形居中,595 x 842,居中;(297.5421)//多边形的最大直径为n/2;不能向任何方向延伸n/2(展平多边形)if(避免==false){双xscale=330/(n/2);//为多边形解决方案创建postscript文件-标签;凹凸结str=“%!PS-Adobe-\n”;str+=“带pi/的等边多边形百分比”;不锈钢<= 3 ; “<<argv[0]<<”n“<<std::endl;退出(0);}无符号int n=atoi(argv[1]);字符串str;字符串文件名;串流ss;流myfile的;//从顶层调用polygonSearch的设置需要两个向量-一个用于索引,ixs//每个级别的迭代次数为endPerIndex。下面的示例设置了n-1个嵌套循环,在每个级别迭代2n-1次:矢量ixs(n-1,0);矢量每个索引结束;endPerIndex.push_back(n-1);for(无符号整数c=1;c!=n;c++){endPerIndex.push_back(n+1);}多边形搜索(ixs,endPerIndex,0,n);返回(0);}