/* Program to generate wireframe model of 3D objects Niels Lund, September 1998 */ /* Each object in the model is defined by a number of generator lines which are rotated around an axis to form the object. The generator lines can consist of up to 9 straight line segments defined by points in the arrays h[10] and ra[10]. Cylinders and cones are produced by using many generators (defined by ). A simple box can be described by a generator consisting of a single straight line defined by two points (imax=2), repeated four times (nmax=4). The resulting wireframe model is written to disk (balle.pnt) */ /* Special version for the Ballerina Small Satellite Niels Lund, October 1998 */ #include #include #include int calpoint(int, int, int); int calrect(double, double, int); FILE *out1,*out2; double BA_TO_WA[3][3], displ[3], xw[3], xb[2000][3], h[10], ra[10]; double pi = 3.141593; int pointnum, linenum, facenum; void main(int argc, char* argv) { double al, dx, dy, mkg, msum, msum_x, msum_y, msum_z, z_cg, z_mount, r_mount; double xmnt, ymnt, zmnt; int i, j, k, l, m, n, w, nr, nmax, imax; char s[256]; char *ss; al = 109.0 * pi / 180.0 ; /* al is the characteristic angle between the normals to the tetrahedron faces */ pointnum = 1; linenum = 0; facenum = 0; msum = msum_x = msum_y = msum_z = 0.0L; nmax = 15; if (argc>1) nmax = argv[1]; if (nmax > 90) nmax = 90; out1 = fopen("balle.pnt","wt") ; /* Output file */ if ( out1 == NULL ) { printf("File opening error!!!\n") ; exit(0) ; } out2 = fopen("temp.lin","wt") ; /* temporary file */ if ( out1 == NULL ) { printf("File opening error!!!\n") ; exit(0) ; } fprintf(out1, "# Wireframe model of the Ballerina satellite. Niels Lund, sept 98"); imax = 8; /* generator line for a WATCH detector */ h[0] = 0.0L; h[1] = 11.6L; h[2] = 14.6L; h[3] = 19.0L; h[4] = 19.0L; h[5] = 22.5L; h[6] = 22.5L; h[7] = 28.0L; ra[0] = 4.0L; ra[1] = 4.0L; ra[2] = 7.0L; ra[3] = 7.0L; ra[4] = 8.5L; ra[5] = 8.5L; ra[6] = 12.0L; ra[7] = 13.0L; /* WATCH 0 */ mkg = 4.0; /* mass of unit (kg) */ z_cg = 20.5; /* CG distance from reference point */ z_mount = 19.0; /* Mounting surface distance from ref. pnt. */ r_mount = 8.0; /* Radius of mounting circle */ displ[0] = 0.0L; displ[1] = 15.0L; displ[2] = 51.5L; BA_TO_WA[0][0] = 1.0 ; /* WATCH 0 x-axis in BALLERINA */ BA_TO_WA[1][0] = 0.0 ; BA_TO_WA[2][0] = 0.0 ; BA_TO_WA[0][1] = 0.0 ; /* WATCH 0 y-axis in BALLERINA */ BA_TO_WA[1][1] = 1.0 ; BA_TO_WA[2][1] = 0.0 ; BA_TO_WA[0][2] = 0.0 ; /* WATCH 0 z-axis in BALLERINA */ BA_TO_WA[1][2] = 0.0 ; BA_TO_WA[2][2] = 1.0 ; pointnum = calpoint(nmax, imax, pointnum); msum += mkg; msum_x += mkg * (displ[0] + BA_TO_WA[0][2] * z_cg); msum_y += mkg * (displ[1] + BA_TO_WA[1][2] * z_cg); msum_z += mkg * (displ[2] + BA_TO_WA[2][2] * z_cg); linenum += nmax * imax; xmnt = displ[0] + BA_TO_WA[0][2] * z_mount; ymnt = displ[1] + BA_TO_WA[1][2] * z_mount; zmnt = displ[2] + BA_TO_WA[2][2] * z_mount; printf("\n WATCH 0. Mount center (x,y,z cm): %4.1lf, %4.1lf, %4.1lf; Radius: %3.1lf", xmnt, ymnt, zmnt, r_mount); printf("\n WATCH 0. Mass %4.1lf kg, CG-Mount sep: %4.1lf cm, Vector: %4.3lf, %4.3lf, %4.3lf\n", mkg, z_cg-z_mount, BA_TO_WA[0][2], BA_TO_WA[1][2], BA_TO_WA[2][2]); /* WATCH 1 */ displ[0] = 5.0L; displ[1] = -15.0L; displ[2] = 27.5L; BA_TO_WA[0][0] = cos(al) ; /* WATCH 1 x-axis in BALLERINA */ BA_TO_WA[1][0] = 0.0 ; BA_TO_WA[2][0] = sin(al) ; BA_TO_WA[0][1] = 0.0 ; /* WATCH 1 y-axis in BALLERINA */ BA_TO_WA[1][1] = 1.0 ; BA_TO_WA[2][1] = 0.0 ; BA_TO_WA[0][2] = -sin(al) ; /* WATCH 1 z-axis in BALLERINA */ BA_TO_WA[1][2] = 0.0 ; BA_TO_WA[2][2] = cos(al) ; pointnum = calpoint(nmax, imax, pointnum); msum += mkg; msum_x += mkg * (displ[0] + BA_TO_WA[0][2] * z_cg); msum_y += mkg * (displ[1] + BA_TO_WA[1][2] * z_cg); msum_z += mkg * (displ[2] + BA_TO_WA[2][2] * z_cg); linenum += nmax * imax; xmnt = displ[0] + BA_TO_WA[0][2] * z_mount; ymnt = displ[1] + BA_TO_WA[1][2] * z_mount; zmnt = displ[2] + BA_TO_WA[2][2] * z_mount; printf("\n WATCH 1. Mount center (x,y,z cm): %4.1lf, %4.1lf, %4.1lf; Radius: %3.1lf", xmnt, ymnt, zmnt, r_mount); printf("\n WATCH 1. Mass %4.1lf kg, CG-Mount sep: %4.1lf cm, Vector: %4.3lf, %4.3lf, %4.3lf\n", mkg, z_cg-z_mount, BA_TO_WA[0][2], BA_TO_WA[1][2], BA_TO_WA[2][2]); /* WATCH 2 */ displ[0] = 0.0L; displ[1] = 0.0L; displ[2] = 21.5L; BA_TO_WA[0][0] = cos(al) * cos(0.6667L*pi); /* WATCH 2 x-axis in BALLERINA */ BA_TO_WA[1][0] = cos(al) * sin(0.6667L*pi); BA_TO_WA[2][0] = sin(al) ; BA_TO_WA[0][1] = -sin(0.6667L*pi); /* WATCH 2 y-axis in BALLERINA */ BA_TO_WA[1][1] = cos(0.6667L*pi); BA_TO_WA[2][1] = 0.0; BA_TO_WA[0][2] = -sin(al) * cos(0.6667L*pi); /* WATCH 2 z-axis in BALLERINA */ BA_TO_WA[1][2] = -sin(al) * sin(0.6667L*pi); BA_TO_WA[2][2] = cos(al) ; pointnum = calpoint(nmax, imax, pointnum); msum += mkg; msum_x += mkg * (displ[0] + BA_TO_WA[0][2] * z_cg); msum_y += mkg * (displ[1] + BA_TO_WA[1][2] * z_cg); msum_z += mkg * (displ[2] + BA_TO_WA[2][2] * z_cg); linenum += nmax * imax; xmnt = displ[0] + BA_TO_WA[0][2] * z_mount; ymnt = displ[1] + BA_TO_WA[1][2] * z_mount; zmnt = displ[2] + BA_TO_WA[2][2] * z_mount; printf("\n WATCH 2. Mount center (x,y,z cm): %4.1lf, %4.1lf, %4.1lf; Radius: %3.1lf", xmnt, ymnt, zmnt, r_mount); printf("\n WATCH 2. Mass %4.1lf kg, CG-Mount sep: %4.1lf cm, Vector: %4.3lf, %4.3lf, %4.3lf\n", mkg, z_cg-z_mount, BA_TO_WA[0][2], BA_TO_WA[1][2], BA_TO_WA[2][2]); /* WATCH 3 */ displ[0] = -5.0L; displ[1] = 0.0L; displ[2] = 25.5L; BA_TO_WA[0][0] = cos(al) * cos(-0.6667L*pi); /* WATCH 3 x-axis in BALLERINA */ BA_TO_WA[1][0] = cos(al) * sin(-0.6667L*pi); BA_TO_WA[2][0] = sin(al) ; BA_TO_WA[0][1] = -sin(-0.6667L*pi); /* WATCH 3 y-axis in BALLERINA */ BA_TO_WA[1][1] = cos(-0.6667L*pi); BA_TO_WA[2][1] = 0.0; BA_TO_WA[0][2] = -sin(al) * cos(-0.6667L*pi); /* WATCH 3 z-axis in BALLERINA */ BA_TO_WA[1][2] = -sin(al) * sin(-0.6667L*pi); BA_TO_WA[2][2] = cos(al) ; pointnum = calpoint(nmax, imax, pointnum); msum += mkg; msum_x += mkg * (displ[0] + BA_TO_WA[0][2] * z_cg); msum_y += mkg * (displ[1] + BA_TO_WA[1][2] * z_cg); msum_z += mkg * (displ[2] + BA_TO_WA[2][2] * z_cg); linenum += nmax * imax; xmnt = displ[0] + BA_TO_WA[0][2] * z_mount; ymnt = displ[1] + BA_TO_WA[1][2] * z_mount; zmnt = displ[2] + BA_TO_WA[2][2] * z_mount; printf("\n WATCH 3. Mount center (x,y,z cm): %4.1lf, %4.1lf, %4.1lf; Radius: %3.1lf", xmnt, ymnt, zmnt, r_mount); printf("\n WATCH 3. Mass %4.1lf kg, CG-Mount sep: %4.1lf cm, Vector: %4.3lf, %4.3lf, %4.3lf\n", mkg, z_cg-z_mount, BA_TO_WA[0][2], BA_TO_WA[1][2], BA_TO_WA[2][2]); /* Telescope */ mkg = 8.0; /* mass of unit (kg) */ z_cg = 57.5; /* CG distance from reference point */ z_mount = 60.0; /* Mounting surface distance from ref. pnt. */ r_mount = 16.0; /* Radius of mounting circle */ imax = 3; h[0] = 0.0L; /* Focal plane ned of telescope */ h[1] = 20.0L; /* Intermediate level */ h[2] = 77.0L; /* Telescope aperture end */ ra[0] = 5.0L; /* radius at focal plane end */ ra[1] = 5.0L; /* radius at intermediate level */ ra[2] = 16.0L; /* radius at aperture end */ displ[0] = -13.0L; displ[1] = 0.0L; displ[2] = 1.0L; BA_TO_WA[0][0] = cos(-0.18L); BA_TO_WA[1][0] = 0.0 ; BA_TO_WA[2][0] = sin(-0.18); BA_TO_WA[0][1] = 0.0L; BA_TO_WA[1][1] = cos(0.18L); BA_TO_WA[2][1] = sin(0.18L); BA_TO_WA[0][2] = -sin(-0.18); BA_TO_WA[1][2] = -sin(0.18L) ; BA_TO_WA[2][2] = cos(0.18L)*cos(-0.18); pointnum = calpoint(nmax, imax, pointnum); msum += mkg; msum_x += mkg * (displ[0] + BA_TO_WA[0][2] * z_cg); msum_y += mkg * (displ[1] + BA_TO_WA[1][2] * z_cg); msum_z += mkg * (displ[2] + BA_TO_WA[2][2] * z_cg); linenum += nmax * imax; xmnt = displ[0] + BA_TO_WA[0][2] * z_mount; ymnt = displ[1] + BA_TO_WA[1][2] * z_mount; zmnt = displ[2] + BA_TO_WA[2][2] * z_mount; printf("\n Telescope Mount center (x,y,z cm): %4.1lf, %4.1lf, %4.1lf; Radius: %3.1lf", xmnt, ymnt, zmnt, r_mount); printf("\n Telescope Mass %4.1lf kg, CG-Mount sep: %4.1lf cm, Vector: %4.3lf, %4.3lf, %4.3lf\n", mkg, z_cg-z_mount, BA_TO_WA[0][2], BA_TO_WA[1][2], BA_TO_WA[2][2]); /* Satellite Body */ mkg = 20.8; /* mass of unit (kg) */ z_cg = 30.0; /* CG distance from reference point */ z_mount = 0.0; /* Mounting surface distance from ref. pnt. */ imax = 2; nmax = 4; h[0] = 0.0L; h[1] = 80.0L; dx = 25.0L; dy = 30.0L; ra[0] = sqrt(dx*dx + dy*dy); ra[1] = sqrt(dx*dx + dy*dy); displ[0] = 0.0L; displ[1] = 0.0L; displ[2] = 0.0L; BA_TO_WA[0][0] = 1.0L; BA_TO_WA[1][0] = 0.0L; BA_TO_WA[2][0] = 0.0L; BA_TO_WA[0][1] = 0.0L; BA_TO_WA[1][1] = 1.0L; BA_TO_WA[2][1] = 0.0L; BA_TO_WA[0][2] = 0.0L; BA_TO_WA[1][2] = 0.0L; BA_TO_WA[2][2] = 1.0L; pointnum = calrect(dx, dy, pointnum); msum += mkg; msum_x += mkg * (displ[0] + BA_TO_WA[0][2] * z_cg); msum_y += mkg * (displ[1] + BA_TO_WA[1][2] * z_cg); msum_z += mkg * (displ[2] + BA_TO_WA[2][2] * z_cg); linenum += nmax * imax; xmnt = displ[0] + BA_TO_WA[0][2] * z_mount; ymnt = displ[1] + BA_TO_WA[1][2] * z_mount; zmnt = displ[2] + BA_TO_WA[2][2] * z_mount; printf("\n Sat. Body Mount center (x,y,z cm): %4.1lf, %4.1lf, %4.1lf; Rect: %3.0lfx%3.0lf", xmnt, ymnt, zmnt, dx+dx, dy+dy); printf("\n Sat. Body Mass %4.1lf kg, CG-Mount sep: %4.1lf cm, Vector: %4.3lf, %4.3lf, %4.3lf\n", mkg, z_cg-z_mount, BA_TO_WA[0][2], BA_TO_WA[1][2], BA_TO_WA[2][2]); /* Electronics Box 1 */ mkg = 17.4; /* mass of unit (kg) */ z_cg = 19.0; /* CG distance from reference point */ z_mount = 0.0; /* Mounting surface distance from ref. pnt. */ imax = 2; nmax = 4; h[0] = 0.0L; h[1] = 38.0L; dx = 9.5L; dy = 12.0L; ra[0] = sqrt(dx*dx + dy*dy); ra[1] = sqrt(dx*dx + dy*dy); displ[0] = -15.5L; displ[1] = 18.0L; displ[2] = 0.0L; pointnum = calrect(dx, dy, pointnum); msum += mkg; msum_x += mkg * (displ[0] + BA_TO_WA[0][2] * z_cg); msum_y += mkg * (displ[1] + BA_TO_WA[1][2] * z_cg); msum_z += mkg * (displ[2] + BA_TO_WA[2][2] * z_cg); linenum += nmax * imax; xmnt = displ[0] + BA_TO_WA[0][2] * z_mount; ymnt = displ[1] + BA_TO_WA[1][2] * z_mount; zmnt = displ[2] + BA_TO_WA[2][2] * z_mount; printf("\n El. Box 1 Mount center (x,y,z cm): %4.1lf, %4.1lf, %4.1lf; Rect: %3.0lfx%3.0lf", xmnt, ymnt, zmnt, dx+dx, dy+dy); printf("\n El. Box 1 Mass %4.1lf kg, CG-Mount sep: %4.1lf cm, Vector: %4.3lf, %4.3lf, %4.3lf\n", mkg, z_cg-z_mount, BA_TO_WA[0][2], BA_TO_WA[1][2], BA_TO_WA[2][2]); /* Electronics Box 2 */ mkg = 8.0; /* mass of unit (kg) */ z_cg = 10.0; /* CG distance from reference point */ z_mount = 0.0; /* Mounting surface distance from ref. pnt. */ imax = 2; nmax = 4; h[0] = 0.0L; h[1] = 20.0L; dx = 9.5L; dy = 12.0L; ra[0] = sqrt(dx*dx + dy*dy); ra[1] = sqrt(dx*dx + dy*dy); displ[0] = 15.5L; displ[1] = -18.0L; displ[2] = 27.0L; pointnum = calrect(dx, dy, pointnum); msum += mkg; msum_x += mkg * (displ[0] + BA_TO_WA[0][2] * z_cg); msum_y += mkg * (displ[1] + BA_TO_WA[1][2] * z_cg); msum_z += mkg * (displ[2] + BA_TO_WA[2][2] * z_cg); linenum += nmax * imax; xmnt = displ[0] + BA_TO_WA[0][2] * z_mount; ymnt = displ[1] + BA_TO_WA[1][2] * z_mount; zmnt = displ[2] + BA_TO_WA[2][2] * z_mount; printf("\n El. Box 2 Mount center (x,y,z cm): %4.1lf, %4.1lf, %4.1lf; Rect: %3.0lfx%3.0lf", xmnt, ymnt, zmnt, dx+dx, dy+dy); printf("\n El. Box 2 Mass %4.1lf kg, CG-Mount sep: %4.1lf cm, Vector: %4.3lf, %4.3lf, %4.3lf\n", mkg, z_cg-z_mount, BA_TO_WA[0][2], BA_TO_WA[1][2], BA_TO_WA[2][2]); /* Battery */ mkg = 8.0; /* mass of unit (kg) */ z_cg = 4.3; /* CG distance from reference point */ z_mount = 0.0; /* Mounting surface distance from ref. pnt. */ imax = 2; nmax = 4; h[0] = 0.0L; h[1] = 8.5L; dx = 5.5L; dy = 12.5L; ra[0] = sqrt(dx*dx + dy*dy); ra[1] = sqrt(dx*dx + dy*dy); displ[0] = 19.5L; displ[1] = 2.0L; displ[2] = 0.0L; pointnum = calrect(dx, dy, pointnum); msum += mkg; msum_x += mkg * (displ[0] + BA_TO_WA[0][2] * z_cg); msum_y += mkg * (displ[1] + BA_TO_WA[1][2] * z_cg); msum_z += mkg * (displ[2] + BA_TO_WA[2][2] * z_cg); linenum += nmax * imax; xmnt = displ[0] + BA_TO_WA[0][2] * z_mount; ymnt = displ[1] + BA_TO_WA[1][2] * z_mount; zmnt = displ[2] + BA_TO_WA[2][2] * z_mount; printf("\n Battery Mount center (x,y,z cm): %4.1lf, %4.1lf, %4.1lf; Rect: %3.0lfx%3.0lf", xmnt, ymnt, zmnt, dx+dx, dy+dy); printf("\n Battery Mass %4.1lf kg, CG-Mount sep: %4.1lf cm, Vector: %4.3lf, %4.3lf, %4.3lf\n", mkg, z_cg-z_mount, BA_TO_WA[0][2], BA_TO_WA[1][2], BA_TO_WA[2][2]); /* *************************** */ /* Summary print */ printf("\n points: %4d, line segments: %4d, faces: %3d\n", pointnum, linenum, facenum); printf("\n Total mass: %4.1lf kg, CG-position (x,y,z cm): %4.1lf, %4.1lf, %4.1lf", msum, msum_x/msum, msum_y/msum, msum_z/msum); fclose(out2); out2 = fopen("balle.lin","rt") ; if ( out1 == NULL ) { printf("File opening error!!!\n") ; exit(0) ; } while (fgets(s, imax, out2) != NULL) fputs(s, out1); fcloseall(); } /* **************************************************************** */ int calpoint(int nmax, int imax, int pointnum) { double angle, delta, cang, sang; int n, i, m, k, mmax; m = 0; mmax = nmax * imax; delta = 2.0 * pi / nmax; angle = delta / 2.0L; for (n=0; n