<한빛나래 탐구활동> 별의 밝기와 등급, 거리 관계

2024. 11. 18. 18:53Coding

알고리즘 계획(c,c++)

 

1. 두 천체의 이름, 절대등급(M), 겉보기 등급(m), 거리(pc) 입력 받기 (서로 비교도 할거임, double입력)

1.1 - 겉보기 등급알고 싶으면, 절대등급 알고 싶으면 절대등급 공란, 지구와의 거리 알고싶으면 거리 공란

1.2 - 만약 2개 이상 입력 안되면 다시 입력하라고 하기

1.4 - 1AU, pc, 광년 단위 통일시키기 위해 알려주기 주로 pc로 통일 (1pc = 3.262광년 = 206,265 AU )

1.5 - '약' 붙이기

 

2. 등급, 거리 입력 바탕으로

2.1 - 지구와 별 사이 거리(pc, 광년 둘다 표기 1pc 약 3.262광년)

2.2 - 거리지수 (0보다 크면 10파섹보다 멀리 있다는 것 명시)

2.3 - 절대 등급, 상대 등급 구하기

2.4 ----------------------------------------------------------- 여기까지 다 구하면 이제 2개의 천체 비교

2.5 -  지구에서 보이는 광도 비교

2.6 - 실제 광도 비교

 

3. 아래 표(겉보기 등급 리스트)의 예시들 입력해보기

3.1 - 절대 등급이 없는데? : 태양 빛에 의존하는 천체라서 그럼. 10pc 밖으로 나가면 보이지도 않는다

혹은 너무 밝거나, 너무 희미하거나, 너무 변동성이 많거나

3.2 - 겉보기 등급이 없는데? : 조건에 따라 바뀌거나 블랙홀, 은하같이 일정한 광원이라기보다 확산된 천체

3.3 - 이렇게 하나씩 삐꾸나있어서 거리 - 절대 - 겉보기 중 2개를 입력할 수 있도록 설계

3.4 - 겉보기 등급도 모르는데 그럼 거리는 어케 앎? : 니가 가정해서 설정해야지;;

 

 

 

 

 

 

 

4. 사용 공식

 

5. 코드

#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;

struct Star {
    string name;
    double M; // 절대등급
    double m; // 겉보기 등급
    double d; // 거리 (pc 단위)
};

// 거리 계산 함수
double calD(double m, double M) {
    return pow(10, (m - M) / 5 + 1);
}

// 절대등급 계산 함수
double calAbM(double m, double d) {
    return m - 5 * (log10(d) - 1);
}

// 겉보기 등급 계산 함수
double calApM(double M, double d) {
    return M + 5 * (log10(d) - 1);
}

// 광도 비교 함수
double compareLum(double mag1, double mag2) {
    return pow(10, (mag2 - mag1) / 2.5);
}

int main() {
    Star star1, star2;

    // 사용자 입력
    cout << "첫 번째 천체 이름: ";
    cin >> star1.name;
    cout << "절대등급(M), 겉보기 등급(m), 거리(pc)를 입력 (비어있는 값은 -1로 입력): ";
    cin >> star1.M >> star1.m >> star1.d;

    cout << "두 번째 천체 이름: ";
    cin >> star2.name;
    cout << "절대등급(M), 겉보기 등급(m), 거리(pc)를 입력 (비어있는 값은 -1로 입력): ";
    cin >> star2.M >> star2.m >> star2.d;

    // 거리 계산
    if (star1.d == -1) star1.d = calD(star1.m, star1.M);
    if (star2.d == -1) star2.d = calD(star2.m, star2.M);

    // 절대등급 계산
    if (star1.M == -1) star1.M = calAbM(star1.m, star1.d);
    if (star2.M == -1) star2.M = calAbM(star2.m, star2.d);

    // 겉보기 등급 계산
    if (star1.m == -1) star1.m = calApM(star1.M, star1.d);
    if (star2.m == -1) star2.m = calApM(star2.M, star2.d);

    // 출력
    cout << fixed << setprecision(2);
    cout << "\n=== 천체 정보 비교 ===\n\n";
    cout << star1.name << ": 거리 = 약 " << star1.d << " pc, " << star1.d * 3.262 << " 광년, " << star1.d * 206265 << " AU (지구와 태양 사이 거리), " << "절대등급 = " << star1.M
         << ", 겉보기 등급 = " << star1.m << endl;
    cout << star2.name << ": 거리 = 약 " << star2.d << " pc, " << star2.d * 3.262 << " 광년, " << star2.d * 206265 << " AU (지구와 태양 사이 거리), " << "절대등급 = " << star2.M
         << ", 겉보기 등급 = " << star2.m << endl;

    // 광도 비교
    double apparentRatio = compareLum(star1.m, star2.m);
    double absoluteRatio = compareLum(star1.M, star2.M);

    cout << "\n광도 비교 (지구에서 보이는 광도): " << star1.name << "이(가) " << star2.name << "보다 " << apparentRatio << " 배 밝음" << endl;
    cout << "광도 비교 (10pc 거리에서 보는 광도): " << star1.name << "이(가) " << star2.name << "보다 " << absoluteRatio << " 배 밝음" << endl;

    return 0;
}