TenSob_

rst_trgl_sobotka.c

Jan 3rd, 2021
1,380
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.02 KB | None | 0 0
  1. /* ========================================================================== */
  2. /*                                                                            */
  3. /*   rst_trgl_sobotka.c                                                       */
  4. /*   2020-2021 Jan Sobotka - 8.V                                              */
  5. /*                                                                            */
  6. /* ========================================================================== */
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <math.h>
  10.  
  11. #define INACC (0.01)
  12. #define CHAR_DEF_VAL (69)
  13. #define STAR_NUM (55)
  14.  
  15.  
  16. // fce zjistujici pocet bodu zadanych ve zdrojovem souboru
  17. int getsz(FILE* file){
  18.     int sz, e;
  19.     char blbm;
  20.  
  21.     for(sz=1;blbm!=EOF;blbm=getc(file)){
  22.         if(blbm=='\n'){
  23.             sz++;
  24.             e=1;
  25.         }
  26.         else{
  27.             e=0;
  28.         }
  29.     }
  30.  
  31.     if(e==1){
  32.         sz-=1;
  33.     }
  34.  
  35.     return sz;
  36. }
  37.  
  38.  
  39. // fce nacitajici body do pole
  40. void getpt(FILE* file,int size,double* pt) {
  41.     int i;
  42.  
  43.     for(i=0;i<size;i++){
  44.         fscanf(file,"%lf %lf",pt+2*i,pt+2*i+1);
  45.     }
  46. }
  47.  
  48. // fce overujici existenci RST ze zadanych bodu
  49. char trglfnkc(double ax, double ay, double bx, double by, double cx, double cy, double* ln){
  50.  
  51.     double dl1,dl2,dl3;
  52.  
  53.     dl1=(sqrt(((ax-bx)*(ax-bx))+((ay-by)*(ay-by))));
  54.     dl2=(sqrt(((bx-cx)*(bx-cx))+((by-cy)*(by-cy))));
  55.     dl3=(sqrt(((cx-ax)*(cx-ax))+((cy-ay)*(cy-ay))));
  56.  
  57.     if((sqrt((dl1-dl2)*(dl1-dl2)))<INACC&&(sqrt((dl2-dl3)*(dl2-dl3)))<INACC&&(sqrt((dl3-dl1)*(dl3-dl1)))<INACC){
  58.         ln[0]=dl1;
  59.         return 'a';
  60.     }
  61.     else{
  62.         return 'b';
  63.     }
  64.  
  65. }
  66.  
  67. // fce overujici zda zadany bod existuje v trojuhelniku ze zadanych bodu
  68. int in_trgl(double ax,double ay,double bx,double by,double cx,double cy,double dx,double dy){
  69.     double c,d1,d2,d3,d4,d5,d6;
  70.  
  71.     d1=ay-by;
  72.     d2=bx-ax;
  73.     d3=ay-cy;
  74.     d4=cx-ax;
  75.     d5=by-cy;
  76.     d6=cx-bx;
  77.  
  78.     if((d1*cx+d2*cy+(-d1*ax-d2*ay))*(d1*dx+d2*dy+(-d1*ax-d2*ay))<=0){
  79.         return 0;
  80.     }
  81.     else if((d3*bx+d4*by+(-d3*ax-d4*ay))*(d3*dx+d4*dy+(-d3*ax-d4*ay))<=0){
  82.         return 0;
  83.     }
  84.     else if((d5*ax+d6*ay+(-d5*bx-d6*by))*(d5*dx+d6*dy+(-d5*bx-d6*by))<=0){
  85.         return 0;
  86.     }
  87.     else{
  88.         return 1;
  89.     }
  90. }
  91.  
  92. // Tiskne hvezdickovy oddelovac se zadanym poctem hvezdicek (designovy prvek)
  93. void oddelovac(int num){
  94.     int star;
  95.  
  96.     printf("\n");
  97.     for(star=0;star!=num;star++){
  98.                 printf("*");
  99.             }
  100.     printf("\n\n");
  101. }
  102.  
  103. // Tiskne meziradek vystupni tabulky (designovy prvek)
  104. void liner(int num, int end){
  105.  
  106.     int p;
  107.  
  108.     for(p=0;p<num;p++){
  109.         printf("%c",196);
  110.     }
  111.     if(end==0){
  112.         printf("%c",197);
  113.         return 0;
  114.     }
  115.     printf("\n");
  116.  
  117. }
  118.  
  119. int main(){
  120.  
  121.     FILE *fr;
  122.     char filename[CHAR_DEF_VAL];
  123.     char pruch;
  124.     double *pt;
  125.     double lngt[2];
  126.     int sz, c1, c2, c3, c4, prd=0, intrl=0;
  127.  
  128.     //Cely program je v cyklu pro moznost nacteni vice souboru bez nutnosti zavrit program
  129.     while(1){
  130.         while(1){
  131.             printf("Zadejte nazev souboru pro cteni: \n");
  132.             scanf("%s",filename);
  133.  
  134.             if ((fr = fopen(filename, "r")) == NULL) {
  135.                 printf("\nSoubor se nepodarilo otevrit. Zkuste to znovu...\n");
  136.                 continue;
  137.             }
  138.             else{
  139.                 break;
  140.             }
  141.         }
  142.  
  143.         sz=getsz(fr);
  144.  
  145.         fseek(fr,0,SEEK_SET);
  146.  
  147.         pt=(double*)malloc(sz*sizeof(double)*2);
  148.  
  149.         getpt(fr,sz,pt);
  150.  
  151.         oddelovac(STAR_NUM);
  152.  
  153.         //Tisk legendy vystupnich hodnot + funkce liner pro meziradek
  154.         printf("Poradi RST |  C1 |  C2 |  C3 | Delka str. | Bodu uvnitr\n");
  155.         liner(11,0);
  156.         liner(5,0);
  157.         liner(5,0);
  158.         liner(5,0);
  159.         liner(12,0);
  160.         liner(12,1);
  161.  
  162.         //Prochazeni pole s nactenymi body a posla je do funkci pro zjisteni existence RST a pro overeni existence bodu uvnitr RST
  163.         for(prd=0,c1=0;c1<sz;c1++){
  164.             for(c2=(c1+1);c2<sz;c2++){
  165.                 for(c3=(c2+1);c3<sz;c3++){
  166.                     if(trglfnkc(pt[2*c1],pt[2*c1+1],pt[2*c2],pt[2*c2+1],pt[2*c3],pt[2*c3+1],lngt)=='a'){
  167.                         prd++;
  168.                         for(intrl=0,c4=0;c4<sz;c4++){
  169.                             intrl+=in_trgl(pt[2*c1],pt[2*c1+1],pt[2*c2],pt[2*c2+1],pt[2*c3],pt[2*c3+1],pt[2*c4],pt[2*c4+1]);
  170.                         }
  171.                         printf("%5d. RST | %3d | %3d | %3d |   %8.3lf | %3d \n",prd,c1,c2,c3,lngt[0],intrl);
  172.                     }
  173.                 }
  174.             }
  175.         }
  176.  
  177.         oddelovac(STAR_NUM);
  178.  
  179.         //Ukoncovaci sekvence s moznosti ukonceni programu nebo opakovani cyklu
  180.         while(1){
  181.             printf("\n\nChcete pokracovat? [Y/N]\n");
  182.             pruch=getch();
  183.             putchar(pruch);
  184.             if(pruch=='Y'||pruch=='y'){
  185.                 printf("\n");
  186.                 break;
  187.             }
  188.             else if(pruch=='N'||pruch=='n'){
  189.                 while(1){
  190.                     printf("\n\nOpravdu chcete program ukoncit?\n");
  191.                     pruch=getch();
  192.                     putchar(pruch);
  193.                     if(pruch=='Y'||pruch=='y'){
  194.                         printf("\n");
  195.                         //Tisk podpisu autora
  196.                         oddelovac(STAR_NUM);
  197.                         for(sz=0;sz<((STAR_NUM-41)/2);sz++){
  198.                             printf("%c",32);
  199.                         }
  200.                         printf("Program vytvoril Jan Sobotka - 2020-2021\n");
  201.                         oddelovac(STAR_NUM);
  202.                         return 1;
  203.                     }
  204.                     else if(pruch=='N'||pruch=='n'){
  205.                         break;
  206.                     }
  207.                     else{
  208.                         continue;
  209.                     }
  210.                 }
  211.             }
  212.             else{
  213.                 printf("\n\nChybne zadani. Zkuste to znovu...");
  214.                 continue;
  215.             }
  216.         }
  217.     }
  218. }
  219.  
Add Comment
Please, Sign In to add comment