Главная страница
    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.04 c
2-1132081181
Flood_control
2005-11-15 21:59
2005.12.04
Сортировка в BDE Paradox7


14-1131956291
Bogdan1024
2005-11-14 11:18
2005.12.04
Crystal Reports 10


10-1108636552
Swimmer
2005-02-17 13:35
2005.12.04
Так стоит использовать CORBA


2-1132477613
AlexLines
2005-11-20 12:06
2005.12.04
Отчего нет печати


3-1129701482
Smolin
2005-10-19 09:58
2005.12.04
Очередность выполнения SQL запросов





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский