Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Непонятная особенность в работе кода

7.1K
19 апреля 2007 года
Dunkel
33 / / 16.11.2005
Имеется эллипс(круг), который ограничен прямоугольником EllipseRect. Требуется заполнить множество S точками, которые принадлежат этому кругу(лежат внутри). Для этого использую следующий код:
Код:
TMyPoint = class
  public
    x: Integer;
    y: Integer;
    constructor Create(tX: Integer; tY: Integer);
  end;
  ...
  constructor TMyPoint.Create(tX: Integer; tY: Integer);
  begin
    x := tX;  y := tY;
  end;
  ...

  S: DSet;
  EllipseRect: TRect;
  j,k: Integer;
  Rgn: HRGN;
  ...

  Rgn := CreateEllipticRgnIndirect(EllipseRect);
  if Rgn <> 0 then
    try
      for j := EllipseRect.Top to EllipseRect.Bottom do
        for k := EllipseRect.Left to EllipseRect.Right do
          if PtInRegion(Rgn,j,k) then
                S.add([TMyPoint.Create(j,k)]);  

    finally
      DeleteObject(Rgn);
    end;


Данный код работает верно, только тогда, когда EllipseRect.Top=EllipseRect.Left.
В чем прикол ???
5
19 апреля 2007 года
hardcase
4.5K / / 09.08.2005
Честно говоря, впервые слышу о типе DSet...

Чем собсна TList не подходит? Ты в коде, как видно, только коллекцию точек собираешь.
7.1K
20 апреля 2007 года
Dunkel
33 / / 16.11.2005
Цитата: hardcase
Честно говоря, впервые слышу о типе DSet...

Чем собсна TList не подходит? Ты в коде, как видно, только коллекцию точек собираешь.



DSet - это класс, реализующий множество, из библиотеки SDL. Догадываешься к чему я ? К тому, что в нем содержатся не повторяющиеся элементы и т.д. (стандартное математическое определение), в отличие от TList.

Суть то не в этом. Повторяю проблему:
Данный код работает верно, только тогда, когда EllipseRect.Top=EllipseRect.Left.
В чем прикол ???

5
20 апреля 2007 года
hardcase
4.5K / / 09.08.2005
Цитата: Dunkel
DSet - это класс, реализующий множество, из библиотеки SDL. Догадываешься к чему я ? К тому, что в нем содержатся не повторяющиеся элементы и т.д. (стандартное математическое определение), в отличие от TList.

Ты добавляешь в "множество" сызнова созданные объекты - они заведомо различны: не похоже что у тебя есть что-то на подобие IComparable интерфейса сравнения двух объектов, а ссылки конечно различны в пределах одного адресного пространства.

А теперь немного по теме.
Полагаю, PtInRegion получает на вход X и Y, тогда как координата x - измеряется по горизонтали (от left до right), а y - по вертикали (от top до bottom).

Теперь глянь что у тебя ;)
Т.е. поменяй местами j и k.

7.1K
20 апреля 2007 года
Dunkel
33 / / 16.11.2005
Цитата: hardcase
Ты добавляешь в "множество" сызнова созданные объекты - они заведомо различны: не похоже что у тебя есть что-то на подобие IComparable интерфейса сравнения двух объектов, а ссылки конечно различны в пределах одного адресного пространства.


все просходит вот как:

Код:
S: DSet;

  ...
  function ComparatorPoint(ptr : Pointer; const obj1, obj2 : DObject) :       Integer;
  begin
    Result := (TMyPoint(obj1.VObject).x - TMyPoint(obj2.VObject).x);
    if Result = 0 then
      Result := (TMyPoint(obj1.VObject).y - TMyPoint(obj2.VObject).y);
  end;
  ...

  S := DSet.CreateWith(makeComparator(ComparatorPoint));


Цитата: hardcase

А теперь немного по теме.
Полагаю, PtInRegion получает на вход X и Y, тогда как координата x - измеряется по горизонтали (от left до right), а y - по вертикали (от top до bottom).

Теперь глянь что у тебя ;)
Т.е. поменяй местами j и k.


А вот это действительно замылился глаз, по привычке, как в матрице )))
Только сегодня ночью заметил, спасибо !!!

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог