📄 noj 1051 行星位置.txt
字号:
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <cmath>
using namespace std;
//行星位置 NOJ 1051
//两直线交点坐标求解,三角形外心坐标求解,点旋转坐标求解,综合几何运用
/*
输入为:
第一行 行星绕恒星转一圈的周期,卫星从a点到b点的时间,从b点到c点的时间
第二行 a,b,c三点的坐标
输出为:
行星与恒星的距离
输入:
360 90 90
5.0 1.0 0.0 6.0 -5.0 1.0
0 0 0
输出:
5
*/
#define PI 3.1415926
typedef struct POINT
{
double x;
double y;
}POINT;
struct Beeline
{
double a;
double b;
double c;
};
POINT TwoBeeline(struct Beeline l1,struct Beeline l2)
{ //两直线的交点
POINT p={0,0};
if(l1.a * l2.b == l1.b * l2.a) return p ; //两直线平行
p.x = (l1.c * l2.b - l1.b * l2.c) / (l1.b * l2.a - l1.a * l2.b) ;
p.y = (l1.a * l2.c - l1.c * l2.a) / (l1.b * l2.a - l1.a * l2.b) ;
return p;
}
POINT Circumcenter(struct POINT P1,struct POINT P2,struct POINT P3)
{ //三角形的外心
struct Beeline l1,l2;
l1.a = P2.x - P1.x ;
l1.b = P2.y - P1.y ;
l1.c = (P1.y * P1.y - P2.y * P2.y + P1.x * P1.x - P2.x * P2.x) * 0.5000 ;
l2.a = P2.x - P3.x ;
l2.b = P2.y - P3.y ;
l2.c = (P3.y * P3.y - P2.y * P2.y + P3.x * P3.x - P2.x * P2.x) * 0.5000 ;
return TwoBeeline(l1,l2);
}
POINT rotate(POINT o,double alpha,POINT p)
{ //点p绕点o旋转alpha角后的坐标
POINT tp;
p.x-=o.x;
p.y-=o.y;
tp.x=p.x*cos(alpha)-p.y*sin(alpha)+o.x;
tp.y=p.y*cos(alpha)+p.x*sin(alpha)+o.y;
return tp;
}
int cal(POINT o,POINT a,POINT b,POINT c,double day1,double day2,double totle)
{
POINT AA,BB,WAIXIN;
double AJ,BJ;
double ans,tt;
//求得旋转角度
AJ=(2*PI*(day1+day2))/totle;
BJ=(2*PI*day2)/totle;
//将点a,点b旋转到与点c一起
//由于行星到卫星的距离不变,可知这三个点所组成的三角形的外心,就是行星的坐标
AA=rotate(o,AJ,a);
BB=rotate(o,BJ,b);
//求外心
WAIXIN=Circumcenter(AA,BB,c);
//求外心与原点的距离
ans=sqrt(pow((WAIXIN.x-o.x),2)+pow((WAIXIN.y-o.y),2));
tt=(int)(ans+0.5);
return tt;
}
int main()
{
POINT a,b,c,o;
double day1,day2,totleday;
o.x=0.0;o.y=0.0;
cin>>totleday>>day1>>day2;
while(!(totleday==0&&day1==0&&day2==0))
{
cin>>a.x>>a.y>>b.x>>b.y>>c.x>>c.y;
cout<<cal(o,a,b,c,day1,day2,totleday)<<endl;
cin>>totleday>>day1>>day2;
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -