Advertisement
Andrey1101

Untitled

Apr 25th, 2017
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.47 KB | None | 0 0
  1. //Алгоритм построения выпуклой оболочки методом "упаковки подарка"
  2. #ifndef _CONVEX_1_H_
  3. #define _CONVEX_1_H_
  4.  
  5. #include "pointsandlines.h"
  6. //Алгоритм возвращает индексы точек множества pset, которые принадлежат его выпуклой оболочке.
  7. //Точки выпуклой оболочки множества pset, в hull упорядочены против часовой стрелки.
  8. template <class Num> void CalcConvexHull(SPointSet<Num>& pset, SChain<Num>& hull){
  9. if(hull.Indexes!=NULL)
  10. delete[] hull.Indexes;
  11. hull.point_set=pset.points;
  12. hull.Indexes=new int[pset.n]; //выделяем память под хранение индексов точек выпуклой оболочки
  13. hull.n=0; //количество точек выпуклой оболочки - на данный момент - 0
  14. hull.Indexes[0]=pset.LeftMost(); //ищем первую точку выпуклой оболочки - например, самую левую
  15. int mindex; //индекс точки-кандидата на добавление в выпуклую оболочку
  16. do{
  17. if(hull.Indexes[hull.n]!=0) //инициализирем индекс точки-кандидата (теоретчески, в качестве начального индекса можно взять индекс произвольной точки множества pset)
  18. mindex=0;
  19. else
  20. mindex=1;
  21. for(int i=1;i<pset.n;i++){ //цикл для всех точек множества pset TODO: i=2
  22. int cmpi;
  23. if((i!=mindex)&&(i!=hull.Indexes[hull.n])){
  24. cmpi=Orientation(pset.points[hull.Indexes[hull.n]],pset.points[mindex],pset.points[i]); //вычисляем ориентацию трёх точек: последняя найденная точка, точка-кандидат, текущая точка
  25. if(cmpi>0) //если ориентация тройки точек положительна - точкой-кандидатом становится текущая точка
  26. mindex=i;
  27. else if(cmpi==0){ //если три точки лежат на одной прямой, точкой-кандидитом становится точка, расопложенная дальше от последняя найденная точка
  28. cmpi=SelectByR(pset.points[mindex],pset.points[i],pset.points[hull.Indexes[hull.n]]);
  29. if(cmpi==COMPARE_SMALLER)
  30. mindex=i; //из двух точек под одинаковым углом выбираем дальнюю.
  31. }
  32. }
  33. }
  34. //записываем новую найденную точку в hull
  35. hull.n++;
  36. if(hull.Indexes[0]==mindex) //условие окончания цикла - индекс найденной точки совпадает с индексом первой точки, т.е. оболочка замкнулась
  37. break;
  38. hull.Indexes[hull.n]=mindex; //hull.Indexes[hull.n] в этом цикле содержит последнюю найденную точку выпуклой оболочки
  39. }while(1);
  40. }
  41.  
  42. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement