Тогда, зная ш,д Солнца можно построить горизонт.
Ниже привиден метод построения радиогоризонта для спутника, что вобщем-то одно и то-же.
B - радиус горизонта, для Солнца это приблизительно 90 градусов.
lat = щирота
lon - долгота
На выходе будет область из точек, соединенных линиями, без закраски внутренней части.
Все в предположении круглой Земли.
void CMapDraw::DrawRadioHorizon(double B,double lat,double lon)
{
const double sinLat = sin(lat*DTR);
const double cosLat = cos(lat*DTR);
const double sinLon = sin(lon*DTR);
const double cosLon = cos(lon*DTR);
wxColour col = m_options->m_mapRadioHorizonColor->GetValue();
m_mapDC->SetPen(wxPen(col, 1, wxSOLID) );
const double radius = B;
const double sinRadius = sin(radius*DTR);
const double ksi = -(1-1*cos(radius*DTR));
double el,az,dz,dt;
int x,y;
double w=0;
dt = sinRadius*cos(w);
dz = sinRadius*sin(w);
Topo(cosLat, sinLat, cosLon, sinLon, ksi, dt, dz, el, az);
LatLonToXY(el,az,x,y);
double step = 2*M_PI/100.0;
while(w <= 2*M_PI){
int lastx = x;
int lasty = y;
dt = sinRadius*cos(w);
dz = sinRadius*sin(w);
Topo(cosLat, sinLat, cosLon, sinLon, ksi, dt, dz, el, az);
LatLonToXY(el,az,x,y);
if(abs(lastx-x) > m_mapWidth*0.5){
if (lastx > x){
int ly;
int nx = m_mapWidth - lastx + x;
if (lasty == y || nx == 0){
ly = y;
}else{
double k = ((double)(m_mapWidth - lastx))/nx;
ly = Round(lasty + k*(y-lasty));
}
m_mapDC->DrawLine(lastx,lasty,m_mapWidth,ly);
m_mapDC->DrawLine(0,ly,x,y);
}else if (lastx < x){
int ly;
int nx = m_mapWidth - x + lastx;
if (lasty == y || nx == 0){
ly = y;
}else{
double k = 1-((double)(m_mapWidth - x))/nx;
ly = Round(lasty + k*(y-lasty));
}
m_mapDC->DrawLine(lastx,lasty,0,ly);
m_mapDC->DrawLine(m_mapWidth,ly,x,y);
}
}else{
m_mapDC->DrawLine(lastx,lasty,x,y);
}
w += step;
}
}
void Topo(double cosEl, double sinEl, double cosAz, double sinAz, double ksi, double teta, double dzita, double& el,double& az)
{
double cosf = cosEl;
double sinf = sinEl;
double cosl = cosAz;
double sinl = sinAz;
double Xn = cosf * cosl;
double Yn = cosf * sinl;
double Zn = sinf;
double a1 = cosf*cosl*ksi - sinl*teta - sinf*cosl*dzita;
double a2 = cosf*sinl*ksi + cosl*teta - sinf*sinl*dzita;
double a3 = sinf*ksi + cosf*dzita;
double x1 = a1 + Xn;
double y1 = a2 + Yn;
double z1 = a3 + Zn;
double rr = sqrt(x1*x1 + y1*y1 + z1*z1);
el = asin(z1/rr)*RTD;
az = atan2(y1,x1)*RTD;
}