12주차 - Donghwanteam/C2-10 GitHub Wiki
#include <stdio.h>
+ // 점 구조체 정의
typedef struct {
int x;
int y;
} Point;
+ // 두 점을 포인터로 저장
typedef struct {
Point* p1;
Point* p2;
} Line;
+ // 첫번째직선 만드는 함수
void MakeLine1(Line* line, Point* a, Point* b) {
line->p1 = a;
line->p2 = b;
}
+ // 직선에 포함된 점 2개를 출력하는 함수
void PrintLine(Line* line) {
printf("직선은 점 (%d, %d)와 (%d, %d)를 지나요 :D\n",
line->p1->x, line->p1->y,
line->p2->x, line->p2->y);
}
+ // 메인 함수
int main() {
// 점 2개 선언
Point p1 = {2, 3};
Point p2 = {4, 5};
+ // 직선 선언
Line line;
+ // MakeLine1 함수로 직선 생성
MakeLine1(&line, &p1, &p2);
+ // 직선 확인 출력
PrintLine(&line);
return 0;
}
#include <stdio.h>
+ // 점 구조체
typedef struct {
int x;
int y;
} Point;
+ // 직선 구조체
typedef struct {
Point* p1;
Point* p2;
} Line;
+ // 직선 만들기
void MakeLine1(Line* line, Point* a, Point* b) {
line->p1 = a;
line->p2 = b;
}
+ // 직선 출력
void PrintLine(Line* line) {
printf("직선은 점 (%d, %d)와 (%d, %d)를 지나요 :D\n",
line->p1->x, line->p1->y,
line->p2->x, line->p2->y);
}
+ // 교점 구하는 함수
int FindIntersection(Line* l1, Line* l2, double* x, double* y) {
+ // 첫 번째 직선
int x1 = l1->p1->x, y1 = l1->p1->y;
int x2 = l1->p2->x, y2 = l1->p2->y;
+ // 두 번째 직선
int x3 = l2->p1->x, y3 = l2->p1->y;
int x4 = l2->p2->x, y4 = l2->p2->y;
+ // 각 직선의 계수
int A1 = y1 - y2;
int B1 = x2 - x1;
int C1 = x1 * y2 - x2 * y1;
int A2 = y3 - y4;
int B2 = x4 - x3;
int C2 = x3 * y4 - x4 * y3;
int denom = A1 * B2 - A2 * B1;
if (denom == 0) {
// 평행하거나 일치함
return 0;
}
*x = (double)(B1 * C2 - B2 * C1) / denom;
*y = (double)(C1 * A2 - C2 * A1) / denom;
return 1;
}
+ // 메인 함수
int main() {
Point p1 = {1, 1};
Point p2 = {4, 4};
Point p3 = {1, 5};
Point p4 = {4, 2};
Line l1, l2;
MakeLine1(&l1, &p1, &p2);
MakeLine1(&l2, &p3, &p4);
PrintLine(&l1);
PrintLine(&l2);
double ix, iy;
if (FindIntersection(&l1, &l2, &ix, &iy)) {
printf("교점은 (%.2f, %.2f)입니다!\n", ix, iy);
} else {
printf("두 직선은 평행하거나 일치해요ㅠㅠ\n");
}
return 0;
}
두개의 일차함수가 있을 경우 두 일차함수의 교점을 구할 수 있는 코드
#include <stdio.h>
int main() {
double a1, b1, a2, b2;
+ // 첫번째일차함수: y = a1*x + b1
+ // 두번째일차함수: y = a2*x + b2
printf("첫 번째 일차함수의 계수 a1, b1 입력(y = a1*x + b1): ");
scanf("%lf %lf", &a1, &b1);
printf("두 번째 일차함수의 계수 a2, b2 입력(y = a2*x + b2): ");
scanf("%lf %lf", &a2, &b2);
if (a1 == a2) {
if (b1 == b2) {
printf("두 함수는 같은 직선입니다 (무한한 교점)\n");
}
else {
printf("두 함수는 평행하여 교점이 없습니다 :/\n");
}
}
else {
double x = (b2 - b1) / (a1 - a2);
double y = a1 * x + b1;
printf("교점 좌표: (%.5f, %.5f)\n", x, y);
}
return 0;
}