A A A A Автор Тема: Помогите разобратся  (Прочитано 2808 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн AbversoftАвтор темы

  • Новичок
  • *
  • Сообщений: 13
  • Благодарностей: 0
    • Сообщения от Abversoft
Помогите разобратся
« : 23 Янв 2009 [05:57:56] »
как на дельфи можно графически отобразить день,ночь т.е как на картинке или хотя бы алгоритм.
Кстати есть исходники на С (с матиматикой разобрался а вот с графикой не силен)
« Последнее редактирование: 24 Янв 2009 [04:35:21] от Abversoft »

Оффлайн AbversoftАвтор темы

  • Новичок
  • *
  • Сообщений: 13
  • Благодарностей: 0
    • Сообщения от Abversoft
Re: Помогите разобратся
« Ответ #1 : 24 Янв 2009 [04:37:16] »
Видно такое сложно сделать в дельфи, если нет ответов.
Хоть алгоритм скинте, а то я в астрономии не силен

Оффлайн Sleepwalker

  • *****
  • Сообщений: 2 546
  • Благодарностей: 69
  • Александр Лапшин
    • Сообщения от Sleepwalker
Re: Помогите разобратся
« Ответ #2 : 24 Янв 2009 [11:00:08] »
Хм, т.е. с математикой вопросов нет и Вы можете получить солнечный горизонт в виде массива точек с координатами широта, долгота?
Тогда переведите этот массив в экранные координата типа x,y и методом TCanvas.Polygon заполняете его текущей кисточкой.

Оффлайн AbversoftАвтор темы

  • Новичок
  • *
  • Сообщений: 13
  • Благодарностей: 0
    • Сообщения от Abversoft
Re: Помогите разобратся
« Ответ #3 : 24 Янв 2009 [15:33:11] »
это и понятно что точками, но чтобы построить хотябы эти точки надо знать правило. Ведь не просто так взять от фонаря поставить точку
В интернете нашел хорошую книгу "Astronomy on the Personal Computer", ксажелению на не нанашем написано, а я особо не селен в англицком.
Вот и прошу хотябы кинуть формулу построение

Оффлайн Sleepwalker

  • *****
  • Сообщений: 2 546
  • Благодарностей: 69
  • Александр Лапшин
    • Сообщения от Sleepwalker
Re: Помогите разобратся
« Ответ #4 : 24 Янв 2009 [16:08:59] »
А говорили, что с математикой разобрались...
Широту, долготу Солнца в Гринвиче то хоть получать умеете?

Оффлайн AbversoftАвтор темы

  • Новичок
  • *
  • Сообщений: 13
  • Благодарностей: 0
    • Сообщения от Abversoft
Re: Помогите разобратся
« Ответ #5 : 24 Янв 2009 [16:27:15] »
Получил. Солнешко бегает как ей и положено, а вот что бы реализовать день и ночь не получается

Оффлайн Sleepwalker

  • *****
  • Сообщений: 2 546
  • Благодарностей: 69
  • Александр Лапшин
    • Сообщения от Sleepwalker
Re: Помогите разобратся
« Ответ #6 : 24 Янв 2009 [17:06:11] »
Тогда, зная ш,д Солнца можно построить горизонт.
Ниже привиден метод построения радиогоризонта для спутника, что вобщем-то одно и то-же.
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;
}

Оффлайн AbversoftАвтор темы

  • Новичок
  • *
  • Сообщений: 13
  • Благодарностей: 0
    • Сообщения от Abversoft
Re: Помогите разобратся
« Ответ #7 : 24 Янв 2009 [19:13:27] »
спасибо.
попробую разобратся, хотя С для меня темный лес, но видно другого варианта нету

Оффлайн thomas.coding

  • *****
  • Сообщений: 613
  • Благодарностей: 4
  • Web программист, Украина, Мелитополь
    • Сообщения от thomas.coding
    • Каталог RSS
Re: Помогите разобратся
« Ответ #8 : 24 Янв 2009 [19:19:01] »
спасибо.
попробую разобратся, хотя С для меня темный лес, но видно другого варианта нету
Замените в тексте { и } на begin и end, = на := и будет вам счастье.
Телескоп Алькор
Доб 150 мм в разработке

