Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.02.2013, 00:28   #1
Anton147
 
Регистрация: 15.10.2012
Сообщений: 7
По умолчанию выпуклая оболочка

Задача: разработать программу, которая из заданного массива точек определяет "внешние" точки и строит выпуклую оболочку исходного массива точек.

Прогмамму я написал но при большом количестве точек выходят ошибки! Может я что-то упустил. Ребята помогите плиз...

Исходники во вложениях.
Вложения
Тип файла: rar м-д сканирования.rar (975.7 Кб, 18 просмотров)
Anton147 вне форума Ответить с цитированием
Старый 05.02.2013, 06:57   #2
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Дельфи с включённой опцией Range Check Errors сказала что есть выход за диапазон массива в sliyanie2 указывая строку
Код:
  if ((mass2[i2].X) > (mass1[i1].X)) then
Перепроверяйте все индексы, включите опцию эту (Project-options-compiler) введите 3 точки и запускайте отладку пошагово - увидишь.
phomm вне форума Ответить с цитированием
Старый 05.02.2013, 15:53   #3
Anton147
 
Регистрация: 15.10.2012
Сообщений: 7
По умолчанию

Цитата:
Сообщение от phomm Посмотреть сообщение
Дельфи с включённой опцией Range Check Errors сказала что есть выход за диапазон массива в sliyanie2 указывая строку
Код:
  if ((mass2[i2].X) > (mass1[i1].X)) then
Перепроверяйте все индексы, включите опцию эту (Project-options-compiler) введите 3 точки и запускайте отладку пошагово - увидишь.
спасибо! проверил, нашел ошибку, исправил.

Код:
function sliyanie2(mass1,mass2:TPointsArray;const n,n1,n2:integer):TPointsArray;
  var  i,i1,i2:integer;
  begin
  i1:=0;
  i2:=0;
  SetLength(Result,n);
  for i:=0 to n-1 do
  begin
  if n2=0 then Continue;
  if (i1<n1) and (i2<n2) then
  begin
  if ((mass2[i2].X) > (mass1[i1].X)) then
         begin
         if (i1<n1) then begin Result[i]:=mass1[i1]; inc(i1); end
                  else begin
                       if (i2<n2) then begin Result[i]:=mass2[i2]; inc(i2); end;
                       end;
         end
         else
         begin
         if (i2<n2) then begin Result[i]:=mass2[i2]; inc(i2); end
                  else begin
                       if (i1<n1) then begin Result[i]:=mass1[i1]; inc(i1); end;
                       end;
         end;
  end
  else
  begin
  if (i2=n2) and (i1<n1) then begin Result[i]:=mass1[i1]; inc(i1); end;
  if (i1=n1) and (i2<n2) then begin Result[i]:=mass2[i2]; inc(i2); end;
  end;
  end;
  end;
Не взял в учет то что при окончании одного из массивов он будет проверять элемент который не определен. Теперь все нормально. Но есть еще проблема. Оболочка в некоторых случаях определяется не совсем точно

Последний раз редактировалось Anton147; 05.02.2013 в 16:01.
Anton147 вне форума Ответить с цитированием
Старый 05.02.2013, 19:55   #4
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Чисто алгоритмически затрудняюсь что-то посоветовать. Могу посоветовать только увеличить декомпозицию кода, чтобы свести на нет возможные влияния человеческой ошибки.
Ну или локализуйте проблему и приведите код с поправленным проектом и указанием на область поисков, а самое главное, поясните, в чем математически заключается смысл слов "выпуклая оболочка", а то я, например, затрудняюсь искать то, не знаю что.
phomm вне форума Ответить с цитированием
Старый 06.02.2013, 00:41   #5
Anton147
 
Регистрация: 15.10.2012
Сообщений: 7
По умолчанию

Выпуклая оболочка множества заданных на плоскости точек – это наименьший(т.е. его площадь минимальная) выпуклый многоугольник, который содержит все точки этого множества. При этом все вершины многоугольника – это точки исходного множества точек.
Anton147 вне форума Ответить с цитированием
Старый 07.02.2013, 11:00   #6
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Я так примерно и представлял.
Но помочь вряд ли смогу - погонял немного, редко попадается косяк, даже на большом наборе, плюс дебаг самой сути алгоритма в принципе сложен, задача то специфична. Вот прикрутили бы Вы загрузку точек с файла и намутили такой набор на котором гарантированно Ваш алгоритм даёт косяк, при чём чем меньше набор точек - тем лучше будет, тогда и дебажить сей косяк можно, а так только время уйдёт, иголка в стоге сена, при чём я даже не буду понимать , зачем она мне нужна
phomm вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оболочка на PHP Наталья-1989 PHP 1 05.12.2011 10:41
Оболочка!! Darkelator SQL, базы данных 2 27.02.2011 05:14
Графическая оболочка C++ Якъ Общие вопросы C/C++ 2 09.02.2011 00:32
Autorun (оболочка) vitasonline Мультимедиа в Delphi 3 27.10.2008 16:46
Оболочка в Delphi Айрат БД в Delphi 1 21.12.2006 22:15