"Нахождение выпуклой оболочки по заданным массивам точек на Pascal"


Страницы: 1
Пользователь: rmidyaniy
Сообщений: 2
Статус: Пользователь
Зарегистрирован:
26 ноября 2008, 7:10
Был:26 ноября 2008, 7:49
rmidyaniy
smsup
Дата: 26 ноября 2008, 7:25 Сообщение № 1
Нахождение выпуклой оболочки по заданным массивам точек на Pascal
Пользователь: rmidyaniy
Сообщений: 2
Статус: Пользователь
Зарегистрирован:
26 ноября 2008, 7:10
Был:26 ноября 2008, 7:49
rmidyaniy
smsup
Дата: 26 ноября 2008, 7:27 Сообщение № 2
Вот пример программы для нахождения выпуклой оболочки. Используется векторное умножение, если кому интересно.
Код на Pascal
  1. Program tochky;
  2. uses crt,graph;
  3. const kil=20;
  4. type TKoord=array [1..2] of integer;
  5. TMaskoord=array [1..kil] of TKoord;
  6. var xy:TMaskoord;
  7. per,n,i,j,k:integer;
  8. driver,mode:integer;
  9. max,maxb:real;
  10. nmax1,nmax2,opukla:integer;
  11. vec1,vec2:TKoord;
  12. procedure liniya(n1,n2:integer);
  13. begin
  14. if ((xy[n1,2]<0) and (xy[n2,2]<0)) then line(xy[n1,1]+320,-xy[n1,2]+240,xy[n2,1]+320,-xy[n2,2]+240) {obudvi vid'emni}
  15. else begin
  16. if (xy[n1,2]<0) then line(xy[n1,1]+320,-xy[n1,2]+240,xy[n2,1]+320,240-xy[n2,2]) {persha vid'emna}
  17. else if (xy[n2,2]<0) then line(xy[n1,1]+320,240-xy[n1,2],xy[n2,1]+320,-xy[n2,2]+240) {druga vid'emna}
  18. else line(xy[n1,1]+320,240-xy[n1,2],xy[n2,1]+320,240-xy[n2,2]);
  19. end
  20. end;
  21. begin
  22. {VVODUMO KOORDYNATY TOCHOK*************************************************}
  23. textcolor(yellow);
  24. per:=0;
  25. i:=0;
  26. repeat i:=i+1;
  27. read(xy[i,1],xy[i,2]);
  28. write('Exit - ? ');
  29. readln(per);
  30. until per=1;
  31. n:=i; {v n kilkist tochok}
  32. driver:=detect;
  33. initgraph(driver,mode,'A:\');
  34. {MALUEMO KOORDYNATNI OSI****************************************************}
  35. setcolor(red);
  36. line(320,0,320,480);
  37. line(0,240,640,240);
  38. line(320,0,310,10);
  39. line(320,0,330,10);
  40. line(310,10,330,10);
  41. line(640,240,630,230);
  42. line(640,240,630,250);
  43. line(630,230,630,250);
  44. setfillstyle(1,red);
  45. floodfill(319,9,red);
  46. floodfill(321,9,red);
  47. floodfill(631,239,red);
  48. floodfill(631,241,red);
  49. outtextxy(335,10,'Y');
  50. outtextxy(620,220,'X');
  51. {VYZNACHAEMO MAXUMALNU VIDSTAN************************************************}
  52. max:=0;
  53. for i:=1 to n do for j:=1 to n do begin
  54. maxb:=sqrt(sqr(xy[j,2]-xy[i,2])+sqr(xy[j,1]-xy[i,1]));
  55. if maxb>max then begin
  56. max:=maxb;
  57. nmax1:=i;
  58. nmax2:=j;
  59. end;
  60. end;
  61. {mogna korustuvatysia zminnumu per,nmax1,nmax2:integer; max,maxb:real}
  62. {BUDUEMO OPUKLU OBOLONKU******************************************************}
  63. {v n - kilkist tochok}
  64. setcolor(lightblue);
  65. setlinestyle(0,blue,1);
  66. k:=nmax1;
  67. for i:=1 to n do begin
  68. per:=0;
  69. if i=k then i:=i+1;
  70. if i=n+1 then break;
  71. vec1[1]:=xy[i,1]-xy[k,1];
  72. vec1[2]:=xy[i,2]-xy[k,2];
  73. for j:=1 to n do begin
  74. vec2[1]:=xy[j,1]-xy[i,1];
  75. vec2[2]:=xy[j,2]-xy[i,2];
  76. max:=vec1[1]*vec2[2]-vec1[2]*vec2[1];
  77. if max<0 then begin
  78. per:=1;
  79. break;
  80. end;{if max<0}
  81. end; {cykl po j}
  82. if per=0 then begin
  83. {z'ednuemo i i k tochku}
  84. liniya(i,k);
  85. k:=i;
  86. opukla:=i;
  87. i:=1;
  88. if opukla=nmax1 then break;
  89. end;{umova perevirku per=0}
  90. end;{cykl po i}
  91. liniya(nmax1,opukla); {ziednuemo ostanni tochky}
  92. setcolor(white);
  93. setlinestyle(3,white,1);
  94. liniya(nmax1,nmax2); {maluemo naibilshu vidstan}
  95. for i:=1 to n do if xy[i,2]<0 then putpixel(xy[i,1]+320,-xy[i,2]+240,yellow)
  96. else putpixel(xy[i,1]+320,240-xy[i,2],yellow);
  97. {POBUDUVALY TOCHKY,OPUKLU OBOLONKU I NAIBILSHU VIDSTAN****************************}
  98. readln;
  99. end.
  100.  
При использовании обязательна ссылка на http://DMTSoft.ru
Пользователь: irq0000
Сообщений: 2
Статус: Незримый
Зарегистрирован:
25 марта 2009, 0:43
Был:25 марта 2009, 3:02
irq0000
smsup
Дата: 25 марта 2009, 2:24 Сообщение № 3
попробуй в строке read(xy[i,1],xy[i,2]); заменить read(xy[i,1],xy[i,i]);
Пользователь: 12345678
Сообщений: 3
Статус: Незримый
Зарегистрирован:
29 февраля 2008, 15:21
Был:23 апреля 2009, 14:04
12345678
smsup
Дата: 10 апреля 2009, 2:17 Сообщение № 4
работает?

Страницы: 1