# Geometry# Mathematics# Coordinate Geometry

g047 - 三角形的外心

🔗 前往 ZeroJudge 原題

題目描述

題目給定三角形三個頂點的座標,要求計算該三角形的外心座標,並將結果四捨五入到小數點下三位輸出。如果無法計算外心,則輸出 "No circumcenter."。

解題思路

外心是三角形三條中垂線的交點。可以通過求解任意兩條中垂線的交點來求得外心座標。程式碼中 Circum 函數實現了通過求解兩條中垂線方程組來計算外心座標的功能。具體來說,它利用了外心到三個頂點的距離相等這個性質,將其轉化為求解線性方程組的問題。程式碼首先計算了兩條中垂線的係數,然後通過求解線性方程組得到外心座標。最後,程式碼檢查外心座標是否為無限大或非數字,如果是,則輸出 "No circumcenter.",否則輸出外心座標。

複雜度分析

  • 時間複雜度: O(1)
  • 空間複雜度: O(1)

程式碼

#include <bits/stdc++.h>
using namespace std; 
struct Point{
	double x,y;
	Point(double xx,double yy){
		x=xx;
		y=yy;
	}
};
Point operator+(Point a,Point b){  //向量加 
	return Point(a.x+b.x,a.y+b.y);  
} 
Point operator-(Point a,Point b){ //向量減
	return Point(a.x-b.x,a.y-b.y);
} 
double sqr(double x){
	return x*x;
}
double dis(Point a,Point b){ //求ab的長度 
	return sqrt(sqr(a.x-b.x)+sqr(a.y-b.y));
}
Point Circum(Point a,Point b,Point c){ //三角形外心 
	double x1=a.x,y1=a.y;
	double x2=b.x,y2=b.y;
	double x3=c.x,y3=c.y;
	
	double a1=2*(x2-x1);
	double b1=2*(y2-y1);
	double c1=x2*x2+y2*y2-x1*x1-y1*y1;
	
	double a2=2*(x3-x2);
	double b2=2*(y3-y2);
	double c2=x3*x3+y3*y3-x2*x2-y2*y2;
	
	double x=(c1*b2-c2*b1)/(a1*b2-a2*b1);
	double y=(a1*c2-a2*c1)/(a1*b2-a2*b1);
	
	return Point(x,y);
} 
int xa,ya,xb,yb,xc,yc;
int main(){
	while(cin >> xa >> ya >> xb >> yb >> xc >> yc){
		Point P = Circum(Point(xa,ya),Point(xb,yb),Point(xc,yc));
		(isinf(P.x)||isinf(P.y)||isnan(P.x)||isnan(P.y))?cout << "No circumcenter.\n":cout << fixed  <<  setprecision(3) << P.x << " " << P.y << "\n";
	}
	return 0;
}

Discussion