Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Delphi, Kylix and Pascal


Ответ
 
Опции темы Опции просмотра
Старый 14.04.2009, 13:19   #1 (permalink)
Шамиль
Новичок
 
Регистрация: 31.03.2009
Сообщений: 5
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Найти общую часть окружностей

Нужно нарисовать произвольное количество окружностей радиуса R=[20;40]
Общую часть накладывающихся друг на друга окружностей закрасить зелёным цветом.
Шамиль вне форума   Ответить с цитированием

Старый 14.04.2009, 13:19
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Найдены следующие совпадения с вашей темой

Ремонт HP DV6000 серии. Часть 2
Проблема с концентратором. Часть 2

Старый 14.04.2009, 13:32   #2 (permalink)
csbwalker
Member
 
Аватар для csbwalker
 
Регистрация: 03.03.2009
Сообщений: 87
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 187
По умолчанию

Какой язык, среда?
csbwalker вне форума   Ответить с цитированием
Старый 14.04.2009, 13:58   #3 (permalink)
Шамиль
Новичок
 
Регистрация: 31.03.2009
Сообщений: 5
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Delphi
Шамиль вне форума   Ответить с цитированием
Старый 17.04.2009, 03:08   #4 (permalink)
Шамиль
Новичок
 
Регистрация: 31.03.2009
Сообщений: 5
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

У меня возникает вопрос(точнее два, но второй, наверное, не по теме) по следующему коду:
Код:
var
  Form1: TForm1;
  R: array [0..n] of Record
                        R: 20..40;
                        P: TPoint;
                        C: TColor;
                     end;
...
var
  I, J: Integer;
  P1: array [0..n] of HRGN;
  P: HRGN;
  DC: HDC;
begin
  Canvas.Brush.Color:= clBtnFace;
  Canvas.Rectangle(0, 0, Width, Height);
  for I:= 0 to n do
    with R[I] do
      begin
        R:= Random(20) + 21;
        P.X:= Random(Width - 2*R) + R;
        P.Y:= Random(Height - 2*R) + R;
        C:= RGB(0, random(255), random(255));
        Canvas.Pen.Color:= C;
        Canvas.Brush.Color:= C;
        Canvas.Ellipse(P.X - R, P.Y - R, P.X + R, P.Y + R);
        P1[I]:= CreateEllipticRgn(P.X - R, P.Y - R, P.X + R, P.Y + R);
      end;
  Canvas.Brush.Color:= clRed;
  DC:= GetDC(Handle);
  for I:= 0 to n do
    for J:= 0 to n do
      begin
        CombineRgn(P, P1[I], P1[J], RGN_AND);
        FillRgn(DC, P, Canvas.Brush.Handle);
      end;
end;
Здесь:
1) В результате ни один из кругов не закрашен в красный цвет;
2) Круги выходят за пределы формы.
Шамиль вне форума   Ответить с цитированием
Старый 20.04.2009, 14:28   #5 (permalink)
Шамиль
Новичок
 
Регистрация: 31.03.2009
Сообщений: 5
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

В общем, проблема 1) решена:
Код:
var
  I, J: Integer;
  P1: array [0..n] of HRGN;
  P: HRGN;
  DC: HDC;
begin
  B.Canvas.Brush.Color:= clBtnFace;
//Тип: TBitmap(объявлена как глобальная переменная)
  B.Canvas.Rectangle(0, 0, Width, Height);
  for I:= 0 to n do
    with R[I] do//Массив записей(R - радиус, P - центр, С - цвет)
      begin
        B.Canvas.Pen.Color:= C;
        B.Canvas.Brush.Color:= C;
        if (P.X + dx[I] - R<=0) or (P.X + dx[I] + R>=ClientWidth)
          then
// Смещение по оси Ox(у каждого круга разная "скорость")
            dx[I]:= -dx[I];

        P.X:=P.X + dx[I];

        if (P.Y + dy[I] - R<=0) or (P.Y + dy[I] + R>=ClientHeight)
          then
            dy[I]:= -dy[I];// Смещение по оси Oy
        P.Y:=P.Y + dy[I];

        B.Canvas.Ellipse(P.X - R, P.Y - R, P.X + R, P.Y + R);
        P1[I]:= CreateEllipticRgn(P.X - R, P.Y - R, P.X + R, P.Y + R);
      end;
  Canvas.Draw(0, 0, B);
  Canvas.Brush.Color:= clRed;
  DC:= Canvas.Handle;
  P:= CreateEllipticRgn(0,0,1,1);
  for I:= 0 to n do
    for J:= I+1 to n do
      begin
        CombineRgn(P, P1[I], P1[J], RGN_AND);
        FillRgn(DC, P, Canvas.Brush.Handle);
      end;
end;
Только через некоторое время круги перестают закрашиваться. Не понимаю что именно переполняется(может дескриптор окна). Если Bitmap объявить в Timer1Timer, то получаю ошибку "Неверный дескриптор". И мерцание при большом количестве кругов.
Шамиль вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 23:21.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.