Как показано следующее, у меня есть полигон, который содержит целое число баллов:Самый быстрый способ удалить дубликаты точек на краях многоугольника?
type
TPoint = array [1 .. 2] of Integer;
TPointArray = array of TPoint;
Точки на краях, приведены в часовой стрелке порядке, и я хочу, чтобы удалить промежуточные точки (отмеченные красным цветом).
Например, при любых непрерывных трех точках A, B, C, если B находится точно на линии между A и C, тогда B можно безопасно удалить.
Как я могу сделать это быстро и эффективно?
Мой Psedu-код:
procedure RemovePoints(var pt: TPointArray);
var
i, j, sz, k, u: integer;
xoffset, yoffset: integer;
begin
sz := High(pt);
i := 0;
while (True) do
begin
Inc(i);
// points represent array index, so can't be negative,
// we use -1 to mark deletion
if (pt[i][1] = -1) then continue;
if (i = 0) then
begin
break; // finish a loop
end;
j := i + 1;
if (j > sz) then
begin
j := 0;
end;
k := j + 1;
if (k > sz) then
begin
k := 0;
end;
if ((pt[i][1] - pt[j][1] = pt[j][1] - pt[k][1]) and ((pt[i][2] - pt[j][2] = pt[j][2] - pt[k][2]))) then
begin
// remove pt[j];
pt[j][1] := -1;
end;
end;
// TODO: shrink the array to remove deleted points
end;
Вы уже делали какие-либо усилия по кодированию? – Mauren
мой код довольно грязный и, честно говоря. Моя идея состоит в том, чтобы зацикливать все точки (если они не отмечены как дубликаты) в качестве отправной точки и проверить следующие две точки для дублирования ... но я чувствую, что код отвратителен. –
Я бы посоветовал вам разместить хотя бы часть его, так что люди, которые смотрят на ваш вопрос, могут предложить, как вы могли бы сделать его лучше/более реалистичным. – Mauren