Оффлайн AbversoftАвтор темы

  • Новичок
  • *
  • Сообщений: 13
  • Благодарностей: 0
    • Сообщения от Abversoft
Re: Помогите разобратся
« Ответ #9 : 24 Янв 2009 [19:42:10] »
если бы так просто менять {} на begin и end то давно бы разобрался бы с исходником на С
Ни как немогу разобратся в С как организуюся циклы

Оффлайн thomas.coding

  • *****
  • Сообщений: 613
  • Благодарностей: 4
  • Web программист, Украина, Мелитополь
    • Сообщения от thomas.coding
    • Каталог RSS
Re: Помогите разобратся
« Ответ #10 : 24 Янв 2009 [19:52:54] »
C   
Цитата
for(j=1; j<n;j++){
   тело цикла
}

Pascal
Цитата
for j:=1 to n do

C
k++;

Pascal 
inc(k)

while вроде почти так же.

Вот еще ссылочку нашел
http://articles.org.ru/cfaq/index.php?qid=772
Телескоп Алькор
Доб 150 мм в разработке

Оффлайн AbversoftАвтор темы

  • Новичок
  • *
  • Сообщений: 13
  • Благодарностей: 0
    • Сообщения от Abversoft
Re: Помогите разобратся
« Ответ #11 : 24 Янв 2009 [20:33:19] »
Ребята, я тут в интернете нашел пример то что мне нужно но естественно на яве (если не ошибаюсь он похош на С) может поможете реализовать на Дельфи
Буду очень вам признателен в этом

Оффлайн Андрей Газизов

  • ****
  • Сообщений: 269
  • Благодарностей: 0
  • г. Белгород
    • Сообщения от Андрей Газизов
Re: Помогите разобратся
« Ответ #12 : 24 Янв 2009 [20:36:12] »
Ява и Си имеют почти одинаковый синтаксис. Знаю Си и немного Паскаль - могу помочь. Спрашивайте.
Celestron FirstScope 114 EQ

Оффлайн thomas.coding

  • *****
  • Сообщений: 613
  • Благодарностей: 4
  • Web программист, Украина, Мелитополь
    • Сообщения от thomas.coding
    • Каталог RSS
Re: Помогите разобратся
« Ответ #13 : 24 Янв 2009 [20:37:54] »
Если на Java рабочий вариант. То лучше в нем разобраться и доделать (хотя разбираться в чужом коде это очень геморно). Заодно выучишь еще один язык программирования. Будешь потом на Delphi и паскаль плеваться ;)
Телескоп Алькор
Доб 150 мм в разработке

Оффлайн AbversoftАвтор темы

  • Новичок
  • *
  • Сообщений: 13
  • Благодарностей: 0
    • Сообщения от Abversoft
Re: Помогите разобратся
« Ответ #14 : 24 Янв 2009 [20:46:09] »
 стар уже чтоб изучать другой язык.
за что так нелюбят Паскаль, по мойму пболее понятный
код в принцепе простой (12 кб весит) по сравнению с тем исходником которы й у меня есть (графика только 200 кб, не говоря об математике). В этом коде меня интересует только графика, а в остальном разберемся

Оффлайн елVIс

  • *****
  • Сообщений: 1 360
  • Благодарностей: 15
  • Мне нравится этот форум!
    • Сообщения от елVIс
Re: Помогите разобратся
« Ответ #15 : 24 Янв 2009 [20:50:47] »
если бы так просто менять {} на begin и end то давно бы разобрался бы с исходником на С
Ни как немогу разобратся в С как организуюся циклы


В приведенном коде только цикл while, насколько я вижу. 
Циклы while идентичны паскалевским.

а цикл

for (i=A; i<=B; i++)
{
    .......
}

является эквивалентом в паскале:

i:=A;
while (i<=B) do
begin
  ..
  ..
  i:=i+1;
end


цикл for в Паскале НЕ ЯВЛЯЕТСЯ аналогом for  в С
Это распространенная ошибка

Цитата
за что так нелюбят Паскаль, по мойму пболее понятный

Не обращайте внимание - это обыкновенный снобизм :)
Сие утверждение и ко мне относится тоже
С - краток и выразителен. Паскаль - многословен.
« Последнее редактирование: 24 Янв 2009 [21:01:14] от елVIс »
ТАЛ-150ПМ, Coronado PST, Алькор, Pentax IstD с ЗМ-5СА и МТО-1000

Оффлайн Андрей Газизов

  • ****
  • Сообщений: 269
  • Благодарностей: 0
  • г. Белгород
    • Сообщения от Андрей Газизов
Re: Помогите разобратся
« Ответ #16 : 24 Янв 2009 [21:12:09] »
цикл for в Паскале НЕ ЯВЛЯЕТСЯ аналогом for  в С
Это распространенная ошибка

Зачем вы еще в большее заблуждение вводите человека? Разница в циклах for в Си и Паскале практически нет:
Паскаль:
//повышающий счетчик
for i:=x to y do
begin
//тело цикла
end;

//понижающий счетчик
for i:=y downto x do
begin
//тело цикла
end;

Cи:
//повышающий счетчик
for (i=x; i<=y; i++)
{
//тело цикла
};

//понижающий счетчик
for (i=y; i<=x; i--)
{
//тело цикла
};

ВСЕ ЧТО НУЖНО ЕМУ ЗНАТЬ. Причем любой цикл можно представить в виде другого - например while посредством for (c использованием break) и наоборот. В Паскале repeat можно заменить do...while и т.д.

И вообще глупо расхваливать С или Паскаль - дело вкуса - кому где ясней. Самому больше нравится С.
« Последнее редактирование: 24 Янв 2009 [21:19:49] от Андрей Газизов »
Celestron FirstScope 114 EQ

Оффлайн Андрей Газизов

  • ****
  • Сообщений: 269
  • Благодарностей: 0
  • г. Белгород
    • Сообщения от Андрей Газизов
Re: Помогите разобратся
« Ответ #17 : 24 Янв 2009 [21:16:31] »
если бы так просто менять {} на begin и end то давно бы разобрался бы с исходником на С
Ни как немогу разобратся в С как организуюся циклы

Циклы ВО всех языках организуются одинаково - просто синтаксис записи немного отличается. ;)
Celestron FirstScope 114 EQ

Оффлайн елVIс

  • *****
  • Сообщений: 1 360
  • Благодарностей: 15
  • Мне нравится этот форум!
    • Сообщения от елVIс
Re: Помогите разобратся
« Ответ #18 : 24 Янв 2009 [21:35:31] »
Цитата
Зачем вы еще в большее заблуждение вводите человека? Разница в циклах for в Си и Паскале практически нет:

Да ну?

переведите циклы с помощью паскалевского for
for (i=1;i<=100;i*=4)
for (i=0; (bool) s(i); i=f(i))

ну и т.д.

Цикл for в С является короткой записью цикла while, а цикл for - в паскале - его примитивным ЧАСТНЫМ случаем.
Так что я дал точый алгоритм перевода, всега приводящий к успеху.

ТАЛ-150ПМ, Coronado PST, Алькор, Pentax IstD с ЗМ-5СА и МТО-1000

Оффлайн AbversoftАвтор темы

  • Новичок
  • *
  • Сообщений: 13
  • Благодарностей: 0
    • Сообщения от Abversoft
Re: Помогите разобратся
« Ответ #19 : 24 Янв 2009 [22:52:14] »
Мы не много отвлеклись от темы. По поводу программирование что лучше С или Паскаль то это дело вкуса, на том и другом можно решать одинаковые задачи
Пока тему не закрываю попробую сам разобратся а то судя особо нет желающих помочь немного разобратся в астрономии.
Если кто знаеть по какой формуле строится сия задача т.е постраение светлой стороны или темной стороны земли в зависимости от расположение солшышко (т.е проще говоря дня и ночи), то скинтье (есть один компонент но для работы с ним нужно знать формулу).
В длежайшее время на суд астрономов+праграммеров представлю свое творение(для правельности понимание астрономии) ;D