ในบทเรียนนี้ เราจะเขียนโปรแกรมหาจุดศูนย์กลางวงเวียน (Circumcenter) ของสามเหลี่ยม
Circumcenter คืออะไร?
จุดศูนย์กลางวงเวียน คือ จุดที่ห่างจากสามมุมของสามเหลี่ยมเท่ากัน เป็นจุดศูนย์กลางของวงกลมที่ผ่านสามมุมทั้งสาม
หาได้จาก จุดตัดของเส้นแบ่งหาง่ายตั้งฉาก (Perpendicular Bisectors) ของสองด้าน
ขั้นตอนการคำนวณ
- หาสมการเส้นตรงผ่าน 2 จุด (ด้านของสามเหลี่ยม)
- หาสมการเส้นแบ่งหาง่ายตั้งฉากของด้านนั้น
- หาจุดตัดของเส้นแบ่งหาง่ายตั้งฉาก 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 ✓