/**********************************************************************************************
*本程序对应excel公式版本可在百度文库搜索下载,zzut太阳方位角、高度角计算
*本程序对应excel公式版本可在百度文库搜索下载,zzut太阳方位角、高度角计算
*excel版本可轻松生成批量数据,使用更方便。。
*公式编写&C程序修改 qq19443156 gupeng zzut.edu.cn & jnrl
*特别感谢1:
*太阳轨迹计算C++代码
*文件名:精确太阳角度计算 编制时间:2011年05月13日
*修改内容为:修正部分公式错误;c++语言改为c语言(主要为输入输出部分)
*特别感谢2:
*北京工业大学 论文 一种高精度太阳位置算法 第一作者 杜春旭
*使用了其中提到的1985年bourges提出的赤纬角度计算方案
*最后改动 gp QQ19443156,from zzut.edu.cn & jnrl
*文件名: 精确太阳角度计算
*程序功能:此程序计算规定规定日期的规定时间的太阳能电池位地平方位角和视高度角
*修改编制时间 2020年3月18日
*程序版本: 针对太阳角度计算做了修改
*改动部分: 对太阳赤纬角、时角等算法做了修正,加入时差等补偿
*原作者不详,编制时间: 2011年05月13日
*最后改动 gp QQ19443156,from zzut.edu.cn & jnrl
*修改内容: 更正原作者部分笔误,修改c++代码为c代码
**********************************************************************************************
*输入参数:时间,经纬度
*所测时间的 年月日时分秒 y,m,d,h,m,s 逗号隔开输入
*所测地 地理经度 地理纬度 JINGDU,WEIDU 逗号隔开输入
*程序输出: 屏幕打印
说明: 程序中输入输出借用C++输入输出库 (头文件<iostream>)
说明2改:程序中输入输出借用C输入输出库 (头文件<stdio.h>)
*************************************************************************************/
#include <stdio.h>
#include <math.h>
#define PI 3.14159265358979
unsigned int jiri(unsigned int a,unsigned int b);
double rijiao(unsigned int n,unsigned int y);
double qq19443156(double a);/***赤纬角的计算函数qq19443156*/
double shicha(double a);
double shijiao(unsigned int h,unsigned int m,unsigned s,double e,double l);
int main()
{
unsigned int y,m,d;
unsigned int hour,minute,sec;
double JINGDU,WEIDU;
double delt_sun;
double angle_day;
unsigned int n;
double et,angle_hour;
double cos_gam,gam_sun,gam_sun1;
double sin_h, h_sun,h_sun1;
unsigned int ii,jj;
char ce ;
star1:
printf("Enter year,month,day,hour,minute,second,like\n");
printf("2000,1,1,12,01,01\n");
scanf("%d,%d,%d,%d,%d,%d",&y,&m,&d,&hour,&minute,&sec);
/*默认数据,屏蔽上面录入语句后,取消屏蔽下面初始化数据即可
y=2020;
m=3;
d=17;
hour=15;
minute=22;
sec=0;
*/
printf("\nenter jingdu & weidu\n");
scanf("%lf,%lf",&JINGDU,&WEIDU);
/*默认数据,屏蔽上面录入语句后,取消屏蔽下面初始化数据即可
JINGDU=117.051;
WEIDU=36.698;
*/
printf("JIESHOUDAO : %d-%d-%d----%d:%d:%d\n",y,m,d,hour,minute,sec);
printf("JIESHOUDAO : %lf,%lf\n",JINGDU,WEIDU);
JINGDU=JINGDU*PI/180;
WEIDU=WEIDU*PI/180;
n=jiri(m,d);
if(y%400==0||(y%4==0&&y%100!=0))
if(m>2)
n=n+1;
printf("\n the %d day of the year \n",n);
angle_day=rijiao(n,y);
printf("rijiao : %lf\n",angle_day);
delt_sun=qq19443156(angle_day);
printf("chiwei : %lf,%lf\n",delt_sun,delt_sun*180/PI);
et=shicha(angle_day);
printf("shicha: %lf\n",et);
angle_hour=shijiao(hour,minute,sec,et,JINGDU);
printf("shijiao: %lf\n",angle_hour);
sin_h=sin(WEIDU)*sin(delt_sun)+cos(WEIDU)*cos(delt_sun)*cos(angle_hour);
h_sun=asin(sin_h);
h_sun1=h_sun*180/PI;
printf("gaodujiao %f \n",h_sun1);
cos_gam=(sin_h*sin(WEIDU)-sin(delt_sun))/(cos(h_sun)*cos(WEIDU));
gam_sun=acos(cos_gam);
gam_sun1=gam_sun*180/PI;
if(angle_hour<0)
gam_sun1=-1*gam_sun1;
printf("fangweijiao %f \n",gam_sun1);
system("pause");
star2:
system("cls");
printf("retry y or n ?");
while(scanf("%c",&ce)!=EOF)
{
getchar();
if((ce =='y')||(ce=='Y'))
{
system("cls");
goto star1;
}
if((ce =='N')||(ce=='n'))
goto star3;
goto star2;
}
star3:
return 0;
return 0;
}
double rijiao(unsigned int n5,unsigned int y5)
{
double t=(double)n5-(79.6764+0.2433*((double)y5-1985)-(((double)y5-1985)/4));
return 2*PI*t/365.2422;
}
double qq19443156(double a)
{
return (0.3723+23.2567*sin(a)+0.1149*sin(2*a)-0.1712*sin(3*a)-0.758*cos(a)+0.3656*cos(2*a)+0.0201*cos(3*a))*PI/180;
}
double shicha(double a)
{
return 0.0028-1.9857*sin(a)+9.9059*sin(2*a)-7.0924*cos(a)-0.6882*cos(2*a);
}
double shijiao(unsigned int h,unsigned int m,unsigned s,double e,double l)
{
double hh=h;
double mm=m;
double ss=s;
return ((hh-12)+(mm-(120*PI/180-l)*4*180/PI+e)/60+(ss/3600))*15*PI/180;
}
unsigned int jiri(unsigned int a,unsigned int b)
{
int n=0;
switch(a)
{
case 1:
n=b;break;
case 2:
n=31+b;break;
case 3:
n=31+28+b;break;
case 4:
n=31+28+31+b;break;
case 5:
n=31+28+31+30+b;break;
case 6:
n=31+28+31+30+31+b;break;
case 7:
n=31+28+31+30+31+30+b;break;
case 8:
n=31+28+31+30+31+30+31+b;break;
case 9:
n=31+28+31+30+31+30+31+31+b;break;
case 10:
n=31+28+31+30+31+30+31+31+30+b;break;
case 11:
n=31+28+31+30+31+30+31+31+30+31+b;break;
case 12:
n=31+28+31+30+31+30+31+31+30+31+30+b;break;
default:
;
}
return n;
}