已知两点坐标和半径求圆心坐标程序C++
2017-09-27 16:25
921 查看
已知圆上的两点坐标和半径,求圆心。 数学分析:这个题目,涉及到简单的数学问题,但是计算比较繁琐。 假设已知圆上的两点坐标分别为N(X1,Y1)和M(X2,Y2),半径为R,圆心坐标为o(a,b),根据数学知识可得到: (x1-a)^2 + (y1-b)^2 = R^2----(1)式 (x2-a)^2 + (y2-b)^2 = R^2----(2)式 分别展开上述两个式子得到 (x1)^2 - 2*x1*a + a^2 + (y1)^2 - 2*y1*b + b^2 = R^2 ----(3)式 (x2)^2 - 2*x2*a + a^2 + (y2)^2 - 2*y2*b + b^2 = R^2 ----(4)式 (3)式 - (4)式 得到: x1^2 - x2^2 + 2*(x2-x1)*a + y1^2 - y2^2 + 2*(y2-y1)*b = 0 变形得到: a = (x2^2 - x1^2 + y2^2 - y1^2)/2/(x2-x1) - (y2-y1)/(x2-x2) * b 设:C1 = (x2^2 - x1^2 + y2^2 - y1^2)/2/(x2-x1) 设:C2 = (y2-y1)/(x2-x2) a = c1 - c2 * b ----(5)式 把(5)式代入(1)式,得到; x1^2 - 2*x1*(C1-C2*b) + (C1-C2*b)^2 + y1^2 -2*y1*b + b^2 = R^2 展开简化为关于b的一元二次方程一般形式; (C2^2+1)*b^2 + (2*x1*C1-2*C1*C2-2*y1)*b + x1^2-2*x1*C1+C1^2+y1^2-R^2 = 0
得到求b的方程组 二次项系数:A = (C2^2+1) 一次项系数:B = (2*x1*C1-2*C1*C2-2*y1) 常数项: C = x1^2-2*x1*C1+C1^2+y1^2-R^2
已知两点坐标和半径求圆心坐标程序 #include <iostream> #include <fstream> #include <cmath> using namespace std; ofstream fout; typedef struct { double x; double y; }Point; double Y_Coordinates(double x,double y,double k,double x0);//4个参数 void Circle_Center(Point p1,Point p2,double dRadius); bool Data_Validation(Point p1,Point p2,double dRadius); void ReadData(Point &p1,Point &p2,double &dRadius); void main() { Point p1,p2; double dRadius = 0.0; ReadData(p1,p2,dRadius); fout.open("Result.txt"); Circle_Center(p1,p2,dRadius); fout.close(); } void Circle_Center(Point p1,Point p2,double dRadius) { double k = 0.0,k_verticle = 0.0; double mid_x = 0.0,mid_y = 0.0; double a = 1.0; double b = 1.0; double c = 1.0; Point center1,center2; k = (p2.y - p1.y) / (p2.x - p1.x); if(k == 0) { center1.x = (p1.x + p2.x) / 2.0; center2.x = (p1.x + p2.x) / 2.0; center1.y = p1.y + sqrt(dRadius * dRadius -(p1.x - p2.x) * (p1.x - p2.x) / 4.0); center2.y = p2.y - sqrt(dRadius * dRadius -(p1.x - p2.x) * (p1.x - p2.x) / 4.0); } else { k_verticle = -1.0 / k; mid_x = (p1.x + p2.x) / 2.0; mid_y = (p1.y + p2.y) / 2.0; a = 1.0 + k_verticle * k_verticle; b = -2 * mid_x - k_verticle * k_verticle * (p1.x + p2.x); c = mid_x * mid_x + k_verticle * k_verticle * (p1.x + p2.x) * (p1.x + p2.x) / 4.0 - (dRadius * dRadius - ((mid_x - p1.x) * (mid_x - p1.x) + (mid_y - p1.y) * (mid_y - p1.y))); center1.x = (-1.0 * b + sqrt(b * b -4 * a * c)) / (2 * a); center2.x = (-1.0 * b - sqrt(b * b -4 * a * c)) / (2 * a); center1.y = Y_Coordinates(mid_x,mid_y,k_verticle,center1.x); center2.y = Y_Coordinates(mid_x,mid_y,k_verticle,center2.x); } fout << center1.x << " " << center1.y << endl; fout << center2.x << " " << center2.y << endl; } double Y_Coordinates(double x,double y,double k,double x0) { return k * x0 - k * x + y; } bool Data_Validation(Point p1,Point p2,double dRadius) { double dDistance = 0.0; dDistance = sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y)); if(dDistance == 0.0) { cout << "\n输入了相同的点!\n"; return false; } if((2 * dRadius) >= dDistance) return true; else { cout << "\n两点间距离大于直径!\n"; return false; } } void ReadData(Point &p1,Point &p2,double &dRadius) { cout << "请输入圆周上一点的坐标:"; cin >> p1.x >> p1.y; cout << "请输入圆周上另一点的坐标:"; cin >> p2.x >> p2.y; cout << "请输入圆的半径:"; cin >> dRadius; if(! Data_Validation(p1,p2,dRadius)) { cout << endl << "数据不合理!\n"; exit(0); } }
相关文章推荐
- 已知圆弧上两点坐标和半径求圆心坐标的算法(C++)
- 已知圆弧上两点坐标及圆半径,计算圆心坐标
- 求内切圆的圆心和半径(已知三个点的坐标)
- 高德已知圆心,半径,计算圆弧坐标
- 已知空间N点坐标求圆心坐标,半径
- 已知圆心,半径,角度,求圆上的点坐标
- 已知两圆圆心坐标及半径求两圆交点 (C语言|参数方程求解)
- 【POJ 1981】Circle and Points(已知圆上两点求圆心坐标)
- 已知两圆圆心坐标及半径求两圆交点 (C语言|参数方程求解)
- 已知圆心,半径,角度,求圆上的点坐标
- 已知圆心,半径,角度,求圆上的点坐标
- 已知三点坐标,求外接圆圆心坐标与半径。
- 已知圆心,半径,角度,求圆上的点坐标
- 已知两圆圆心坐标及半径求两圆交点
- 已知圆心,半径,角度,求圆上的点坐标
- POJ1981-Circle and Points(已知两点坐标求圆心坐标)
- 已知圆上三点坐标求圆心和半径
- 已知圆心,半径,角度,求圆上的点坐标
- 已知圆心,半径,角度,求圆上的点坐标。
- 求内切圆的圆心和半径(已知三个点的坐标)