Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - реализация алгоритма Дугласа Пекера MVS2008

Ответить
Настройки темы
C/C++ - реализация алгоритма Дугласа Пекера MVS2008

Новый участник


Сообщения: 2
Благодарности: 0

Профиль | Отправить PM | Цитировать


проги написаны в 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 в проге...

Отправлено: 21:34, 25-09-2010

 


Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - реализация алгоритма Дугласа Пекера MVS2008

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
[решено] Реализация доступа к интернет. zubkoff.s Microsoft Windows NT/2000/2003 24 01-02-2010 11:28
C/C++ - Реализация Zoom`а в Borland C++ Builder DaRiYs Программирование и базы данных 2 21-12-2009 02:12
Реализация конвейера на Си! NEED HELP! st031 Программирование в *nix 2 24-01-2009 10:57
C/C++ - Реализация формулы... ganselo Программирование и базы данных 1 20-01-2009 19:38
Разное - Ситема терминалов (реализация) piling Microsoft Windows 2000/XP 2 13-02-2008 22:52




 
Переход