Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   реализация алгоритма Дугласа Пекера MVS2008 (http://forum.oszone.net/showthread.php?t=186473)

greyreality 25-09-2010 21:34 1504226

реализация алгоритма Дугласа Пекера MVS2008
 
проги написаны в MVS2008

Ломанная рисуется алгоритмом Брезенхема.
Координаты считываются по умолчанию с файла linia.txt либо файл задается первым аргументом ком.строки.
В файле первая цифра=число точек. Исходник http://ifolder.ru/19474320
Т.О. получается что с файла считываются точки в массив типа int.

struct XY{ //структура точки
int x,y;
};
XY array[200]; массив считанных точек

В эту программу необходимо дополнить данным алгоритмом Дугласа-Пекера.
на русскомhttp://habrahabr.ru/blogs/personal/81854/
на английсскомhttp://en.wikipedia.org/wiki/Ramer%E...cker_algorithm


Алгоритм Дугласа-Пекера предназначен для сокращения числа точек аппроксимированной кривой. Поскольку кривая состоит из отрезков необходимо построить аналогичную кривую, используя меньшее число точек. Упрощенная кривая состоит из подмножества точек, составляющих исходную кривую.

Псевдокод.
function DouglasPeucker(PointList[], epsilon)
//Find the point with the maximum distance
dmax = 0
index = 0
for i = 2 to (length(PointList) - 1)
d = OrthogonalDistance(PointList[i], Line(PointList[1], PointList[end]))
if d > dmax
index = i
dmax = d
end
end //If max distance is greater than epsilon, recursively simplify
if dmax >= epsilon
//Recursive call
recResults1[] = DouglasPeucker(PointList[1...index], epsilon)
recResults2[] = DouglasPeucker(PointList[index...end], epsilon)
// Build the result list
ResultList[] = {recResults1[1...end-1] recResults2[1...end]}
else
ResultList[] = {PointList[1], PointList[end]}
end //Return the result
return ResultList[] end.

В данный момент написана только подфункция высчитывающая расстояние от точки до отрезка
d = OrthogonalDistance(PointList[i], Line(PointList[1], PointList[end]))
Все точки задаются в самой программе. Исходник http://ifolder.ru/19474350

Проблемы:
1-Несоответствия типов структуры XY т.к. в рисующей программе с файла считывают тип int,
а в рассчитывающей программе из-за дробного расстояния, корней и округления до целых чисел
используется тип long double.
надо как то считать сразу в тип long double или преобразовать считанные значения с файла...

2-При самой реализации алгоритма не могу представить как передавать сам массив...
в псевдокоде есть переменная end, кот. обозначает крайнюю точку массива, а как её найти самому?
да и в саму функцию DouglasPeucker передается не указатель, а сам массив целиком...
В общем не могу представить как работать с этим массивом PointList О_О, у меня он array в проге...


Время: 02:06.

Время: 02:06.
© OSzone.net 2001-