// Shows duals for points and lines. // 3/27/05 BPW #include #include // These map coordinates to 0 ... 530 #define TRANSX(X) (530.0*((X)-xmin)/diff) #define TRANSY(Y) (530.0*((Y)-ymin)/diff) main() { float diff=24.0,xmin=(-12.0),ymin=(-12.0); float m,b,x,y; int map; char pointLabel='a',lineLabel='A'; fprintf(stderr,"Enter map # in 1..7\n"); scanf("%d",&map); if (map<1 || map>7) exit(0); printf("%%!PS\n"); printf("%%%%BoundingBox: 0 0 605 755\n"); /* The +72 shifts the figure one inch from the lower left corner */ printf("40 155 translate\n"); printf("/Helvetica findfont\n"); printf("12 scalefont\n"); printf("setfont\n"); //Mark origin printf("%f %f 3 0 360 arc stroke\n",TRANSX(0.0),TRANSY(0.0)); fprintf(stderr,"Enter points to dualize (-99 -99 to terminate)\n"); fprintf(stderr,"Output will be heavy\n"); while (1) { scanf("%f %f",&x,&y); if (x>50.0 || x<(-50.0)) break; printf("newpath\n"); printf("%f %f 3 0 360 arc fill\n",TRANSX(x),TRANSY(y)); printf("%f %f moveto\n",TRANSX(x)+5.0,TRANSY(y)-2.0); printf("(%c) show\n",pointLabel++); switch (map) { case 1: m=(-x/y); b=(-1.0/y); break; case 2: m=x; b=y; break; case 3: m=x*2.0; b=(-y); break; case 4: m=(-x/y); b=1.0/y; break; case 5: m=x; b=(-y); break; case 6: m=x/y; b=1.0/y; break; case 7: m=(-x); b=y; } printf("newpath\n"); // Line in dual fprintf(stderr,"slope & y-intercept: %f %f\n",m,b); printf("%f %f moveto\n",TRANSX(-10.0),TRANSY(-12.0*m+b)); printf("%f %f lineto\n",TRANSX(10.0),TRANSY(12.0*m+b)); printf("stroke\n"); printf("newpath\n"); printf("%f %f 2 0 360 arc stroke\n",TRANSX(0.0),TRANSY(b)); printf("%f %f moveto\n",TRANSX(0.0)+5.0,TRANSY(b)-2.0); printf("(%c) show\n",lineLabel++); } printf("0 setlinewidth\n"); fprintf(stderr,"Enter slope and intercept for lines to dualize\n"); fprintf(stderr,"Output will be light\n"); printf("0.5 setgray\n"); // Lines next while (1) { scanf("%f %f",&m,&b); if (b>50.0 || b<(-50.0)) break; printf("%f %f moveto\n",TRANSX(-50.0),TRANSY(-50.0*m+b)); printf("%f %f lineto\n",TRANSX(50.0),TRANSY(50.0*m+b)); printf("stroke\n"); switch (map) { case 1: y=(-1.0/b); x=(-m*y); break; case 2: x=m; y=b; break; case 3: x=m/2.0; y=(-b); break; case 4: y=1.0/b; x=(-m*y); break; case 5: x=m; y=(-b); break; case 6: y=1.0/b; x=m*y; break; case7: x=(-m); y=b; } // Point in dual fprintf(stderr,"x & y: %f %f\n",x,y); printf("newpath\n"); printf("%f %f 2 0 360 arc fill\n",TRANSX(x),TRANSY(y)); } printf("showpage\n"); printf("%%EOF\n"); }