Advertisement
noler89

Untitled

Jan 7th, 2015
190
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.93 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <fstream>
  4. #include <ctime>
  5. using namespace std;
  6. struct Point{
  7. double x, y;
  8. Point(){
  9. x = 0;
  10. y = 0;
  11. }
  12. };
  13. struct Line{ // структура линии, впоследствии, луча;
  14. double k, b;
  15. Point A;
  16. Line(){
  17. A.x = 0;
  18. A.y = 0;
  19. k = 0;
  20. b = 0;
  21. }
  22. };
  23. Line getl(Point a, Point b);
  24. bool pocr(Line L, Point C);
  25. Point centre(Point A, Point B);
  26. int sravnx(Point A, Point B);
  27. int sravny(Point A, Point B);
  28. Point point_crossing(Point a1, Point a2, Point b1, Point b2);
  29. int check_top(Point A, Point B);
  30. bool pocr1(Point a1, Point a2, Point C);
  31. int main(int argc, char **argv){
  32. if (argc < 2){
  33. cout << "Error: not enpugh input arguments" << endl;
  34. return 1; // на случай, если в командную строку не ввели название файла
  35. }
  36. ifstream fin;
  37. ofstream fout;
  38. fin.open(argv[1]);
  39. fout.open(argv[2]); // открывает файл с координатами и количеством точеr
  40. if (!fin.is_open()){ // в случае, если файл не открылся
  41. cout << "Error: can't open the file" << endl;
  42. return 1;
  43. }
  44. int pol1, pol2; // количество вершин перовго и второго многоугольников
  45. fin >> pol1 >> pol2; // считывает количество вершин первого и второго многоугольников из файла
  46. int pol3 = pol1 + pol2;
  47. int m = 0; // счетчик правильных точек пересечения
  48. Point *polygon1 = new Point[pol1]; // массив вершин первого многоугольника
  49. Point *polygon2 = new Point[pol2]; // массив вершин второго многоугольника
  50. for (int i = 0; i < pol1; i++){
  51. fin >> polygon1[i].x; // по очереди считывает строки с данными из файла
  52. fin >> polygon1[i].y;
  53. }
  54. for (int i = 0; i < pol2; i++){ // заполнение массивов вершин многоугольников
  55. fin >> polygon2[i].x;
  56. fin >> polygon2[i].y;
  57. }
  58. int mesto = 0; // результат sravnx
  59. Point pointN1, pointN2;
  60. Point *pointCross1 = new Point[pol1];
  61. Point *pointCross2 = new Point[pol2];
  62. Point *center1 = new Point[pol1];
  63. Point *center2 = new Point[pol2];
  64. center1[pol1 - 1] = centre(polygon1[pol1 - 1], polygon1[0]);
  65. center2[pol2 - 1] = centre(polygon2[pol2 - 1], polygon2[0]);
  66. for (int i = 0; i < pol1 - 1; i++)
  67. center1[i] = centre(polygon1[i], polygon1[i + 1]);
  68. for (int i = 0; i < pol2 - 1; i++)
  69. center2[i] = centre(polygon2[i], polygon2[i + 1]);
  70. /*for (int i=0;i<pol1;i++)
  71. cout << center1[i].x << " " << center1[i].y << endl;
  72. cout << "centre 2"<< endl;
  73. for (int i=0;i<pol2;i++)
  74. cout << center2[i].x << " " << center2[i].y << endl;*/
  75. Line test;
  76. for (int i = 0; i < pol2; i++){
  77. int z = 0;
  78. while (z < pol1){
  79. int flag = 0;
  80. test = getl(polygon2[i], center1[z]);
  81. cout << "new:" << endl;
  82. cout << "polygon2[" << i << "]:";
  83. cout << polygon2[i].x << " " << polygon2[i].y << endl;
  84. cout << "center1[" << z << "]:";
  85. cout << center1[z].x << " " << center1[z].y << endl;
  86. if (sravnx(center1[z], polygon2[i]) == 2)
  87. cout << "x=" << polygon2[i].x << endl;
  88. //тут добавить sravny(2 раза, для каждой sravnx)
  89. if (sravnx(center1[z], polygon2[i]) == 1)
  90. cout << "x>" << polygon2[i].x << endl;
  91. if (sravnx(center1[z], polygon2[i]) == 0)
  92. cout << "x<" << polygon2[i].x << endl;
  93. cout << "y=" << test.k << "*x+" << test.b << endl;
  94. for (int j = 0; j < pol1; j++){
  95. //cout << " polygon1[" << j << "]:" << polygon1[j].x << " " << polygon1[j].y << endl;
  96. //cout << "ysl: " << sravnx(center1[z],polygon2[i]) << "~" << polygon2[i].x << " " << polygon1[j].y << "==" << test.k*polygon1[j].x+test.b << endl;
  97. if (sravnx(center1[z], polygon2[i]) == 2)
  98. if ((polygon1[j].x == polygon2[i].x) && (polygon1[j].y == test.k*polygon1[j].x + test.b)){
  99. flag = 1;
  100. //cout << "lol polygon1[" << j << "]:" << polygon1[j].x << " " << polygon1[j].y << endl;
  101. break;
  102. }
  103. //тут добавить sravny(2 раза, для каждой sravnx)
  104. if (sravnx(center1[z], polygon2[i]) == 1)
  105. if ((polygon1[j].x > polygon2[i].x) && (polygon1[j].y == test.k*polygon1[j].x + test.b)){
  106. flag = 1;
  107. //cout << "lol polygon1[" << j << "]:" << polygon1[j].x << " " << polygon1[j].y << endl;
  108. break;
  109. }
  110. if (sravnx(center1[z], polygon2[i]) == 0)
  111. if ((polygon1[j].x < polygon2[i].x) && (polygon1[j].y == test.k*polygon1[j].x + test.b)){
  112. flag = 1;
  113. //cout << "lol polygon1[" << j << "]:" << polygon1[j].x << " " << polygon1[j].y << endl;
  114. break;
  115. }
  116. }
  117. mesto = sravnx(center1[z], polygon2[i]);
  118. //добавить вторую переменную (mestoy), изменить прошлую на mestox, mestoy заолнять так: есть sravnx!=2,то хуй забить, если =2, то ебашить функцию
  119. cout << endl;
  120. if (flag == 1)
  121. z++;
  122. if (flag == 0){
  123. pointN1 = center1[z];
  124. pointN2 = polygon2[i];
  125. break;
  126. }
  127. }
  128. fout << "AZAZ: " << pointN2.x << " " << pointN2.y << "\t" << pointN1.x << " " << pointN1.y << "\t" << "x " << mesto << " " << polygon2[i].x << endl << endl;
  129. pointCross1[pol1 - 1] = point_crossing(pointN1, pointN2, polygon1[pol1 - 1], polygon1[0]);
  130. //cout << pocr1(polygon1[pol1-1],polygon1[0],pointCross1[pol1-1]) << endl;
  131. if (pocr1(polygon1[pol1 - 1], polygon1[0], pointCross1[pol1 - 1]) == false){
  132. pointCross1[pol1 - 1].x = 9999999;
  133. pointCross1[pol1 - 1].y = 9999999;
  134. }
  135. if (mesto == 2)
  136. if (pointCross1[pol1 - 1].x == polygon2[i].x){
  137. pointCross1[pol1 - 1].x = 9999999;
  138. pointCross1[pol1 - 1].y = 9999999;
  139. //тут добавить sravny(2 раза, для каждой sravnx)
  140. if (mesto == 1)
  141. if (pointCross1[pol1 - 1].x <= polygon2[i].x){
  142. pointCross1[pol1 - 1].x = 9999999;
  143. pointCross1[pol1 - 1].y = 9999999;
  144. }
  145. if (mesto == 0)
  146. if (pointCross1[pol1 - 1].x >= polygon2[i].x){
  147. pointCross1[pol1 - 1].x = 9999999;
  148. pointCross1[pol1 - 1].y = 9999999;
  149. }
  150. for (int f = 0; f < pol1 - 1; f++){
  151. pointCross1[f] = point_crossing(pointN1, pointN2, polygon1[f], polygon1[f + 1]);
  152. if (pocr1(polygon1[f], polygon1[f + 1], pointCross1[f]) == false){
  153. pointCross1[f].x = 9999999;
  154. pointCross1[f].y = 9999999;
  155. }
  156. if (mesto == 2)
  157. if (pointCross1[f].x == polygon2[i].x){
  158. pointCross1[f].x = 9999999;
  159. pointCross1[f].y = 9999999;
  160. }
  161. //тут добавить sravny(2 раза, для каждой sravnx)
  162. //cout << "CHECK " << pointCross1[f].x << " " << mesto << " " << polygon2[i].x<<endl;
  163. if (mesto == 1)
  164. if (pointCross1[f].x <= polygon2[i].x){
  165. pointCross1[f].x = 9999999;
  166. pointCross1[f].y = 9999999;
  167. }
  168. if (mesto == 0)
  169. if (pointCross1[f].x >= polygon2[i].x){
  170. pointCross1[f].x = 9999999;
  171. pointCross1[f].y = 9999999;
  172. }
  173. }
  174. for (int f = 0; f < pol1; f++)
  175. fout << pointCross1[f].x << " " << pointCross1[f].y << endl;
  176. fout << endl;
  177. }
  178. //вот тут проверить check_top pointCross1 с вершинами polygon2
  179. fout << "-----------------------------------------------" << endl << "-----------------------------------------------" << endl;
  180. for (int i = 0; i < pol1; i++){
  181. int z = 0;
  182. while (z < pol2){
  183. int flag = 0;
  184. test = getl(polygon1[i], center2[z]);
  185. cout << "new:" << endl;
  186. cout << "polygon1[" << i << "]:";
  187. cout << polygon1[i].x << " " << polygon1[i].y << endl;
  188. cout << "center2[" << z << "]:";
  189. cout << center2[z].x << " " << center2[z].y << endl;
  190. if (sravnx(center2[z], polygon1[i]) == 2)
  191. cout << "x=" << polygon1[i].x << endl;
  192. if (sravnx(center2[z], polygon1[i]) == 1)
  193. cout << "x>" << polygon1[i].x << endl;
  194. if (sravnx(center2[z], polygon1[i]) == 0)
  195. cout << "x<" << polygon1[i].x << endl;
  196. cout << "y=" << test.k << "*x+" << test.b << endl;
  197. for (int j = 0; j < pol2; j++){
  198. //cout << " polygon2[" << j << "]:" << polygon2[j].x << " " << polygon2[j].y << endl;
  199. //cout << "ysl: " << sravnx(center2[z],polygon1[i]) << "~" << polygon1[i].x << " " << polygon2[j].y << "==" << test.k*polygon2[j].x+test.b << endl;
  200. if (sravnx(center2[z], polygon1[i]) == 2)
  201. if ((polygon2[j].x == polygon1[i].x) && (polygon2[j].y == test.k*polygon2[j].x + test.b)){
  202. flag = 1;
  203. //cout << "lol polygon2[" << j << "]:" << polygon2[j].x << " " << polygon2[j].y << endl;
  204. break;
  205. }
  206. //тут добавить sravny(2 раза, для каждой sravnx)
  207. if (sravnx(center2[z], polygon1[i]) == 1)
  208. if ((polygon2[j].x > polygon1[i].x) && (polygon2[j].y == test.k*polygon2[j].x + test.b)){
  209. flag = 1;
  210. //cout << "lol polygon2[" << j << "]:" << polygon2[j].x << " " << polygon2[j].y << endl;
  211. break;
  212. }
  213. if (sravnx(center2[z], polygon1[i]) == 0)
  214. if ((polygon2[j].x < polygon1[i].x) && (polygon2[j].y == test.k*polygon2[j].x + test.b)){
  215. flag = 1;
  216. //cout << "lol polygon2[" << j << "]:" << polygon2[j].x << " " << polygon2[j].y << endl;
  217. break;
  218. }
  219. }
  220. mesto = sravnx(center2[z], polygon1[i]);
  221. //cout << "CHECK " << pointCross1[f].x << " " << mesto << " " << polygon2[i].x<<endl;
  222. cout << endl;
  223. if (flag == 1) // если вершина не найдена, то подставляем следующую
  224. z++;
  225. if (flag == 0){
  226. pointN1 = center2[z];
  227. pointN2 = polygon1[i];
  228. break;
  229. }
  230. }
  231. fout << "AZAZ: " << pointN2.x << " " << pointN2.y << "\t" << pointN1.x << " " << pointN1.y << "\t" << "x " << mesto << " " << polygon1[i].x << endl << endl;
  232. pointCross2[pol2 - 1] = point_crossing(pointN1, pointN2, polygon2[pol2 - 1], polygon2[0]);
  233. //cout << pocr1(polygon2[pol2-1],polygon2[0],pointCross2[pol2-1]) << endl;
  234. if (pocr1(polygon2[pol2 - 1], polygon2[0], pointCross2[pol2 - 1]) == false){
  235. pointCross2[pol2 - 1].x = 111;
  236. pointCross2[pol2 - 1].y = 112;
  237. }
  238. if (mesto == 2)
  239. if (pointCross2[pol2 - 1].x == polygon1[i].x){
  240. pointCross2[pol2 - 1].x = 121;
  241. pointCross2[pol2 - 1].y = 122;
  242. }
  243. //тут добавить sravny(2 раза, для каждой sravnx)
  244. if (mesto == 1)
  245. if (pointCross2[pol2 - 1].x <= polygon1[i].x){
  246. pointCross2[pol2 - 1].x = 131;
  247. pointCross2[pol2 - 1].y = 132;
  248. }
  249. if (mesto == 0)
  250. if (pointCross2[pol2 - 1].x >= polygon1[i].x){
  251. pointCross2[pol2 - 1].x = 141;
  252. pointCross2[pol2 - 1].y = 142;
  253. }
  254. for (int f = 0; f < pol2 - 1; f++){
  255. pointCross2[f] = point_crossing(pointN1, pointN2, polygon2[f], polygon2[f + 1]);
  256. if (pocr1(polygon2[f], polygon2[f + 1], pointCross2[f]) == false){
  257. pointCross2[f].x = 211;
  258. pointCross2[f].y = 211;
  259. }
  260. if (mesto == 2)
  261. if (pointCross2[f].x == polygon1[i].x){
  262. pointCross2[f].x = 221;
  263. pointCross2[f].y = 222;
  264. }
  265. //тут добавить sravny(2 раза, для каждой sravnx)
  266. //cout << "CHECK " << pointCross1[f].x << " " << mesto << " " << polygon2[i].x<<endl;
  267. if (mesto == 1)
  268. if (pointCross2[f].x <= polygon1[i].x){
  269. pointCross2[f].x = 231;
  270. pointCross2[f].y = 232;
  271. }
  272. if (mesto == 0)
  273. if (pointCross2[f].x >= polygon1[i].x){
  274. pointCross2[f].x = 241;
  275. pointCross2[f].y = 242;
  276. }
  277. }
  278. for (int f = 0; f < pol2; f++)
  279. fout << pointCross2[f].x << " " << pointCross2[f].y << endl;
  280. fout << endl;
  281. }
  282. //вот тут проверить check_top pointCross2 с вершинами polygon1
  283. fin.close();
  284. fout.close();
  285. system("pause");
  286. return 0;
  287. }
  288. }
  289. Line getl(Point a, Point b){
  290. Line L1;
  291. L1.k = (b.y - a.y) / (b.x - a.x);
  292. L1.b = a.y - (b.y - a.y) / (b.x - a.x)*a.x;
  293. return L1;
  294. }
  295. bool pocr(Line L, Point C){
  296. if (C.y == L.k*C.x + L.b)
  297. return true;
  298. else return false;
  299. }
  300. Point centre(Point A, Point B){
  301. Point C;
  302. C.x = (A.x + B.x) / 2;
  303. C.y = (A.y + B.y) / 2;
  304. return C;
  305. }
  306. int sravnx(Point A, Point B){ // 0 - правее, 1 - левее, 2 равно
  307. if (A.x == B.x)
  308. return 2;
  309. if (A.x > B.x)
  310. return 1;
  311. if (A.x < B.x)
  312. return 0;
  313. }
  314. int sravny(Point A, Point B){ // 0 - выше, 1 - ниже
  315. if (A.y > B.y)
  316. return 1;
  317. if (A.y < B.y)
  318. return 0;
  319. }
  320. int check_top(Point A, Point B){
  321. if ((A.x == B.x) && (A.y==B.y))
  322. return 1;
  323. else
  324. return 0;
  325. }
  326. Point point_crossing(Point a1, Point a2, Point b1, Point b2){// выводит точку пересечения прямых
  327. Point cross; // точка пересечения прямых
  328. double x1, y1, x2, y2, x3, y3, x4, y4, k, b, m, n;
  329. x1 = a1.x; y1 = a1.y;
  330. x2 = a2.x; y2 = a2.y;
  331. x3 = b1.x; y3 = b1.y;
  332. x4 = b2.x; y4 = b2.y;
  333. k = (y1 - y2) / (x1 - x2);
  334. b = y1 - x1*k;
  335. m = (y3 - y4) / (x3 - x4);
  336. n = y3 - x3*m;
  337. if ((x1 == x2) && (y1 != y2) && (y3 != y4) && (x3 != x4)){ // рассмотрим случаи, при которых точка пересечения не может быть найдена или не работает формула: 1) |/
  338. cross.x = x1;
  339. cross.y = m*x1 + n;
  340. }
  341. else if ((x1 != x2) && (y1 != y2) && (y3 != y4) && (x3 == x4)){ // 2) \|
  342. cross.x = x3;
  343. cross.y = k*x3 + b;
  344. }
  345. else if ((x1 == x2) && (y1 != y2) && (y3 != y4) && (x3 == x4)){ // 3) ||
  346. cross.x = pow(10, 10);
  347. cross.y = pow(10, 10);
  348. }
  349. else if ((x1 != x2) && (y1 == y2) && (y3 == y4) && (x3 != x4)){ // 4) =
  350. cross.x = pow(10, 10);
  351. cross.y = pow(10, 10);
  352. }
  353. else if ((x1 != x2) && (y1 == y2) && (y3 != y4) && (x3 == x4)){ // 5) -|
  354. cross.x = x3;
  355. cross.y = y1;
  356. }
  357. else if ((x1 == x2) && (y1 != y2) && (y3 == y4) && (x3 != x4)){ // 6) |-
  358. cross.x = x1;
  359. cross.y = y3;
  360. }
  361. else{ // 7) \/
  362. cross.x = ((y1 - y3 - (x1*(y1 - y2)) / (x1 - x2) + (x3*(y3 - y4)) / (x3 - x4)) / ((y3 - y4) / (x3 - x4) - (y1 - y2) / (x1 - x2)));
  363. cross.y = ((y1 - y2) / (x1 - x2)*cross.x + y1 - (x1*(y1 - y2) / (x1 - x2)));
  364. }
  365. //cout << "CHECK " << a1.x << " " << a1.y << "\t" << a2.x << " " << a2.y << "\t" << b1.x << " " << b1.y << "\t" << b2.x << " " << b2.y << endl;
  366. //cout << "ANSWER " << cross.x << " " << cross.y << endl;
  367. return cross;
  368. }
  369. bool pocr1(Point a1, Point a2, Point C){ // определяет, лежит ли найденная точка пересечения на ребрах многоугольников
  370. bool T = false;
  371. double line1, dis11, dis12;
  372. //cout << "CHECK1 " << a1.x<< " " << a1.y << "\t" << a2.x << " " << a2.y << "\t" << C.x << " " << C.y<< endl;
  373. line1 = sqrt((pow((a1.x - a2.x), 2)) + (pow((a1.y - a2.y), 2)));
  374. dis11 = sqrt((pow((a1.x - C.x), 2)) + (pow((a1.y - C.y), 2)));
  375. dis12 = sqrt((pow((a2.x - C.x), 2)) + (pow((a2.y - C.y), 2)));
  376. //cout << "CHECK2 " << (dis11 + dis12) << "=" << (line1) << endl;
  377. if (abs(dis11 + dis12 - line1)<0.001)
  378. if (round(dis11 + dis12) == round(line1))
  379. T = true;
  380. else
  381. if ((dis11 + dis12) == (line1))
  382. T = true;
  383. return T;
  384. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement