首先可以求出圓的半徑,然後用兩個公式求解方程組
a*b=|a|*|b|*cos(120);
x*x+y*y=r*r;
解出方程剛好有兩個解,及為所求。
代碼如下:
給你一個點在半徑為r的圓上,該圓圓心在原點上,讓你求圓上兩個點是這兩個點與給出這個點的距離最大 顯然是互為120度的時候最大。 #include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <cstring> #include <string> #include <vector> #include <list> #include <deque> #include <queue> #include <iterator> #include <stack> #include <map> #include <set> #include <algorithm> #include <cctype> using namespace std; typedef long long LL; const int N=21; const LL II=1000000007; double x,y,r,r2; double xx0,yy0,xx1,yy1; int main() { int T; cin>>T; while(T--) { scanf("%lf%lf",&x,&y); r2=(x*x+y*y); double a,b,c; a=r2; b=r2*y; c=r2*r2/4-x*x*r2; yy0=(-b-sqrt(b*b-4*a*c))/2/a; yy1=(-b+sqrt(b*b-4*a*c))/2/a; /*/這個地方求解x不能用x*x+y*y=r2來算,應為不知道正負號 xx0=sqrt(r2-yy0*yy0); xx1=sqrt(r2-yy1*yy1);*/ if(fabs(x-0)<1e-7) { xx0=-sqrt(r2-yy0*yy0); xx1=sqrt(r2-yy1*yy1); } else { xx0=(-r2/2-yy0*y)/x; xx1=(-r2/2-yy1*y)/x; } printf("%.3lf %.3lf %.3lf %.3lf\n",xx0,yy0,xx1,yy1); } return 0; }