diff options
| author | Jesper Jensen <jesper@jnsn.dev> | 2026-05-31 13:00:12 +0200 |
|---|---|---|
| committer | Jesper Jensen <jesper@jnsn.dev> | 2026-05-31 13:00:12 +0200 |
| commit | 0c650783315066f3e1e6af7967a95c4ee8e5200e (patch) | |
| tree | 166bc274e8211ace6155c7f593e72788afefcff4 /src/construction.c | |
| parent | 099690b0b50b3df68562130874887ca2ce08460e (diff) | |
Place two assemblies at the same time
It's drawing the box correctly, but some of the constraints seem wonky.
I don't think this is correct, but it is sort of working.
Diffstat (limited to 'src/construction.c')
| -rw-r--r-- | src/construction.c | 93 |
1 files changed, 88 insertions, 5 deletions
diff --git a/src/construction.c b/src/construction.c index 33f37ad..f175f79 100644 --- a/src/construction.c +++ b/src/construction.c @@ -87,6 +87,8 @@ static void transform_part(struct command *cmd, const struct command *last_cmd, switch(cmd->op) { case CMD_VALUE_INPUT: case CMD_OFFSET_INPUT: + case CMD_MEASURE_POINT_LINE_DISTANCE: + case CMD_MEASURE_LINE_LINE_ANGLE: break; case CMD_LINE_X: case CMD_LINE_POINT_POINT: @@ -127,6 +129,7 @@ static void transform_part(struct command *cmd, const struct command *last_cmd, break; case CMD_IMPORT_POINT_LINE: + case CMD_IMPORT_LINE_LINE: transform_part(cmd->d->first_command, cmd->d->last_command, transform); break; } @@ -137,6 +140,64 @@ static void transform_part(struct command *cmd, const struct command *last_cmd, } } +void dump_program(struct drawing *drawing, double inputs[]) { + for(struct command *current = drawing->root; current != NULL; current = current->next) { + switch(current->op) { + case CMD_VALUE_INPUT: { + fprintf(stderr, "%p -> LIT(%d, %f) = %f\n", ¤t->result, current->dir, inputs[current->index], current->result.value); + }break; + case CMD_OFFSET_INPUT: { + fprintf(stderr, "%p -> OFF(%f, %d, %f) = %f\n", ¤t->result, current->arg1->value, current->dir, inputs[current->index], current->result.value); + }break; + case CMD_ORIGIN: { + fprintf(stderr, "%p -> ZER() = <%f, %f>\n", ¤t->result, current->result.point.pos[0], current->result.point.pos[1]); + }break; + case CMD_LINE_X: { + fprintf(stderr, "%p -> LNX() = (%fx + %fy + %f = 0)\n", ¤t->result, current->result.line.norm[0], current->result.line.norm[1], current->result.line.C); + }break; + case CMD_CIRCLE_CENTER_RADIUS: { + fprintf(stderr, "%p -> CCR(%p, %p) = ((x-%f)^2 + (y-%f)^2 = %f^2)\n", ¤t->result, current->arg1, current->arg2, current->result.circle.center[0], current->result.circle.center[1], current->result.circle.radius); + }break; + case CMD_LINE_POINT_POINT: { + fprintf(stderr, "%p -> LPP(%p, %p) = (%fx + %fy + %f = 0)\n", ¤t->result, current->arg1, current->arg2, current->result.line.norm[0], current->result.line.norm[1], current->result.line.C); + }break; + case CMD_LINE_POINT_LINE_ANGLE: { + fprintf(stderr, "%p -> PLA(%p, %p, %p) = (%fx + %fy + %f = 0)\n", ¤t->result, current->arg1, current->arg2, current->arg3, current->result.line.norm[0], current->result.line.norm[1], current->result.line.C); + }break; + case CMD_LINE_LINE_DISTANCE_PARALLEL: { + fprintf(stderr, "%p -> LDP(%p, %p) = (%fx + %fy + %f = 0)\n", ¤t->result, current->arg1, current->arg2, current->result.line.norm[0], current->result.line.norm[1], current->result.line.C); + }break; + case CMD_LINE_CIRCLE_CIRCLE_TANGENT: { + fprintf(stderr, "%p -> CCT(%p, %p) = (%fx + %fy + %f = 0)\n", ¤t->result, current->arg1, current->arg2, current->result.line.norm[0], current->result.line.norm[1], current->result.line.C); + }break; + case CMD_POINT_CIRCLE_LINE: { + fprintf(stderr, "%p -> PCL(%p, %p) = <%f, %f>\n", ¤t->result, current->arg1, current->arg2, current->result.point.pos[0], current->result.point.pos[1]); + }break; + case CMD_POINT_CIRCLE_CIRCLE: { + fprintf(stderr, "%p -> PCC(%p, %p) = <%f, %f>\n", ¤t->result, current->arg1, current->arg2, current->result.point.pos[0], current->result.point.pos[1]); + }break; + case CMD_POINT_LINE_LINE: { + fprintf(stderr, "%p -> PLL(%p, %p) = <%f, %f>\n", ¤t->result, current->arg1, current->arg2, current->result.point.pos[0], current->result.point.pos[1]); + }break; + case CMD_CIRCLE_CENTER_POINT: { + fprintf(stderr, "%p -> CCR(%p, %p) = ((x-%f)^2 + (y-%f)^2 = %f^2)\n", ¤t->result, current->arg1, current->arg2, current->result.circle.center[0], current->result.circle.center[1], current->result.circle.radius); + }break; + case CMD_IMPORT_POINT_LINE: { + fprintf(stderr, "%p -> IMP(%p, %p, %p, %p) = <N/A>\n", ¤t->result, current->arg1, current->arg2, current->attachp, current->attachl); + }break; + case CMD_IMPORT_LINE_LINE: { + // Deprecated + }break; + case CMD_MEASURE_POINT_LINE_DISTANCE: { + fprintf(stderr, "%p -> MPL(%p, %p) = %f\n", ¤t->result, current->arg1, current->arg2, current->result.value); + }break; + case CMD_MEASURE_LINE_LINE_ANGLE: { + fprintf(stderr, "%p -> MLL(%p, %p) = %f\n", ¤t->result, current->arg1, current->arg2, current->result.value); + }break; + } + } +} + void place_points(struct drawing *drawing, double inputs[]) { struct command *outer_object = drawing->root; @@ -272,28 +333,50 @@ void place_points(struct drawing *drawing, double inputs[]) { assert(current->d != NULL); assert(current->attachp != NULL); assert(current->attachl != NULL); + assert(current->attachp->type == ETYPE_POINT); + assert(current->attachl->type == ETYPE_LINE); double theta; // Align the two lines theta = atan2(current->arg2->line.norm[1], current->arg2->line.norm[0]) - atan2(current->attachl->line.norm[1], current->attachl->line.norm[0]); - fprintf(stderr, "%f\n", theta / M_PI * 180.0); mat3 transform; glm_mat3_identity(transform); - glm_translate2d(transform, current->attachp->point.pos); + glm_translate2d(transform, current->arg1->point.pos); glm_rotate2d(transform, theta); { vec2 negative_translate; - glm_vec2_negate_to(current->arg1->point.pos, negative_translate); + glm_vec2_negate_to(current->attachp->point.pos, negative_translate); glm_translate2d(transform, negative_translate); } - fprintf(stderr, "Assembly %p %p %p %f\n", current->d, current->d->first_command, current->d->last_command, theta); + fprintf(stderr, "Assembly %p %p %p %f %f %f\n", current->d, current->d->first_command, current->d->last_command, transform[2][0], transform[2][1], theta); transform_part(current->d->first_command, current->d->last_command, transform); }break; + case CMD_IMPORT_LINE_LINE: { + abort(); + }break; + case CMD_MEASURE_POINT_LINE_DISTANCE: { + assert(current->arg1->type == ETYPE_POINT); + assert(current->arg2->type == ETYPE_LINE); + assert(current->result.type == ETYPE_VALUE); + + double dot = glm_vec2_dot(current->arg2->line.norm, current->arg1->point.pos); + current->result.value = (dot + current->arg2->line.C) / glm_vec2_norm(current->arg2->line.norm); + fprintf(stderr, "Measured Distance %f\n", current->result.value); + }break; + case CMD_MEASURE_LINE_LINE_ANGLE: { + assert(current->arg1->type == ETYPE_LINE); + assert(current->arg2->type == ETYPE_LINE); + assert(current->result.type == ETYPE_VALUE); + + double theta = atan2(current->arg1->line.norm[1], current->arg1->line.norm[0]) - atan2(current->arg2->line.norm[1], current->arg2->line.norm[0]); + current->result.value = theta; + fprintf(stderr, "Measured Angle %f\n", current->result.value); + }break; } // printf("%fx + %fy + %f = 0\n", cmd[2].line.norm[0], cmd[2].line.norm[1], cmd[2].line.C); } @@ -323,7 +406,7 @@ void place_points(struct drawing *drawing, double inputs[]) { glm_translate2d(transform, negative_translate); } - fprintf(stderr, "W %f %f\n", origin->result.point.pos[0], origin->result.point.pos[1]); + fprintf(stderr, "W %f %f %f\n", origin->result.point.pos[0], origin->result.point.pos[1], theta); transform_part(outer_object, NULL, transform); } } |
