Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //---------------------------------------------------------------------------
- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
- #define SUCCESS 0
- #define POCET_BODU 4
- //---------------------------------------------------------------------------
- void Konec(int chyba);
- void PosunPole(long long int *souradnice_X, long long int *souradnice_Y);
- char SpocitejPolohuBodu(long long int *souradnice_X, long long int *souradnice_Y, char posledni);
- //---------------------------------------------------------------------------
- long long int bod_X, bod_Y;
- char konvexni = 1;
- //---------------------------------------------------------------------------
- int main()
- {
- long long int souradnice_X[POCET_BODU], souradnice_Y[POCET_BODU];
- char lezi = 1;
- printf("Zadejte souradnice bodu:\n");
- if(scanf("%lld %lld", &bod_X, &bod_Y) != 2)
- Konec(1);
- printf("Zadejte body n-uhelniku:\n");
- if(scanf("%lld %lld", &souradnice_X[0], &souradnice_Y[0]) != 2)
- Konec(1);
- if(scanf("%lld %lld", &souradnice_X[1], &souradnice_Y[1]) != 2)
- Konec(1);
- if(scanf("%lld %lld", &souradnice_X[2], &souradnice_Y[2]) != 2)
- Konec(1);
- // schovame si prvni souradnici pro pozdejsi porovnani s posledni
- souradnice_X[3] = souradnice_X[0];
- souradnice_Y[3] = souradnice_Y[0];
- if(lezi)
- lezi = SpocitejPolohuBodu(souradnice_X, souradnice_Y, 0);
- else
- SpocitejPolohuBodu(souradnice_X, souradnice_Y, 0);
- PosunPole(souradnice_X, souradnice_Y);
- while(1) {
- if(scanf("%lld %lld", &souradnice_X[2], &souradnice_Y[2]) != 2)
- break;
- if(lezi)
- lezi = SpocitejPolohuBodu(souradnice_X, souradnice_Y, 0);
- else {
- SpocitejPolohuBodu(souradnice_X, souradnice_Y, 0);
- PosunPole(souradnice_X, souradnice_Y);
- }
- }
- if(lezi)
- lezi = SpocitejPolohuBodu(souradnice_X, souradnice_Y, 1);
- else
- SpocitejPolohuBodu(souradnice_X, souradnice_Y, 1);
- if(feof(stdin)) {
- if(konvexni)
- switch(lezi) {
- case 1: printf("Bod lezi uvnitr n-uhelniku.\n"); break;
- case 0: Konec(2); break;
- case 3: Konec(3); break;
- default: Konec(1); break;
- }
- else
- Konec(3);
- }
- #ifndef __PROGTEST__
- system ("pause");
- #endif /* __PROGTEST__ */
- exit(SUCCESS);
- }
- //---------------------------------------------------------------------------
- void PosunPole(long long int *souradnice_X, long long int *souradnice_Y)
- {
- // prohozeni A, B
- long long int pom_x, pom_y;
- pom_x = souradnice_X[0];
- souradnice_X[0] = souradnice_X[1];
- souradnice_X[1] = pom_x;
- souradnice_X[1] = souradnice_X[2];
- pom_y = souradnice_Y[0];
- souradnice_Y[0] = souradnice_Y[1];
- souradnice_Y[1] = pom_y;
- souradnice_Y[1] = souradnice_Y[2];
- return;
- }
- //---------------------------------------------------------------------------
- char SpocitejPolohuBodu(long long int *souradnice_X, long long int *souradnice_Y, char posledni)
- {
- // primka 1
- long long int p_1_nv_x, p_1_nv_y, p_1_sv_x, p_1_sv_y, p_1_c;
- // primka 2
- long long int p_2_nv_x, p_2_nv_y, p_2_sv_x, p_2_sv_y, p_2_c;
- // primka 3
- long long int p_3_nv_x, p_3_nv_y, p_3_sv_x, p_3_sv_y, p_3_c;
- // pomocne
- long long int por_1, por_2, por_3, por_4, por_5, por_6, uhel_1, uhel_2/*, uhel_3*/;
- static long long int posledni_x, posledni_y, predchozi_uhel = 0;
- static char prvni = 1;
- if(posledni) {
- souradnice_X[2] = souradnice_X[1];
- souradnice_X[1] = souradnice_X[0];
- souradnice_X[0] = souradnice_X[3];
- souradnice_Y[2] = souradnice_Y[1];
- souradnice_Y[1] = souradnice_Y[0];
- souradnice_Y[0] = souradnice_Y[3];
- }
- else {
- posledni_x = souradnice_X[2];
- posledni_y = souradnice_Y[2];
- }
- // normalovy vektor primky 1, body A, B
- p_1_nv_x = souradnice_Y[1] - souradnice_Y[0];
- p_1_nv_y = -(souradnice_X[1] - souradnice_X[0]);
- // normalovy vektor primky 2, body B, C
- p_2_nv_x = souradnice_Y[2] - souradnice_Y[1];
- p_2_nv_y = -(souradnice_X[2] - souradnice_X[1]);
- // normalovy vektor primky 3, body C, A nebo posledni A
- p_3_nv_x = souradnice_Y[0] - souradnice_Y[2];
- p_3_nv_y = -(souradnice_X[0] - souradnice_X[2]);
- // smernicovy vektor primky 1, body A, B
- p_1_sv_x = souradnice_X[1] - souradnice_X[0];
- p_1_sv_y = souradnice_Y[1] - souradnice_Y[0];
- // smernicovy vektor primky 2, body B, C
- p_2_sv_x = souradnice_X[2] - souradnice_X[1];
- p_2_sv_y = souradnice_Y[2] - souradnice_Y[1];
- /*
- // smernicovy vektor primky 2, body C, A
- p_3_sv_x = souradnice_X[0] - souradnice_X[2];
- p_3_sv_y = souradnice_Y[0] - souradnice_Y[2];
- */
- if(posledni) {
- // smernicovy vektor primky 3, posledni bod, A
- p_3_sv_x = souradnice_X[0] - posledni_x;
- p_3_sv_y = souradnice_Y[0] - posledni_y;
- // odchylka
- uhel_1 = p_1_sv_x * p_2_sv_y - p_1_sv_y * p_2_sv_x;
- uhel_2 = p_2_sv_x * p_3_sv_y - p_2_sv_y * p_3_sv_x;
- // uhel_3 = p_3_sv_x * p_1_sv_y - p_3_sv_y * p_1_sv_x;
- /*
- uhel_1 = p_1_sv_x * p_2_sv_x + p_1_sv_y * p_2_sv_y;
- uhel_2 = p_2_sv_x * p_3_sv_x + p_2_sv_y * p_3_sv_y;
- */
- if(uhel_1 == 0) {
- konvexni = 0;
- return 3;
- }
- if(prvni) {
- if(uhel_1 != 0) {
- predchozi_uhel = uhel_1;
- prvni = 0;
- }
- }
- else {
- if(!((uhel_1 * uhel_2 > 0 && predchozi_uhel > 0) || (uhel_1 < 0 && uhel_2 < 0 && predchozi_uhel < 0))) {
- konvexni = 0;
- return 3;
- }
- }
- if(predchozi_uhel == 0) {
- konvexni = 0;
- return 3;
- }
- }
- else {
- uhel_1 = p_1_sv_x * p_2_sv_y - p_1_sv_y * p_2_sv_x;
- // uhel_2 = p_2_sv_x * p_3_sv_y - p_2_sv_y * p_3_sv_x;
- // uhel_1 = p_1_sv_x * p_2_sv_x + p_1_sv_y * p_2_sv_y;
- if(uhel_1 == 0) {
- konvexni = 0;
- return 3;
- }
- if(prvni) {
- if(uhel_1 != 0) {
- predchozi_uhel = uhel_1;
- prvni = 0;
- }
- }
- else {
- if(uhel_1 != 0) {
- if(!(predchozi_uhel * uhel_1 > 0)) {
- konvexni = 0;
- return 3;
- }
- else {
- predchozi_uhel = uhel_1;
- }
- }
- }
- }
- // spocitani slozky c u obecne rovnice primky
- p_1_c = -(souradnice_X[0] * p_1_nv_x + souradnice_Y[0] * p_1_nv_y);
- p_2_c = -(souradnice_X[1] * p_2_nv_x + souradnice_Y[1] * p_2_nv_y);
- p_3_c = -(souradnice_X[2] * p_3_nv_x + souradnice_Y[2] * p_3_nv_y);
- // dosazeni bodu do primek
- //primka AB a dosazeni bodu X a bodu C
- por_1 = bod_X * p_1_nv_x + bod_Y * p_1_nv_y + p_1_c;
- por_3 = souradnice_X[2] * p_1_nv_x + souradnice_Y[2] * p_1_nv_y + p_1_c;
- //primka BC a dosazeni bodu X a bodu A
- por_2 = bod_X * p_2_nv_x + bod_Y * p_2_nv_y + p_2_c;
- por_4 = souradnice_X[0] * p_2_nv_x + souradnice_Y[0] * p_2_nv_y + p_2_c;
- //primka CA a dosazeni bodu X a bodu B
- por_5 = bod_X * p_3_nv_x + bod_Y * p_3_nv_y + p_3_c;
- por_6 = souradnice_X[1] * p_3_nv_x + souradnice_Y[1] * p_3_nv_y + p_3_c;
- 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)))
- return 1;
- else
- return 0;
- }
- //---------------------------------------------------------------------------
- void Konec(int chyba)
- {
- switch(chyba) {
- case 1: printf("Nespravny vstup.\n"); break;
- case 2: printf("Bod nelezi uvnitr n-uhelniku.\n"); break;
- case 3: printf("Zadany n-uhelnik neni konvexni.\n"); break;
- }
- #ifndef __PROGTEST__
- system ("pause");
- #endif /* __PROGTEST__ */
- exit(EXIT_FAILURE);
- }
- //---------------------------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement