Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2005.12.04;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.043 c
2-1132288585
fligapter
2005-11-18 07:36
2005.12.04
перемещение указателя записи из другой формы


14-1131948554
Ega23
2005-11-14 09:09
2005.12.04
С днем рождения! 14 ноября


2-1132162568
Vano85
2005-11-16 20:36
2005.12.04
Загрузка визуальных компонентов из DLL


5-1115917356
greyserg
2005-05-12 21:02
2005.12.04
Как запретить обработку сообщения, если объект уже Destroy ?


2-1132169264
NightLord
2005-11-16 22:27
2005.12.04
InternetExplorer





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский