Advertisement
Guest User

Untitled

a guest
Jun 24th, 2017
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.24 KB | None | 0 0
  1. //---------------------------------------------------------------------------
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <math.h>
  5.  
  6. #define SUCCESS 0
  7. #define POCET_BODU 4
  8.  
  9. //---------------------------------------------------------------------------
  10. void Konec(int chyba);
  11. void PosunPole(long long int *souradnice_X, long long int *souradnice_Y);
  12. char SpocitejPolohuBodu(long long int *souradnice_X, long long int *souradnice_Y, char posledni);
  13. //---------------------------------------------------------------------------
  14. long long int bod_X, bod_Y;
  15. char          konvexni = 1;
  16. //---------------------------------------------------------------------------
  17. int main()
  18. {
  19.   long long int souradnice_X[POCET_BODU], souradnice_Y[POCET_BODU];
  20.   char lezi = 1;
  21.  
  22.   printf("Zadejte souradnice bodu:\n");
  23.   if(scanf("%lld %lld", &bod_X, &bod_Y) != 2)
  24.     Konec(1);
  25.  
  26.   printf("Zadejte body n-uhelniku:\n");
  27.   if(scanf("%lld %lld", &souradnice_X[0], &souradnice_Y[0]) != 2)
  28.     Konec(1);
  29.  
  30.   if(scanf("%lld %lld", &souradnice_X[1], &souradnice_Y[1]) != 2)
  31.     Konec(1);
  32.  
  33.   if(scanf("%lld %lld", &souradnice_X[2], &souradnice_Y[2]) != 2)
  34.     Konec(1);
  35.  
  36.   // schovame si prvni souradnici pro pozdejsi porovnani s posledni
  37.   souradnice_X[3] = souradnice_X[0];
  38.   souradnice_Y[3] = souradnice_Y[0];
  39.  
  40.   if(lezi)
  41.     lezi = SpocitejPolohuBodu(souradnice_X, souradnice_Y, 0);
  42.   else
  43.     SpocitejPolohuBodu(souradnice_X, souradnice_Y, 0);
  44.  
  45.   PosunPole(souradnice_X, souradnice_Y);
  46.  
  47.   while(1) {
  48.     if(scanf("%lld %lld", &souradnice_X[2], &souradnice_Y[2]) != 2)
  49.       break;
  50.  
  51.     if(lezi)
  52.       lezi = SpocitejPolohuBodu(souradnice_X, souradnice_Y, 0);
  53.     else {
  54.       SpocitejPolohuBodu(souradnice_X, souradnice_Y, 0);
  55.       PosunPole(souradnice_X, souradnice_Y);
  56.     }
  57.   }
  58.  
  59.   if(lezi)
  60.     lezi = SpocitejPolohuBodu(souradnice_X, souradnice_Y, 1);
  61.   else
  62.     SpocitejPolohuBodu(souradnice_X, souradnice_Y, 1);
  63.  
  64.   if(feof(stdin)) {
  65.     if(konvexni)
  66.       switch(lezi) {
  67.         case 1:  printf("Bod lezi uvnitr n-uhelniku.\n"); break;
  68.         case 0:  Konec(2); break;
  69.         case 3:  Konec(3); break;
  70.         default: Konec(1); break;
  71.       }
  72.     else
  73.       Konec(3);
  74.   }
  75.  
  76.   #ifndef __PROGTEST__
  77.     system ("pause");
  78.   #endif /* __PROGTEST__ */
  79.  
  80.   exit(SUCCESS);
  81. }
  82. //---------------------------------------------------------------------------
  83. void PosunPole(long long int *souradnice_X, long long int *souradnice_Y)
  84. {
  85.   // prohozeni A, B
  86.   long long int pom_x, pom_y;
  87.   pom_x = souradnice_X[0];
  88.   souradnice_X[0] = souradnice_X[1];
  89.   souradnice_X[1] = pom_x;
  90.  
  91.   souradnice_X[1] = souradnice_X[2];
  92.  
  93.  
  94.   pom_y = souradnice_Y[0];
  95.   souradnice_Y[0] = souradnice_Y[1];
  96.   souradnice_Y[1] = pom_y;
  97.  
  98.   souradnice_Y[1] = souradnice_Y[2];
  99.  
  100.   return;
  101. }
  102. //---------------------------------------------------------------------------
  103. char SpocitejPolohuBodu(long long int *souradnice_X, long long int *souradnice_Y, char posledni)
  104. {
  105.   // primka 1
  106.   long long int p_1_nv_x, p_1_nv_y, p_1_sv_x, p_1_sv_y, p_1_c;
  107.   // primka 2
  108.   long long int p_2_nv_x, p_2_nv_y, p_2_sv_x, p_2_sv_y, p_2_c;
  109.   // primka 3
  110.   long long int p_3_nv_x, p_3_nv_y, p_3_sv_x, p_3_sv_y, p_3_c;
  111.   // pomocne
  112.   long long int por_1, por_2, por_3, por_4, por_5, por_6, uhel_1, uhel_2/*, uhel_3*/;
  113.   static long long int posledni_x, posledni_y, predchozi_uhel = 0;
  114.   static char prvni = 1;
  115.  
  116.   if(posledni) {
  117.     souradnice_X[2] = souradnice_X[1];
  118.     souradnice_X[1] = souradnice_X[0];
  119.     souradnice_X[0] = souradnice_X[3];
  120.  
  121.     souradnice_Y[2] = souradnice_Y[1];
  122.     souradnice_Y[1] = souradnice_Y[0];
  123.     souradnice_Y[0] = souradnice_Y[3];
  124.   }
  125.   else {
  126.     posledni_x = souradnice_X[2];
  127.     posledni_y = souradnice_Y[2];
  128.   }
  129.  
  130.   // normalovy vektor primky 1, body A, B
  131.   p_1_nv_x =   souradnice_Y[1] - souradnice_Y[0];
  132.   p_1_nv_y = -(souradnice_X[1] - souradnice_X[0]);
  133.  
  134.   // normalovy vektor primky 2, body B, C
  135.   p_2_nv_x =   souradnice_Y[2] - souradnice_Y[1];
  136.   p_2_nv_y = -(souradnice_X[2] - souradnice_X[1]);
  137.  
  138.   // normalovy vektor primky 3, body C, A nebo posledni A
  139.   p_3_nv_x =   souradnice_Y[0] - souradnice_Y[2];
  140.   p_3_nv_y = -(souradnice_X[0] - souradnice_X[2]);
  141.  
  142.   // smernicovy vektor primky 1, body A, B
  143.   p_1_sv_x = souradnice_X[1] - souradnice_X[0];
  144.   p_1_sv_y = souradnice_Y[1] - souradnice_Y[0];
  145.  
  146.   // smernicovy vektor primky 2, body B, C
  147.   p_2_sv_x = souradnice_X[2] - souradnice_X[1];
  148.   p_2_sv_y = souradnice_Y[2] - souradnice_Y[1];
  149. /*
  150.   // smernicovy vektor primky 2, body C, A
  151.   p_3_sv_x = souradnice_X[0] - souradnice_X[2];
  152.   p_3_sv_y = souradnice_Y[0] - souradnice_Y[2];
  153. */
  154.   if(posledni) {
  155.     // smernicovy vektor primky 3, posledni bod, A
  156.     p_3_sv_x = souradnice_X[0] - posledni_x;
  157.     p_3_sv_y = souradnice_Y[0] - posledni_y;
  158.  
  159.     // odchylka
  160.     uhel_1 = p_1_sv_x * p_2_sv_y - p_1_sv_y * p_2_sv_x;
  161.     uhel_2 = p_2_sv_x * p_3_sv_y - p_2_sv_y * p_3_sv_x;
  162. //  uhel_3 = p_3_sv_x * p_1_sv_y - p_3_sv_y * p_1_sv_x;
  163. /*
  164.     uhel_1 = p_1_sv_x * p_2_sv_x + p_1_sv_y * p_2_sv_y;
  165.     uhel_2 = p_2_sv_x * p_3_sv_x + p_2_sv_y * p_3_sv_y;
  166. */
  167.     if(uhel_1 == 0) {
  168.       konvexni = 0;
  169.       return 3;
  170.     }
  171.  
  172.     if(prvni) {
  173.       if(uhel_1 != 0) {
  174.         predchozi_uhel = uhel_1;
  175.         prvni = 0;
  176.       }
  177.     }
  178.     else {
  179.       if(!((uhel_1 * uhel_2 > 0 && predchozi_uhel > 0) || (uhel_1 < 0 && uhel_2 < 0 && predchozi_uhel < 0))) {
  180.         konvexni = 0;
  181.         return 3;
  182.       }
  183.     }
  184.  
  185.     if(predchozi_uhel == 0) {
  186.       konvexni = 0;
  187.       return 3;
  188.     }
  189.   }
  190.   else {
  191.     uhel_1 = p_1_sv_x * p_2_sv_y - p_1_sv_y * p_2_sv_x;
  192. //  uhel_2 = p_2_sv_x * p_3_sv_y - p_2_sv_y * p_3_sv_x;
  193. //  uhel_1 = p_1_sv_x * p_2_sv_x + p_1_sv_y * p_2_sv_y;
  194.   if(uhel_1 == 0) {
  195.     konvexni = 0;
  196.     return 3;
  197.   }
  198.  
  199.     if(prvni) {
  200.       if(uhel_1 != 0) {
  201.         predchozi_uhel = uhel_1;
  202.         prvni = 0;
  203.       }
  204.     }
  205.     else {
  206.       if(uhel_1 != 0) {
  207.         if(!(predchozi_uhel * uhel_1 > 0)) {
  208.           konvexni = 0;
  209.           return 3;
  210.         }
  211.         else {
  212.           predchozi_uhel = uhel_1;
  213.         }
  214.       }
  215.     }
  216.   }
  217.  
  218.   // spocitani slozky c u obecne rovnice primky
  219.   p_1_c = -(souradnice_X[0] * p_1_nv_x + souradnice_Y[0] * p_1_nv_y);
  220.   p_2_c = -(souradnice_X[1] * p_2_nv_x + souradnice_Y[1] * p_2_nv_y);
  221.   p_3_c = -(souradnice_X[2] * p_3_nv_x + souradnice_Y[2] * p_3_nv_y);
  222.  
  223.   // dosazeni bodu do primek
  224.   //primka AB a dosazeni bodu X a bodu C
  225.   por_1 = bod_X * p_1_nv_x + bod_Y * p_1_nv_y + p_1_c;
  226.   por_3 = souradnice_X[2] * p_1_nv_x + souradnice_Y[2] * p_1_nv_y + p_1_c;
  227.   //primka BC a dosazeni bodu X a bodu A
  228.   por_2 = bod_X * p_2_nv_x + bod_Y * p_2_nv_y + p_2_c;
  229.   por_4 = souradnice_X[0] * p_2_nv_x + souradnice_Y[0] * p_2_nv_y + p_2_c;
  230.   //primka CA a dosazeni bodu X a bodu B
  231.   por_5 = bod_X * p_3_nv_x + bod_Y * p_3_nv_y + p_3_c;
  232.   por_6 = souradnice_X[1] * p_3_nv_x + souradnice_Y[1] * p_3_nv_y + p_3_c;
  233.  
  234.   if(((por_1 > 0 && por_3> 0 && por_5 > 0) && (por_2 > 0 && por_4 > 0 && por_6 > 0)) || ((por_1 < 0 && por_3 < 0 && por_5 < 0) && (por_2 < 0 && por_4 < 0 && por_6 < 0)))
  235.     return 1;
  236.   else
  237.     return 0;
  238. }
  239. //---------------------------------------------------------------------------
  240. void Konec(int chyba)
  241. {
  242.   switch(chyba) {
  243.     case 1: printf("Nespravny vstup.\n");                   break;
  244.     case 2: printf("Bod nelezi uvnitr n-uhelniku.\n");      break;
  245.     case 3: printf("Zadany n-uhelnik neni konvexni.\n");    break;
  246.   }
  247.  
  248.   #ifndef __PROGTEST__
  249.     system ("pause");
  250.   #endif /* __PROGTEST__ */
  251.  
  252.   exit(EXIT_FAILURE);
  253. }
  254. //---------------------------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement