Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.12.04;
Скачать: CL | DM;

Вниз

Как нарисовать на канвасе полумесяц?   Найти похожие ветки 

 
Canvas   (2005-11-15 02:14) [0]

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


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

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


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

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


 
Джо ©   (2005-11-15 03:30) [3]

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

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


 
Джо ©   (2005-11-15 03:32) [4]

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


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

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

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;

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


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


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


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


 
Джо ©   (2005-11-15 04:13) [7]


> [6] Canvas   (15.11.05 04:08)

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


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

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

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


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


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

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


 
Джо ©   (2005-11-15 04:48) [10]


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

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


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


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


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


 
Джо ©   (2005-11-15 05:06) [12]


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

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


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


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


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

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


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


> [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;


 
Джо ©   (2005-11-16 03:16) [15]

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



Страницы: 1 вся ветка

Текущий архив: 2005.12.04;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.029 c
1-1131109482
ViRuSS
2005-11-04 16:04
2005.12.04
Отобразить японские иероглифы


4-1128194544
ArtemESC
2005-10-01 23:22
2005.12.04
Topmost Окнa


1-1131351866
Mitchy
2005-11-07 11:24
2005.12.04
Загрузить форму из библиотеки в осн. приложение


14-1131483638
Guest325
2005-11-09 00:00
2005.12.04
Мопед


14-1131980916
GeserX
2005-11-14 18:08
2005.12.04
Вчерашняя задачка про массивы