generate square slots
This commit is contained in:
parent
07cf132687
commit
362f1bcc2e
193
corners.c
193
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;
|
||||
|
Loading…
Reference in New Issue
Block a user