Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как нарисовать на канвасе полумесяц? [D7]


Canvas ©   (2005-11-15 02:14:00) 

Какой функцией? Или такой нету?


Джо   (2005-11-16 03:16:00) [1]

Писал наспех, поэтому не делал блоков try/finally, просто пример, доработай его.


Джо   (2005-11-16 03:14:00) [2]


> [13] Canvas   (16.11.05 02:53)

Тут просто берется из GDI готовое перо черного цвета, это просто чтобы упростить код. Код, имеющий более практическое применение выглядел бы примерно так:

procedure DrawHalfMoonShape (ACanvas: TCanvas; Left,Top,Radius: Integer);
var
 Dc: HDC;
 Rgn1,
 Rgn2: HRGN;
begin
 Dc := ACanvas.Handle;

 Rgn1 := CreateEllipticRgn(Left-Radius,Top-Radius,Left+Radius,Top+Radius);
 if Rgn1 = 0 then
   RaiseLastOSError;

 Inc (Left, Radius div 5);
 Dec (Top, Radius div 5);
 Dec(Radius,Radius div 5);
 Rgn2 := CreateEllipticRgn(Left-Radius,Top-Radius,Left+Radius,Top+Radius);
 if Rgn2 = 0 then
   RaiseLastOSError;

 if CombineRgn(Rgn1,Rgn1,Rgn2,RGN_DIFF) = ERROR then
   RaiseLastOSError;

 if not FillRgn(DC,RGN1,ACanvas.Brush.Handle) then
   RaiseLastOSError;

 if not FrameRgn(DC,Rgn1,ACanvas.Pen.Handle,ACanvas.Pen.Width,ACanvas.Pen.Width) then
   RaiseLastOSError;

 DeleteObject (Rgn1);
 DeleteObject (Rgn2);
end;

А кисть и перо устанавливаем для канвы перед вызовом процедуры:

procedure TForm1.Button1Click(Sender: TObject);
begin
 Image1.Canvas.Brush.Style := bsSolid;
 Image1.Canvas.Brush.Color := clTeal;

 Image1.Canvas.Pen.Style := psSolid;
 Image1.Canvas.Pen.Color := clRed;

 DrawHalfMoonShape(Image1.Canvas,100,100,50);
end;


Canvas   (2005-11-16 02:53:00) [3]


> Джо ©   (15.11.05 03:43) [5]
>  FrameRgn(DC,Rgn1,GetStockObject(BLACK_BRUSH),1,1);


А как цвет поменять в этой строчке? Чтобы не чёрный, а бежевый, или ещё какой?

И, кстати, спасибо! Помогло.


Джо   (2005-11-15 05:06:00) [4]


> Форму Земли не знаешь, что-ли ? Шар она. Примерно.

Я знаю форму Земли. И именно поэтому я могу ее нарисовать. Не знал бы формы - не мог бы нарисовать.
П.С. Форма Земли - не шар. Но, весьма примерно-таки - шар =)


Canvas   (2005-11-15 04:56:00) [5]


> Джо ©   (15.11.05 04:48) [10]
>
>
> >  [9] Canvas   (15.11.05 04:43)
> > Посчитать - последнее дело. Главное - нарисовать!
>
> Как можно нарисовать то, форму чего не знаешь?


Примерно.
Форму Земли не знаешь, что-ли ? Шар она. Примерно.


Джо   (2005-11-15 04:48:00) [6]


>  [9] Canvas   (15.11.05 04:43)
> Посчитать - последнее дело. Главное - нарисовать!

Как можно нарисовать то, форму чего не знаешь?


Canvas   (2005-11-15 04:43:00) [7]


> Джо ©   (15.11.05 04:13) [7]
>
>
> > [6] Canvas   (15.11.05 04:08)
>
> Ну, тогда, "нарисовать", имхо - последний вопрос. Сначала
> нужно выяснить, как ее посчитать, а потом уже рисовать.

Посчитать - последнее дело. Главное - нарисовать!


Джо   (2005-11-15 04:17:00) [8]

Не знаю, до чего там дошли, но вот ссылка на обсуждение алгоритмов:

http://www.astronomy.ru/forum/index.php?board=9;action=display;threadid=1176


Джо   (2005-11-15 04:13:00) [9]


> [6] Canvas   (15.11.05 04:08)

Ну, тогда, "нарисовать", имхо - последний вопрос. Сначала нужно выяснить, как ее посчитать, а потом уже рисовать.


Canvas   (2005-11-15 04:08:00) [10]


> Джо ©   (15.11.05 03:43) [5]
> Или нужно не "стилизованное", а именно фазы луны изображать?


Фазы!
Там день такой-то - такая то луна, такой то - такая ...


Джо   (2005-11-15 03:43:00) [11]

Что-то я путанно, похоже изъяснился. Проиллюстрирую примерным кодом (в нем нет обработки ошибок и возможны ляпы, просто иллюстрация):

procedure DrawHalfMoonShape (Dc: HDC; Left,Top,Radius: Integer);
var
 Rgn1,
 Rgn2: HRGN;
begin
 Rgn1 := CreateEllipticRgn(Left-Radius,Top-Radius,Left+Radius,Top+Radius);
 Inc (Left, Radius div 5);
 Dec (Top, Radius div 5);
 Dec(Radius,Radius div 5);
 Rgn2 := CreateEllipticRgn(Left-Radius,Top-Radius,Left+Radius,Top+Radius);
 CombineRgn(Rgn1,Rgn1,Rgn2,RGN_DIFF);

 FrameRgn(DC,Rgn1,GetStockObject(BLACK_BRUSH),1,1);

 DeleteObject (Rgn1);
 DeleteObject (Rgn2);
end;

Рисуем стилизованное изображение полумесяца на TImage:

procedure TForm1.Button1Click(Sender: TObject);
begin
 DrawHalfMoonShape(Image1.Canvas.Handle,100,100,50);
end;

Или нужно не "стилизованное", а именно фазы луны изображать?


Джо   (2005-11-15 03:32:00) [12]

Но, конечно, все зависит от того, какая именно фигура понимается под полумесяцем.


Джо   (2005-11-15 03:30:00) [13]

1. Создаешь 2 еллиптических региона функцией CreateEllipticRgn. Один из них должен "накладываться" на другой соответствующим образом.
2. "Вырезаешь" из одной окружности другую функцией CombineRgn с флагом RGN_DIFF (уточни по MSDN).
3. Рисуешь получившийся "обрезанный" регион функциями FillRgn и/или FrameRgn.

Ну, примерно, так бы я действовал.


Canvas   (2005-11-15 03:09:00) [14]

А может уроком по астрономии?


Германн   (2005-11-15 02:31:00) [15]

2 Canvas   (15.11.05 02:14)
Ты озабочен религией?


Наверх

Титульная страница Поиск, карта сайта Написать письмо