转 已知两点坐标和半径求圆心坐标程序C++
生活随笔
收集整理的這篇文章主要介紹了
转 已知两点坐标和半径求圆心坐标程序C++
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
數學思想:利用圓方程和直線方程 已知兩點坐標和半徑求圓心坐標程序
#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);}
} View Code
?
轉載于:https://www.cnblogs.com/lhuan/p/5753847.html
總結
以上是生活随笔為你收集整理的转 已知两点坐标和半径求圆心坐标程序C++的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Nodejs-express 4.0框架
- 下一篇: 【Python实战】机型自动化标注(搜狗