/* *PvDim.c,版权所有(c)1999-2002 Jean-Paul Davalan。**29900 Concarneau(法国)le:3月21日星期日09:57:19 GMT+0200 1999**$修改日期:2002年11月10日上午22:49:23 CET**PvDim是自由软件;您可以重新发布和/或修改*它根据由*自由软件基金会;版本2或(根据您的选择)*任何更高版本。**发布PvDim是为了希望它有用,*但无任何保证;甚至没有*适销性或特定用途的适用性。请参阅*GNU通用公共许可证了解更多详细信息。**您应该已经收到GNU通用公共许可证的副本*以及PvDim;请参阅文件COPYING。如果没有,请写信给*自由软件基金会,675 Mass Ave,Cambridge,MA 02139,USA。**#####1####杰恩·鲍尔·达瓦兰*杰恩·鲍尔·达瓦兰**gcc-O3-o pvdim pvdim.c-lm**/#包括#包括#包括#包括#包括#包括#包括#包括#包括#如果索引PI#定义PI M_PI#结尾#定义版本“0.1”#定义MAXRECURS 8//迭代#定义KMAX 6#定义最大值(U,V)((U>V)?U: 五)#定义最小值(U,V)((U= 3)opt_verbose=1;}断裂;案例“d”:opt_stat=1;断裂;案例“r”:if(optarg)递归=atoi(optarg);断裂;大小写“k”:if(optarg)klimit=atoi(optarg);断裂;违约:错误标志++;断裂;}}if(错误标志){帮助(argc,argv);出口(2);}}/*---------------------------------------------------------------*/无效初始化(void){/*可简化分解*/if(angledgr!=0){如果(angartdgr==0&&angenddgr==180){angenddgr=angstartdgr+angledgr;}else if(angstartdgr!=0&&angenddgr==180){angenddgr=angstartdgr+angledgr;}否则,如果(angstartdgr!=0&&angenddgr!=180){angledgr=angenddgr-angstartdgr;}其他{angledgr=angenddgr-angstartdgr;}}其他{angledgr=angenddgr-angstartdgr;}如果(angledgr==0){angenddgr=angstartdgr+180;angledgr=180;}if(膨胀<1){fprintf(stderr,“Erreur,l'expansion doit etre>=1\n”);出口(1);}如果(X0==0&&Y0==O){fprintf(stderr,“Erreur,le 1er vecteur est nul\n”);出口(1);}如果(X1==0&&Y1==0){fprintf(stderr,“Erreur,le 2eme vecteur est nul\n”);出口(1);}如果(X0==X1&&Y0==Y1){fprintf(stderr,“Erreur,les deux vecteurs sont egaux \n”);出口(1);}}/*---------------------------------------------------------------*/双aire(双u0、双u1、双v0、双v1、双ang,双*lw,双*lh,双*err){整数n;双a0,b0,a1,b1,eh,ew;双co,si,t,x0,y0,x1,y1,ax0,ay0,ax1,ay1,prec=精度;t=ang*PI/180;co=cos(t);si=sin(t);x0=u0*co-u1*si;/*横坐标1er vecteur après旋转角度+°*/y0=u0*si+u1*co;x1=v0*co-v1*si;y1=v0*si+v1*co;ax0=工厂(x0);ay0=晶圆厂(y0);ax1=工厂(x1);ay1=工厂(y1);n=fcont(&a0,&b0,-y1,y0,prec);/*a0 fois le 1er+b0 fois le2ème vecteur horiz*/n=fcont(&a1,&b1,-x1,x0,prec);*lw=工厂(a0*x0+b0*x1);*lh=工厂(a1*y0+b1*y1);eh=工厂(a0*y0+b0*y1);ew=工厂(a1*x0+b1*x1);*err=最大值(eh,ew);如果(*lw<1|*lh<1)返回-1;返回(*lw)*(*lh);}/*---------------------------------------------------------------*/int fcont(双*ap,双*bp,双u,双v,双w){双a,b,s,r,a0=0,b0=1,a1=1,b1=0,赋值,bsign;整数k=0;浮动x;/*关于doit增益ap/bp=u/v*/asign=签名(u);bsign=签名(v);u=晶圆厂(u);v=工厂(v);w=工厂(w);w=(w==0)?1:w;如果(u==0|v==0){*ap=签名(u);*bp=签名(v);返回0;}其他{x=u/v;r=x;while(1){/*for(;k)klimit*u |b>klimit*v){*ap=符号*a0;/*关于récupère la valeur précédente*/*bp=bsign*b0;返回(k-1);}如果(k>=递归)/*eliminer si for*/返回k;k++;}返回k;}}/*---------------------------------------------------------------*/空封(双Xa,双Ya,双Xb,双Yb,双alp,双ai、双wm、双hm、双erreur){双a,r,coef=展开;a=工厂(X0*Y1-X1*Y0);r=wm*hm/a;如果(r>=1&&r<=系数)打印(“a:%.5f,”//角度“p:%.0f,”//aire(像素?)“r:%.1f,”//商des aires“l:%.2f”//大结局“h:%.2f,”//豪特“e:%.4f\n”//错误(像素高或宽),alp,wm*hm,r,wm,hm,erreur);}/*---------------------------------------------------------------*/长时间(无效){return(((long)clock()*1000)/CLOCKS_PER_SEC);}/*---------------------------------------------------------------*/无效帮助(int argc,char*argv[]){字符**pt;fprintf(stderr,“用法:%s选项\n”,argv[0]);for(pt=helparr;*pt;pt++)fprintf(标准错误,“%s\n”,*pt);fprintf(标准错误,//“示例:%s-x 115-y 65-e 30\n”“示例:%s-x 132-y 94-e 30\n”“--------\n”“Le program sélectionon les rotations les plus favorables,compte tenu\n”“扩张指标的决策和监督(1和20部分)。”“\n”//“La sortie sur stdout est une suite de lignes comme celle-ci:\n”“a:35.10200,p:37224,r:3.0,l:162.05,h:229.71,e:0.9997\n”//“ang 30.126,aire 29120,largeur 129.5,hauteur 224.9\n”//“la largeur et la hauteur usibiliables sont environ 130 et 225 pour un angle\n”//“图像去旋转30.126度。\n”“162和230环境下的大型和高级可利用性“图像去旋转35.102度。\n”“La rotation estáintroduire dans le fichier postscript enécrivant:\n”//“30.126旋转\n”“35.102旋转\n”“在教堂套间的现代图像辅助波恩维度上:\n”“gs-q-dSAFER-dNOPAUSE-sDEVICE=ppm-g162x230-sOutputFile=-\n”//“gs-q-dSAFER-dNOPAUSE-sDEVICE=ppm-g130x225-sOutputFile=-\n”“--退出<fic.ps>fic.ppm\n\n”“更改de type de fichier en faisant:\n”“ppmtogif fic.ppm>fic.gif;rm fic.ppm \n\v”“我最谨慎的d'effectuer des essais avec des angles”“alpha”“différents\n”“倒入choisir'image qui convent le mieux。\n”“法律程序”(a bien moins de 1°près)peuvent conduire““des tailles très differentes.\n”“在peut aussi obtenir une图像au格式gif:\n”“pstoimg-gif-out fic.gif fic.ps\n”“(例如le pstoimg fourni avec htmltolatex)\n”“Ou en prenant l’image complete dans xv on peut sélectionner une partie\n”“rectangulaire aux dimensions souhaitées(功能作物),vérifier le bon\n”“raccordement(Root:中心平铺)effectuer des transformations\n”“(浮雕…)(饱和度…)\n”“《不可见的录像带》(La qualitédu résultat se jugera a La non-visibilitédes raccordements\n)”“d图像。\n”“\n”“错误:\n”“-----\n”“Très peu testé,mal corrigé,des modifications sont\n”“commocées mais ne sont pas termine es。\n”“Ce程序est-une-repse rapide d'un程序plus\n”“简单。没有重新定义总环境。\n”“klimit entre autres ne semble pas avoir d'effect。\n”“分数的使用继续,a revoir。\n”“Les valeurs优化了sont elles obtenues?”“\n”“Ne pas utiler les résultats de ce计划,\n”“---------------------------------------------\n”“(sauf peut-átre si cette utilization ne peut avoir aucune consequence\n”“fâcheuse,aussi minime soit elle and uniquement si les résultats sont\n”“vérifiés.)\n”,argv[0]);退出(0);}/*---------------------------------------------------------------*/无效版权(int argc,char*argv[]){fprintf(标准输出,“应用程序%s(PvDim),版权所有(C)1998 Jean-Paul Davalan。\n\n”“29900 Concarneau(法国)le:3月21日星期日09:57:19 GMT+0200 1999\n”“dim nov 10 22:49:23 CET 2002 \n\n”“%s(PvDim)是自由软件;您可以重新发布和/或修改它。”“它根据由发布的GNU通用公共许可证的条款\n”“自由软件基金会;版本2,或(根据您的选择)\n”“任何更高版本。\n\n”“分发%s(PvDim)是为了希望它有用,\n”“但没有任何担保;甚至没有隐含的担保。”“适销性或特定用途的适用性。请参阅\n”“GNU通用公共许可证获取更多详细信息。\n”“您应该已经收到GNU通用公共许可证的副本。”与%s(PvDim)一起;请参阅文件COPYING。如果不是,请写入\n“自由软件基金会,675 Mass Ave,Cambridge,MA 02139,USA。\n\n”//“让-保罗·达瓦兰\n““Jean-Paul Davalan\n“、argv[0]、argv[0]、argv[0]、argv[0]);}/*---------------------------------------------------------------*/void main_run(int argc,char*argv[]){double _aire、aire0、aire1、aire2、airemin、airemax、anglemin、alpha;双w0,w1,w2,h0,h1,h2,e0,e1,e2,wmin,hmin,err;_aire=工厂(X0*Y1-X1*Y0);airemax=airemin=_aire*扩展*10;aire0=aire(X0,Y0,X1,Y1,angstartdgr-2*步长,&w0,&h0,&e0);如果(air0>0){airemin=aire0;airemax=aire0;}err=1000*精度;aire1=aire(X0,Y0,X1,Y1,angstartdgr-步骤,&w1,&h1,&e1);for(α=埃开始时间;α<=angenddgr;α+=步长){aire2=aire(X0、Y0、X1、Y1、alpha、&w2、&h2、&e2);如果(aire2>0&&e2<精度&&aire2<airemin){anglemin=α;airemin=aire2;wmin=w2;hmin=h2;err=e2;}如果(e1<精度&&空气流量2>0&& (((aire1<=0||aire1<aire0)&&(aire2<=0||aire1<=aire2))||((广播0<=0||aire1<=aire0)&&(aire2<=0||aire1<aire2)))) {affiche(X0,Y0,X1,Y1,alpha-step,aire1,w1,h1,e1);}aire0=aire1;aire1=aire2;w0=w1;h0=h1;w1=w2;h1=h2;e0=e1;e1=e2;}fprintf(标准输出,“最佳:\n”);affiche(X0,Y0,X1,Y1,anglemin,airemin,wmin,hmin,err);}/*---------------------------------------------------------------*/char*strtolcase(char*s){字符*p;for(p=s;*p!='\x0';p++)if(isalpha(*p))*p=公差(*p);返回s;}/*---------------------------------------------------------------*/char*strtoucase(char*s){字符*p;for(p=s;*p!='\x0';p++)if(isalpha(*p))*p=尖峰(*p);返回s;}/*---------------------------------------------------------------*/无效版本(int argc,char*argv[]){if(strcasecmp(argv[0],应用程序名)==0)fprintf(标准输出,“%s版本%s(属于%s)\n”,strtoucase(应用程序名),版本,日期);其他的fprintf(标准输出,“%s(%s)版本%s(属于%s)\n”,strtoucase(应用程序名),argv[0],版本,日期);退出(0);}/*---------------------------------------------------------------*/void begin_application(int argc,char*argv[]){字符*s;if(opt_stat){date_begin=时间(NULL);cpu_begin=cputime();fprintf(标准输出,“%s正在运行\n”,strtoucase(应用程序名));s=我的日期(date_begin);fprintf(标准输出,“开始:%s\n”,s);空闲;}/*初始化dans init*/}/*---------------------------------------------------------------*/void end_application(int argc,char*argv[]){字符*s;长cpudiff;if(opt_stat){cpudiff=(cpu_end=cputime())-cpu_begin;s=cpu_past(cpudiff);fprintf(标准输出,“cpu时间:%s\n”,s);fprintf(标准输出,“%s完成\n”,strtoucase(应用程序名));}}/*---------------------------------------------------------------*/#如果(d>X),定义TIMETOSTRING(X,Y){\如果(X>0){\tmp=d/(X)\d=d%(X)\}其他\tmp=d\chn[0]=“\x0”\sprintf(chn,“%ld%s”,tmp,Y)\strcat(str,chn)\}char*cpu_past(长d){长tmp;char chn[100];char*str=(char*)malloc(100*sizeof(char));*str=“\x0”;如果(d<10){strcat(str,“0 ms”);}其他{计时(86400000,“d”);计时(3600000,“h”);计时(60000,“分钟”);计时(1000,“s”);计时(0,“ms”);}str=(char*)realloc(str,(strlen(str)+1));返回(str);}/*---------------------------------------------------------------*/字符*my_date(时间t){struct tm*tm;char*str,chn[100];chn[0]=“\x0”;tm=克时(-t);strftime(chn,60,“%A%B%d-%H小时%M分钟%S GMT-%Y”,tm);str=(char*)malloc((strlen(chn)+1)*sizeof(char));str=strcpy(str,chn);返回str;}/*---------------------------------------------------------------*/无效init_rand(void){srand((无符号int)(时间(NULL)*getpid()));}/*---------------------------------------------------------------返回une valeur entre 0 et 1*/双my_rand(无效){return((双)rand())/(rand_MAX+1.0);}/*---------------------------------------------------------------*/