Форум: "Начинающим";
Текущий архив: 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.042 c