Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

โปรแกรมหาจุดศูนย์กลางวงเวียนของสามเหลี่ยมใน C++


ในบทเรียนนี้ เราจะเขียนโปรแกรมหาจุดศูนย์กลางวงเวียน (Circumcenter) ของสามเหลี่ยม

Circumcenter คืออะไร?

จุดศูนย์กลางวงเวียน คือ จุดที่ห่างจากสามมุมของสามเหลี่ยมเท่ากัน เป็นจุดศูนย์กลางของวงกลมที่ผ่านสามมุมทั้งสาม

หาได้จาก จุดตัดของเส้นแบ่งหาง่ายตั้งฉาก (Perpendicular Bisectors) ของสองด้าน

ขั้นตอนการคำนวณ

  1. หาสมการเส้นตรงผ่าน 2 จุด (ด้านของสามเหลี่ยม)
  2. หาสมการเส้นแบ่งหาง่ายตั้งฉากของด้านนั้น
  3. หาจุดตัดของเส้นแบ่งหาง่ายตั้งฉาก 2 เส้น = Circumcenter

ตัวอย่างโค้ด C++

#include <iostream>
#include <cfloat>
#include <utility>
using namespace std;

#define pdd pair<double, double>

// หาสมการเส้นตรง ax + by = c จาก 2 จุด
void lineFromPoints(pdd P, pdd Q, double &a, double &b, double &c) {
    a = Q.second - P.second;
    b = P.first - Q.first;
    c = a * P.first + b * P.second;
}

// หาสมการเส้นแบ่งหาง่ายตั้งฉาก
void perpendicularBisectorFromLine(pdd P, pdd Q, double &a, double &b, double &c) {
    pdd mid = {(P.first + Q.first)/2, (P.second + Q.second)/2};
    c = -b * mid.first + a * mid.second;
    swap(a, b);
    a = -a; // หรือ b = -b ขึ้นอยู่กับการ rotate
}

// หาจุดตัดของสองเส้น
pdd lineLineIntersection(double a1, double b1, double c1, 
                         double a2, double b2, double c2) {
    double det = a1 * b2 - a2 * b1;
    if (det == 0) return {FLT_MAX, FLT_MAX}; // ขนาน
    
    double x = (b2 * c1 - b1 * c2) / det;
    double y = (a1 * c2 - a2 * c1) / det;
    return {x, y};
}

void findCircumCenter(pdd P, pdd Q, pdd R) {
    double a, b, c, e, f, g;
    
    lineFromPoints(P, Q, a, b, c);
    lineFromPoints(Q, R, e, f, g);
    
    perpendicularBisectorFromLine(P, Q, a, b, c);
    perpendicularBisectorFromLine(Q, R, e, f, g);
    
    pdd center = lineLineIntersection(a, b, c, e, f, g);
    
    if (center.first == FLT_MAX) {
        cout << "Points are collinear - no triangle formed\n";
    } else {
        cout << "Circumcenter: (" << center.first << ", " << center.second << ")\n";
    }
}

int main() {
    pdd P = {6, 0};
    pdd Q = {0, 0};
    pdd R = {0, 8};
    findCircumCenter(P, Q, R);
    return 0;
}

ผลลัพธ์

Circumcenter: (3, 4)

การตรวจสอบ

สามเหลี่ยมมุมฉากที่ (0,0), (6,0), (0,8)

ด้านตรงข้ามมุมฉาก = 10 → รัศมีวงเวียน = 5

จุดกึ่งกลางด้านตรงข้ามมุมฉาก = (3, 4) → Circumcenter ✓