#include #include #include "utils.h" #define PUBLIC #define PRIVATE static PUBLIC void ps3d_Preambel(FILE *fp, float view[3], float axis[3], char *projtype); PUBLIC void PS_DrawSimplifiedBox(float X,float Y, float Z, float T, float P, FILE *fp); PUBLIC void ps3d_Preambel(FILE *fp, float view[3], float axis[3], char *projtype) { fprintf(fp,"%%!PS\n"); fprintf(fp,"%%%%Title: RNA DotPlot\n"); fprintf(fp,"%%%%Creator: RNAfold V.01.002c - by Oymolon\n"); fprintf(fp,"%%%%CreationDate: %s", time_stamp()); /* fprintf(fp,"%%%%BoundingBox: 66 211 518 662\n"); */ fprintf(fp,"%%%%Pages: 1\n"); fprintf(fp,"%%%%EndComments: Geil eyh !?\n"); fprintf(fp,"%%Viewing vector\n"); fprintf(fp,"/v1 { %f } def\n", view[0]); fprintf(fp,"/v2 { %f } def\n", view[1]); fprintf(fp,"/v3 { %f } def\n", view[2]); fprintf(fp,"/a1 { %f } def\n", axis[0]); fprintf(fp,"/a2 { %f } def\n", axis[1]); fprintf(fp,"/a3 { %f } def\n", axis[2]); fprintf(fp,"%%Define some coefficients for the projections.\n"); fprintf(fp,"/y1a { v2 a3 mul v3 a2 mul sub } def\n"); fprintf(fp,"/y2a { v3 a1 mul v1 a3 mul sub } def\n"); fprintf(fp,"/y3a { v1 a2 mul v2 a1 mul sub } def\n"); fprintf(fp,"/ya_len { y1a y1a mul y2a y2a mul y3a y3a mul add add sqrt } def\n"); fprintf(fp,"/x1a { v2 y3a mul v3 y2a mul sub } def\n"); fprintf(fp,"/x2a { v3 y1a mul v1 y3a mul sub } def\n"); fprintf(fp,"/x3a { v1 y2a mul v2 y1a mul sub } def\n"); fprintf(fp,"/xa_len { x1a x1a mul x2a x2a mul x3a x3a mul add add sqrt } def\n"); fprintf(fp,"/x1 { x1a xa_len div } def\n"); fprintf(fp,"/x2 { x2a xa_len div } def\n"); fprintf(fp,"/x3 { x3a xa_len div } def\n"); fprintf(fp,"/y1 { y1a ya_len div } def\n"); fprintf(fp,"/y2 { y2a ya_len div } def\n"); fprintf(fp,"/y3 { y3a ya_len div } def\n"); fprintf(fp,"/sx { v1 v3 div } def\n"); fprintf(fp,"/sy { v2 v3 div } def\n"); fprintf(fp,"/v_len { v1 v1 mul v2 v2 mul v3 v3 mul add add sqrt } def\n"); fprintf(fp,"/u_len { v1 v1 mul v2 v2 mul add sqrt } def\n"); fprintf(fp,"/u1 { v2 u_len div } def\n"); fprintf(fp,"/u2 { v1 neg u_len div } def\n"); fprintf(fp,"/w1 { v1 v3 mul neg u_len div v_len div } def\n"); fprintf(fp,"/w2 { v2 v3 mul neg u_len div v_len div } def\n"); fprintf(fp,"/w3 { v1 v1 mul v2 v2 mul add u_len div v_len div } def\n"); fprintf(fp,"%%Projection Operators\n"); fprintf(fp,"%% Projection onto x-y plane in direction v\n"); fprintf(fp,"/ProjXY { dup sx mul 4 -1 roll exch sub \n"); fprintf(fp," 3 1 roll sy mul sub \n"); fprintf(fp," } def \n"); fprintf(fp,"%% Normal Projection onto a plane normal to (v1,v2,v3!=0)\n"); fprintf(fp,"/Projnn { w3 mul 3 1 roll dup w2 mul 3 1 roll u2 mul exch \n"); fprintf(fp," dup w1 mul 3 1 roll u1 mul add 4 1 roll add add \n"); fprintf(fp," } def \n"); fprintf(fp,"%% General Normal Projection\n"); fprintf(fp,"/ProjN { dup y3 mul 4 1 roll x3 mul 3 1 roll dup \n"); fprintf(fp," y2 mul 5 1 roll x2 mul 3 1 roll dup y1 mul \n"); fprintf(fp," 6 1 roll x1 mul add add 4 1 roll add add \n"); fprintf(fp," } def\n"); fprintf(fp,"/Proj { Proj%s } def\n", projtype); fprintf(fp,"/L3 { Proj lineto } def\n"); fprintf(fp,"/RL3 { Proj rlineto } def\n"); fprintf(fp,"/M3 { Proj moveto } def\n"); fprintf(fp,"/RM3 { Proj rmoveto } def\n"); fprintf(fp,"%% end 3D macros\n\n"); } PUBLIC void PS_DrawSimplifiedBox(float X,float Y, float Z, float T, float P, FILE *fp) { float t1, p1, t, lw; t1 = T/sqrt(2.); p1 = P/sqrt(3.); t = X+t1+2*p1; /* approximate size */ lw = 0.001*t; fprintf(fp,"/scaling_factor { %f } def \n", 400./t); fprintf(fp,"%f %f %f Proj \n", X+t1, Y+t1, Z+t1); fprintf(fp,"scaling_factor mul 2 div 300 sub neg exch \n" ); fprintf(fp,"scaling_factor mul 2 div 400 sub neg translate \n"); fprintf(fp,"scaling_factor dup scale\n"); fprintf(fp,"newpath\n"); fprintf(fp,"%f setlinewidth\n",lw); fprintf(fp,"0 0 0 M3\n"); fprintf(fp,"%f %f %f L3\n", X , 0. , 0. ); fprintf(fp,"%f %f %f L3\n", X+t1 , t1 , 0. ); fprintf(fp,"%f %f %f L3\n", X+t1 , Y+t1 , 0. ); fprintf(fp,"%f %f %f L3\n", t1 , Y+t1 , 0. ); fprintf(fp,"%f %f %f L3\n", 0. , Y , 0. ); fprintf(fp,"%f %f %f L3\n", 0. , 0. , 0. ); fprintf(fp,"%f %f %f L3\n", 0. , 0. , Z ); fprintf(fp,"%f %f %f L3\n", 0. , t1 , Z+t1 ); fprintf(fp,"%f %f %f L3\n", 0. , Y+t1 , Z+t1 ); fprintf(fp,"%f %f %f L3\n", 0. , Y+t1 , t1 ); fprintf(fp,"%f %f %f L3\n", 0. , Y , 0. ); fprintf(fp,"%f %f %f L3\n", 0. , 0. , 0. ); fprintf(fp,"stroke\n"); fprintf(fp,"%f %f %f M3\n", t1 , Y+t1 , 0. ); fprintf(fp,"%f %f %f L3\n", 0. , Y+t1 , t1 ); fprintf(fp,"stroke\n"); fprintf(fp,"%f %f %f M3\n", X+t1 , t1 , 0. ); fprintf(fp,"%f %f %f L3\n", X+t1 , 0. , t1 ); fprintf(fp,"%f %f %f L3\n", X+t1 , 0. , Z+t1 ); fprintf(fp,"%f %f %f L3\n", X+t1 , Y , Z+t1 ); fprintf(fp,"%f %f %f L3\n", X+t1 , Y+t1 , Z ); fprintf(fp,"%f %f %f L3\n", X+t1 , Y+t1 , 0. ); fprintf(fp,"%f %f %f L3\n", X+t1 , t1 , 0. ); fprintf(fp,"stroke\n"); fprintf(fp,"%f %f %f M3\n", X+t1 , 0. , Z+t1 ); fprintf(fp,"%f %f %f L3\n", t1 , 0. , Z+t1 ); fprintf(fp,"%f %f %f L3\n", 0. , t1 , Z+t1 ); fprintf(fp,"stroke\n"); fprintf(fp,"%f %f %f M3\n", X+t1 , Y , Z+t1 ); fprintf(fp,"%f %f %f L3\n", X , Y+t1 , Z+t1 ); fprintf(fp,"%f %f %f L3\n", 0. , Y+t1 , Z+t1 ); fprintf(fp,"stroke\n"); fprintf(fp,"%f %f %f M3\n", X , 0. , 0. ); fprintf(fp,"%f %f %f L3\n", X+t1 , 0. , t1 ); fprintf(fp,"stroke\n"); fprintf(fp,"%f %f %f M3\n", 0. , 0. , Z ); fprintf(fp,"%f %f %f L3\n", t1 , 0. , Z+t1 ); fprintf(fp,"stroke\n"); fprintf(fp,"%f %f %f M3\n", X+t1 , Y+t1 , Z ); fprintf(fp,"%f %f %f L3\n", X , Y+t1 , Z+t1 ); fprintf(fp,"stroke\n"); fprintf(fp,"%f %f %f M3\n", 0. , 0. , 0. ); fprintf(fp,"%f %f %f RL3\n", -p1 , -p1 , -p1 ); fprintf(fp,"stroke\n"); fprintf(fp,"%f %f %f M3\n", X+t1 , Y+t1 , 0. ); fprintf(fp,"%f %f %f RL3\n", p1 , p1 , -p1 ); fprintf(fp,"stroke\n"); fprintf(fp,"%f %f %f M3\n", X+t1 , 0. , Z+t1 ); fprintf(fp,"%f %f %f RL3\n", p1 , -p1 , p1 ); fprintf(fp,"stroke\n"); fprintf(fp,"%f %f %f M3\n", 0. , Y+t1 , Z+t1 ); fprintf(fp,"%f %f %f RL3\n", -p1 , p1 , p1 ); fprintf(fp,"stroke\n"); fprintf(fp,"showpage\n"); }