Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++로 곡선 위 주어진 점에서 법선 방정식 구하기


곡선 y = x(A − x)가 주어져 있고, 이 곡선 위의 특정 점 (x, y)에서 법선(normal)의 방정식을 구해야 한다고 가정해 봅시다. 여기서 A는 정수이며, x와 y 역시 정수입니다.

법선(Normal)이란?

법선은 곡선 위의 한 점에서 해당 점을 지나는 접선에 수직인 직선을 의미합니다. 접선의 기울기를 m이라 할 때, 법선의 기울기는 −1/m이 됩니다. 따라서 법선을 구하려면 먼저 접선의 기울기, 즉 곡선의 미분값을 알아야 합니다.

풀이 접근 방식

이 문제는 다음 세 단계로 해결할 수 있습니다.

  1. 점 검증: 주어진 점 (x, y)가 실제로 곡선 위에 존재하는지 확인합니다. 곡선 식 y = Ax − x²에 x 값을 대입했을 때 y와 일치하지 않으면 법선을 구할 수 없습니다.
  2. 미분: 곡선 y = x(A − x)를 x에 대해 미분하여 접선의 기울기를 구합니다.
  3. 법선 방정식 대입: 구한 기울기를 이용해 법선의 방정식을 세웁니다.

1단계: 곡선 미분하기

y = x(A − x) = Ax − x² 를 x에 대해 미분하면 다음과 같습니다.

$$\frac{\text{d}y}{\text{d}x}=A-2x$$

2단계: 법선 방정식 세우기

구한 기울기를 바탕으로, 점 (x, y)를 지나는 법선의 방정식은 다음과 같습니다.

$$Y-y=-\lgroup\frac{\text{d}x}{\text{d}y}\rgroup*\lgroup X-x \rgroup$$

여기서 dx/dy는 접선 기울기의 역수, 즉 1/(A − 2x)입니다. 이 식을 정리하면 다음 형태가 됩니다.

$$(A-2x)(Y-y)=-(X-x)$$

C++ 구현 예제

#include<iostream>
using namespace std;
void getNormal(int A, int x, int y) {
    int slope = A - x * 2;  // 접선의 기울기 dy/dx
    if (y == (A * x - x * x)) {  // 점이 곡선 위에 있는지 확인
        if (slope < 0)
            cout << 0 - slope << "y = x" << (0 - x) + (y * slope);
        else if (slope > 0)
            cout << slope << "y = -x+" << x + slope * y;
        else  // 기울기가 0이면 법선은 수직선
            cout << "x = " << x;
    }
    else
        cout << "Not possible";
}
int main() {
    int A = 5, x = 2, y = 6;
    cout << "Equation of normal is: ";
    getNormal(A, x, y);
}

출력 결과

Equation of normal is: 1y = -x+8

코드 설명

  • 기울기 계산: 변수 slope에 A − 2x 값을 저장합니다. 이 값이 점 (x, y)에서의 접선 기울기입니다.
  • 점 검증: y == (A*x − x*x) 조건으로 주어진 점이 곡선 위에 있는지 확인합니다. 점이 곡선 위에 없다면 "Not possible"을 출력합니다.
  • 기울기가 양수인 경우: 법선 방정식을 (A−2x)·Y = −X + (x + (A−2x)·y) 형태로 출력합니다.
  • 기울기가 음수인 경우: 부호를 정리한 형태로 방정식을 출력합니다.
  • 기울기가 0인 경우: 접선이 수평이므로 법선은 수직선이 되어 x = 상수 형태로 출력됩니다.

예시 검증

A = 5, 점 (2, 6)인 경우를 살펴보겠습니다. 곡선 y = 5x − x²에 x = 2를 대입하면 y = 10 − 4 = 6이므로 이 점은 곡선 위에 있습니다. 접선의 기울기는 5 − 2×2 = 1이고, 법선의 기울기는 −1입니다. 따라서 법선의 방정식은 Y − 6 = −(X − 2), 즉 Y = −X + 8이 되어 프로그램의 출력과 일치합니다.

복잡도 분석

이 알고리즘은 단순한 산술 연산만 수행하므로 시간 복잡도는 O(1), 추가로 사용되는 공간 복잡도 역시 O(1)입니다.