두 직선의 교점 구하기(202510043 이경훈) - aksrud/3kingOfGod GitHub Wiki

#include <stdio.h>
#include <stdlib.h>

typedef struct Point {
	int x, y;
} Point;

typedef struct Line {
	Point *p1, *p2;
	float slope, intercept;
	char isVertical = 0;
} Line;

void calculateLine(Line* line, Point* p1, Point* p2) {
	line->p1 = p1;
	line->p2 = p2;
	if (p1->x == p2->x) {
		line->isVertical = 1;
		return;
	}
	else if (p1->y == p2->y) {
		line->slope = 0;
		line->intercept = p1->y;
		return;
	}
	else {
		line->slope = (float)(p2->y - p1->y) / (float)(p2->x - p1->x);
		line->intercept = (float)(p1->y) - line->slope * p1->x;
		return;
	}
}

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");
		}
	}
	else if (!line1->isVertical) {
		float y = (float)(line2->slope * line1->p1->x + line2->intercept);
		printf("직선이 (%d, %g)에서 만납니다.\n", line1->p1->x, y);
	}
	else if (!line2->isVertical) {
		float y = (float)(line1->slope * line2->p1->x + line1->intercept);
		printf("직선이 (%d, %g)에서 만납니다.\n", line2->p1->x, y);
	}
	else if (line1->slope == line2->slope) {
		if (line1->intercept == line2->intercept) {
			printf("직선이 겹친다.\n");
		}
		else {
			printf("직선이 평행합니다\n");
		}
	}
	else {
		float x = (float)((line2->intercept - line1->intercept) / (line1->slope - line2->slope));
		float y = (float)(line1->slope * x + line1->intercept);
		printf("직선이 (%g, %g)에서 만납니다.\n", x, y);
	}
}

int main() {
	// 좌표 입력
	Point p1, p2;
	Point p3, p4;
	printf("첫 번째 좌표를 입력해주세요 (x y): ");
	scanf_s("%d %d", &p1.x, &p1.y);
	printf("두 번째 좌표를 입력해주세요 (x y): ");
	scanf_s("%d %d", &p2.x, &p2.y);

	printf("세 번째 좌표를 입력해주세요 (x y): ");
	scanf_s("%d %d", &p3.x, &p3.y);
	printf("네 번째 좌표를 입력해주세요 (x y): ");
	scanf_s("%d %d", &p4.x, &p4.y);

	// 메모리 할당
	Line *line1, *line2;
	line1 = (Line*)malloc(sizeof(Line));
	line2 = (Line*)malloc(sizeof(Line));
	if (line1 == NULL || line2 == NULL) {
		printf("Memory allocation failed.\n");
		return -1;
	}

	// 직선 구하기
	calculateLine(line1, &p1, &p2);
	calculateLine(line2, &p3, &p4);

	// 교점 구하기
	printMeetPoint(line1, line2);
	return 0;
}
⚠️ **GitHub.com Fallback** ⚠️