⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 noj 1051 行星位置.txt

📁 POJ上一些计算几何题的代码………………
💻 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 + -