Непонятная особенность в работе кода
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.
В чем прикол ???
Чем собсна TList не подходит? Ты в коде, как видно, только коллекцию точек собираешь.
Чем собсна TList не подходит? Ты в коде, как видно, только коллекцию точек собираешь.
DSet - это класс, реализующий множество, из библиотеки SDL. Догадываешься к чему я ? К тому, что в нем содержатся не повторяющиеся элементы и т.д. (стандартное математическое определение), в отличие от TList.
Суть то не в этом. Повторяю проблему:
Данный код работает верно, только тогда, когда EllipseRect.Top=EllipseRect.Left.
В чем прикол ???
Ты добавляешь в "множество" сызнова созданные объекты - они заведомо различны: не похоже что у тебя есть что-то на подобие IComparable интерфейса сравнения двух объектов, а ссылки конечно различны в пределах одного адресного пространства.
А теперь немного по теме.
Полагаю, PtInRegion получает на вход X и Y, тогда как координата x - измеряется по горизонтали (от left до right), а y - по вертикали (от top до bottom).
Теперь глянь что у тебя ;)
Т.е. поменяй местами j и k.
все просходит вот как:
...
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));
А теперь немного по теме.
Полагаю, PtInRegion получает на вход X и Y, тогда как координата x - измеряется по горизонтали (от left до right), а y - по вертикали (от top до bottom).
Теперь глянь что у тебя ;)
Т.е. поменяй местами j и k.
А вот это действительно замылился глаз, по привычке, как в матрице )))
Только сегодня ночью заметил, спасибо !!!