diff --git a/corners.c b/corners.c index ddfdc57..2e19542 100644 --- a/corners.c +++ b/corners.c @@ -14,6 +14,105 @@ #include "stl_3d.h" +static void +make_faces( + const stl_3d_t * const stl, + const stl_vertex_t * const v, + const double thickness, + const double inset_dist, + const double hole_dist, + const double hole_rad +) +{ + int * const face_used = calloc(sizeof(*face_used), stl->num_face); + const double hole_height = 40; + + // generate all of the coplanar polygons at this vertex + const stl_vertex_t ** const vertex_list = calloc(sizeof(**vertex_list), stl->num_vertex); + + for (int j = 0 ; j < v->num_face; j++) + { + // generate the polygon face for this vertex + const stl_face_t * const f = v->face[j]; + if (face_used[f - stl->face]) + continue; + + const int start_vertex = v->face_num[j]; + const int vertex_count = stl_trace_face( + stl, + f, + vertex_list, + face_used, + start_vertex + ); + + refframe_t ref; + refframe_init(&ref, + f->vertex[(start_vertex+0) % 3]->p, + f->vertex[(start_vertex+1) % 3]->p, + f->vertex[(start_vertex+2) % 3]->p + ); + + // use the transpose of the rotation matrix, + // which will rotate from (x,y) to the correct + // orientation relative to this connector node. + printf("multmatrix(m=[[%f,%f,%f,0],[%f,%f,%f,0],[%f,%f,%f,0],[0,0,0,1]]) {\n", + ref.x.p[0], + ref.y.p[0], + ref.z.p[0], + ref.x.p[1], + ref.y.p[1], + ref.z.p[1], + ref.x.p[2], + ref.y.p[2], + ref.z.p[2] + ); + + // generate the polygon plane + printf("translate([0,0,%f]) linear_extrude(height=%f) polygon(points=[\n", + -thickness/2, + thickness + ); + + for(int k=0 ; k < vertex_count ; k++) + { + double x, y; + refframe_inset(&ref, inset_dist, &x, &y, + vertex_list[(k+0) % vertex_count]->p, + vertex_list[(k+1) % vertex_count]->p, + vertex_list[(k+2) % vertex_count]->p + ); + printf("[%f,%f],", x, y); + } + printf("\n]);\n"); + + // generate the mounting holes + if (hole_rad) + { + for(int k=0 ; k < vertex_count ; k++) + { + double x, y; + refframe_inset(&ref, inset_dist+hole_dist, &x, &y, + vertex_list[(k+0) % vertex_count]->p, + vertex_list[(k+1) % vertex_count]->p, + vertex_list[(k+2) % vertex_count]->p + ); + printf("translate([%f,%f,0]) cylinder(r=%f,h=%f, center=true, $fs=1);\n", + x, y, + hole_rad, + hole_height + ); + } + } + + printf("}\n"); + } + + free(face_used); + free(vertex_list); +} + + int main(void) { @@ -28,100 +127,32 @@ main(void) // for each vertex, find the coplanar triangles // \todo: do coplanar bits - const stl_vertex_t ** const vertex_list = calloc(sizeof(**vertex_list), stl->num_vertex); - for(int i = 0 ; i < stl->num_vertex ; i++) + for(int i = 18 ; i < stl->num_vertex ; i++) { const stl_vertex_t * const v = &stl->vertex[i]; const v3_t origin = v->p; printf("// vertex %d\n" - "translate([%f,%f,%f])\n" + "//translate([%f,%f,%f])\n" "render() difference()\n" "{\n" - "sphere(r=15);\n", - i, origin.p[0], origin.p[1], origin.p[2]); + "//sphere(r=%f);\n", + i, origin.p[0], origin.p[1], origin.p[2], thickness/2); - int * const face_used = calloc(sizeof(*face_used), stl->num_face); + printf("render() intersection() {\n"); + printf("sphere(r=20);\nunion() {\n"); + make_faces(stl, v, 2*thickness, -thickness/2, 0, 0); + printf("}\n"); + printf("}\n"); - for (int j = 0 ; j < v->num_face; j++) - { - // generate the polygon face for this vertex - const stl_face_t * const f = v->face[j]; - if (face_used[f - stl->face]) - continue; - const int start_vertex = v->face_num[j]; - const int vertex_count = stl_trace_face( - stl, - f, - vertex_list, - face_used, - start_vertex - ); + make_faces(stl, v, thickness, inset_dist, hole_dist, hole_rad); - refframe_t ref; - refframe_init(&ref, - f->vertex[(start_vertex+0) % 3]->p, - f->vertex[(start_vertex+1) % 3]->p, - f->vertex[(start_vertex+2) % 3]->p - ); - - // use the transpose of the rotation matrix, - // which will rotate from (x,y) to the correct - // orientation relative to this connector node. - printf("multmatrix(m=[[%f,%f,%f,0],[%f,%f,%f,0],[%f,%f,%f,0],[0,0,0,1]]) {\n", - ref.x.p[0], - ref.y.p[0], - ref.z.p[0], - ref.x.p[1], - ref.y.p[1], - ref.z.p[1], - ref.x.p[2], - ref.y.p[2], - ref.z.p[2] - ); - - // generate the polygon plane - printf("translate([0,0,%f]) linear_extrude(height=%f) polygon(points=[\n", - -thickness/2, - thickness - ); - - for(int k=0 ; k < vertex_count ; k++) - { - double x, y; - refframe_inset(&ref, inset_dist, &x, &y, - vertex_list[(k+0) % vertex_count]->p, - vertex_list[(k+1) % vertex_count]->p, - vertex_list[(k+2) % vertex_count]->p - ); - printf("[%f,%f],", x, y); - } - printf("\n]);\n"); - - // generate the mounting holes - for(int k=0 ; k < vertex_count ; k++) - { - double x, y; - refframe_inset(&ref, inset_dist+hole_dist, &x, &y, - vertex_list[(k+0) % vertex_count]->p, - vertex_list[(k+1) % vertex_count]->p, - vertex_list[(k+2) % vertex_count]->p - ); - printf("translate([%f,%f,0]) cylinder(r=%f,h=%f, center=true);\n", - x, y, - hole_rad, - hole_height - ); - } - - printf("}\n"); - } - - free(face_used); printf("}\n"); - //if (i == 2) break; // only do one right now + + break; + //if (i == 0) break; // only do one right now } return 0;