已知三点求圆心和半径
生活随笔
收集整理的這篇文章主要介紹了
已知三点求圆心和半径
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
https://blog.csdn.net/youhuakongzhi/article/details/86474619
https://blog.csdn.net/qq_43572555/article/details/103470968
很簡單的推導,以后用的時候就不用浪費時間了,
圓的一般方程為:
三個已知點為(x1,y1)? ?(x2,y2)? (x3,y3)
則圓心(x,y)和半徑r的計算結果為:
需要注意,如果三個點共線,那么這三個點肯定無法形成圓,這一問題可通過上式的A來判定,A=0說明三點共線;
?
#include <iostream> #include <math.h> #include <iomanip> #include <stdio.h> using namespace std; int main() {//已知三個點確定圓的半徑和圓心 double x1,x2,x3,y1,y2,y3,x,y,r,A,B,C,D;cin>>x1>>y1>>x2>>y2>>x3>>y3;A=x1*(y2-y3)-y1*(x2-x3)+x2*y3-x3*y2;B=(x1*x1+y1*y1)*(y3-y2)+(x2*x2+y2*y2)*(y1-y3)+(x3*x3+y3*y3)*(y2-y1);C=(x1*x1+y1*y1)*(x2-x3)+(x2*x2+y2*y2)*(x3-x1)+(x3*x3+y3*y3)*(x1-x2);D=(x1*x1+y1*y1)*(x3*y2-x2*y3)+(x2*x2+y2*y2)*(x1*y3-x3*y1)+(x3*x3+y3*y3)*(x2*y1-x1*y2);x=-B/(2*A);y=-C/(2*A);r=sqrt((B*B+C*C-4*A*D)/(4*A*A));//-1表示圓不存在 if(!A)cout<<"-1"<<endl;elseprintf("%.4lf %.4lf %.4lf\n",x,y,r);return 0; }為加快運算速度,避免重復計算,把上面代碼中重復計算的部分,提取出來,對于實時圖像計算,分秒必爭:
void xxxxx() {float x1,x2,x3,y1,y2,y3,x,y,r,A,B,C,D;float x1x1 = x1*x1;float y1y1 = y1*y1;float x2x2 = x2*x2;float y2y2 = y2*y2;float x3x3 = x3*x3;float y3y3 = y3*y3;float x2y3 = x2*y3;float x3y2 = x3*y2;float x2_x3 = x2-x3;float y2_y3 = y2-y3;float x1x1py1y1 = x1x1 + y1y1;float x2x2py2y2 = x2x2 + y2y2;float x3x3py3y3 = x3x3 + y3y3;A = x1 * y2_y3 - y1 * x2_x3 + x2y3 - x3y2;B = x1x1py1y1 * (-y2_y3) + x2x2py2y2 * (y1-y3) + x3x3py3y3 * (y2-y1);C = x1x1py1y1 * x2_x3 + x2x2py2y2 * (x3 - x1) + x3x3py3y3 * (x1-x2);D = x1x1py1y1 * (x3y2 - x2y3) + x2x2py2y2 * (x1*y3 - x3*y1) + x3x3py3y3 * (x2*y1-x1*y2);x=-B/(2*A);y=-C/(2*A);r=sqrt((B*B+C*C-4*A*D)/(4*A*A));//-1表示圓不存在if(!A)cout<<"-1"<<endl;elseprintf("%.4lf %.4lf %.4lf\n",x,y,r);}?
總結
以上是生活随笔為你收集整理的已知三点求圆心和半径的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 读书笔记第五讲:《卓有成效的工程师》
- 下一篇: 投资 - 指标介绍:MA、WMA、EMA