惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

G
Google Developers Blog
Apple Machine Learning Research
Apple Machine Learning Research
小众软件
小众软件
Recent Announcements
Recent Announcements
阮一峰的网络日志
阮一峰的网络日志
IT之家
IT之家
A
About on SuperTechFans
量子位
Engineering at Meta
Engineering at Meta
B
Blog
The Cloudflare Blog
博客园 - 【当耐特】
Hugging Face - Blog
Hugging Face - Blog
Y
Y Combinator Blog
J
Java Code Geeks
D
DataBreaches.Net
aimingoo的专栏
aimingoo的专栏
T
Tailwind CSS Blog
H
Help Net Security
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
V
V2EX
Stack Overflow Blog
Stack Overflow Blog
C
Check Point Blog
酷 壳 – CoolShell
酷 壳 – CoolShell

博客园 - zhh

Cesium 河道形状 Cesium 实现 FlowMap Unity3D c# 使对象物体始终面向摄像机 Cesium For Unity Convert WGS84 to Earth Centered Earth Fixed 小流域设计洪水计算 cesium自定义st TerrainProviderEdit Redis Server监控数据采集 cesium添加过道corridor Cesium:entity闪烁(点、面以及billboard) arcgis 3.x 打印 CAS Client集群环境的Session问题及解决方案 不能退出登录 Client Server集群模式下session问题[转] quartz数据不完整导致不调度并且报错Couldn‘t store trigger arcgis popup关闭事件 arcgis 叠加图片 watch arcgis 叠加图片 三维地图3DGIS平台技术指标要求规划 Java – Get All Dates Between Two Dates
太阳方位角
zhh · 2021-10-31 · via 博客园 - zhh

#include "math.h"

int GetDayOfYear(int Year,int Month,int Day)

{

        //功能:给定年月日得到此日在一年中的天数,1月1日为第1天,分闰年和平年 

    //作者:汪帮主 2009-6-6 wzj08@mails.jlu.edu.cn    

    int DayOfYear;

    int FebDays;    

    if ((Year%4==0 && Year%100!=0) || (Year%400==0))

    {

        FebDays = 29;

    }

    else 

    {

        FebDays = 28;

    }

    DayOfYear = Day;

    if (Month > 1) DayOfYear = DayOfYear + 31; 

    if (Month > 2) DayOfYear = DayOfYear + FebDays;

    if (Month > 3) DayOfYear = DayOfYear + 31 ;

    if (Month > 4) DayOfYear = DayOfYear + 30 ;

    if (Month > 5) DayOfYear = DayOfYear + 31 ;

    if (Month > 6) DayOfYear = DayOfYear + 30 ;

    if (Month > 7) DayOfYear = DayOfYear + 31 ;

    if (Month > 8) DayOfYear = DayOfYear + 31 ;

    if (Month > 9) DayOfYear = DayOfYear + 30 ;

    if (Month > 10) DayOfYear = DayOfYear + 31 ;

    if (Month > 11) DayOfYear = DayOfYear + 30 ;

    return DayOfYear;

}

void GetSolarAngle(int year,int month,int day,int hour,int min,double sec,double lat,double lon,int TimeZone,int N ,double& AzimuthAngle,double& ZenithAngle)

{

        //功能:计算太阳天顶角和太阳方位角 

    //作者:汪帮主 2009-6-6 wzj08@mails.jlu.edu.cn    

    double N0, sitar, ED, dLon, Et, Ho, viewAng;

    const double PI = 3.14159265;

    double dTimeAngle, gtdt, latitudeArc, latitude, HeightAngleArc;

    double AzimuthAngleArc, HANoon, dTA, TimeNoon, CosAzimuthAngle, HeightAngle;                        

    N0 = 79.6764 + 0.2422*(year-1985) - floor((year-1985)/4.0);

    sitar = 2*PI*(N-N0)/365.2422;

    ED = 0.3723 + 23.2567*sin(sitar) + 0.1149*sin(2*sitar) - 0.1712*sin(3*sitar)- 0.758*cos(sitar) + 0.3656*cos(2*sitar) + 0.0201*cos(3*sitar);

    ED = ED*PI/180;           //ED本身有符号,无需判断正负。

    //ED = (m_northOrSouth==0)? ED:(-ED);   

    dLon = 0.0;

    //地球上某一点与其所在时区中心的经度差

    if (lon >= 0)   

    {

        if (TimeZone == -1)

        {

                dLon = lon - (floor((lon*10-75)/150)+1)*15.0;

        }

        else

        {

            dLon = lon - TimeZone*15.0;

        }

    }

    else 

    {   if (TimeZone == -1)

        {

            dLon =  (floor((lon*10-75)/150)+1)*15.0- lon;

        }

        else

        {

            dLon =  TimeZone*15.0- lon;

        }

    }

    Et = 0.0028 - 1.9857*sin(sitar) + 9.9059*sin(2*sitar) - 7.0924*cos(sitar)- 0.6882*cos(2*sitar); //视差

    gtdt = hour + min/60.0 + sec/3600.0 + dLon/15; //地方时

    gtdt = gtdt + Et/60.0;

    dTimeAngle = 15.0*(gtdt-12);

    dTimeAngle = dTimeAngle*PI/180; 

    latitudeArc = lat*PI/180;

    HeightAngleArc = asin(sin(latitudeArc)*sin(ED)+cos(latitudeArc)*cos(ED)*cos(dTimeAngle));

    CosAzimuthAngle = (sin(HeightAngleArc)*sin(latitudeArc)-sin(ED))/cos(HeightAngleArc)/cos(latitudeArc);

    AzimuthAngleArc = acos(CosAzimuthAngle);

    HeightAngle = HeightAngleArc*180/PI;

    AzimuthAngle = AzimuthAngleArc *180/PI;

    if( dTimeAngle < 0 )

    {   

        AzimuthAngle = 180 - AzimuthAngle;

    }

    else

    {

        AzimuthAngle = 180 + AzimuthAngle;

    }

    ZenithAngle = 90-HeightAngle;

}