두 직선의 교점 구하기(202510082한성태) - aksrud/3kingOfGod GitHub Wiki
#include <stdio.h> #include <stdlib.h>
typedef struct { int x, y; } Point;
typedef struct { Point *p1, *p2; float slope; float intercept; char isVertical; } Line;
void calculateLine(Line *line, Point *p1, Point *p2) { line->p1 = p1; line->p2 = p2;
if (p1->x == p2->x) {
line->isVertical = 1;
return;
}
line->isVertical = 0;
line->slope = (float)(p2->y - p1->y) / (float)(p2->x - p1->x);
line->intercept = p1->y - line->slope * p1->x;
}
void printMeetPoint(Line *line1, Line *line2) { if (line1->isVertical && line2->isVertical) { if (line1->p1->x == line2->p1->x) { printf("직선이 겹칩니다 (x = %d).\n", line1->p1->x); } else { printf("직선이 평행합니다 (모두 수직).\n"); } return; }
if (line1->isVertical) {
float y = line2->slope * line1->p1->x + line2->intercept;
printf("교점: (%d, %g)\n", line1->p1->x, y);
return;
}
if (line2->isVertical) {
float y = line1->slope * line2->p1->x + line1->intercept;
printf("교점: (%d, %g)\n", line2->p1->x, y);
return;
}
if (line1->slope == line2->slope) {
if (line1->intercept == line2->intercept) {
printf("직선이 겹칩니다.\n");
} else {
printf("직선이 평행합니다.\n");
}
return;
}
float x = (line2->intercept - line1->intercept) / (line1->slope - line2->slope);
float y = line1->slope * x + line1->intercept;
printf("교점: (%g, %g)\n", x, y);
}
int main() { Point p1, p2, p3, p4;
printf("첫 번째 좌표 (x y): ");
scanf("%d %d", &p1.x, &p1.y);
printf("두 번째 좌표 (x y): ");
scanf("%d %d", &p2.x, &p2.y);
printf("세 번째 좌표 (x y): ");
scanf("%d %d", &p3.x, &p3.y);
printf("네 번째 좌표 (x y): ");
scanf("%d %d", &p4.x, &p4.y);
Line *line1 = malloc(sizeof(Line));
Line *line2 = malloc(sizeof(Line));
if (!line1 || !line2) {
printf("메모리 할당 실패\n");
return 1;
}
calculateLine(line1, &p1, &p2);
calculateLine(line2, &p3, &p4);
printMeetPoint(line1, line2);
free(line1);
free(line2);
return 0;
}