1 条题解
-
0
解题思路
- 结构体定义:
- 定义
point
结构体,包含x
和y
坐标,用于表示点的位置。
- 定义
- 求解函数
solve
:- 初始化
getx
为false
,用于标记是否已经确定x
坐标。 - 计算线段
pp[0]
和pp[1]
的垂直平分线的参数a1
、b1
、c1
、d1
,以及线段pp[0]
和pp[2]
的垂直平分线的参数a2
、b2
、c2
、d2
。 - 如果
abs(c1) < eps
(eps
为一个极小值),则确定x
坐标为b1
,并设置getx
为true
。 - 根据
getx
的值进行不同的计算:- 如果
getx
为true
,则根据a2
、c2
、b2
、d2
计算y
坐标。 - 如果
abs(c2) < eps
,则确定x
坐标为b2
,并根据a1
、c1
、b1
、d1
计算y
坐标。 - 否则,对
a1
、c1
、a2
、c2
进行处理,计算出x
坐标,再根据d1
、a1
、b1
计算出y
坐标。
- 如果
- 计算圆心
(x, y)
到点pp[0]
的距离作为半径r
,以及计算圆的一般方程中的常数项re
。 - 按照格式输出圆的标准方程和一般方程。
- 初始化
- 主函数
main
:- 使用
while
循环持续读取输入的三个点的坐标,每次读取后调用solve
函数计算并输出圆的方程。
- 使用
#include<iostream> #include<cmath> #include<iomanip> #define eps 1e-6 using namespace std; struct point{ double x,y; }pp[3]; void solve(){ bool getx = 0; double x,y; double a1 = pp[1].x-pp[0].x, b1 = (pp[0].x+pp[1].x)/2, c1 = pp[1].y-pp[0].y, d1 = (pp[0].y+pp[1].y)/2; if(abs(c1)<eps) x = b1, getx = 1; double a2 = pp[2].x-pp[0].x, b2 = (pp[0].x+pp[2].x)/2, c2 = pp[2].y-pp[0].y, d2 = (pp[0].y+pp[2].y)/2; if(getx) y = -1*a2*(x-b2)/c2+d2; else if(abs(c2)<eps){ x = b2; y = -1*a1*(x-b1)/c1+d1; } else{ a1/=c1, a2/=c2; x = (d1-d2+a1*b1-a2*b2)/(a1-a2); y = d1 - a1*(x-b1); } double r = sqrt((pp[0].x-x)*(pp[0].x-x)+(pp[0].y-y)*(pp[0].y-y)), re = x*x+y*y-r*r; cout << setiosflags(ios::fixed) << setprecision(3) << "(x " << (x>0?"- ":"+ ") << abs(x) << ")^2 + (y " << (y>0?"- ":"+ ")\ << abs(y)<< ")^2 = " << r << "^2" << endl; cout << "x^2 + y^2 " <<(x>0?"- ":"+ ") << 2*abs(x) << "x " << (y>0?"- ":"+ ") << 2*abs(y) << "y " <<(re>0?"+ ":"- ") << abs(re) << " = 0"<< endl; cout << endl; } int main(){ while(cin>>pp[0].x>>pp[0].y>>pp[1].x>>pp[1].y>>pp[2].x>>pp[2].y) solve(); }
- 结构体定义:
- 1
信息
- ID
- 330
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者