[ create a new paste ] login | about

Link: http://codepad.org/90ml7XRw    [ raw code | output | fork ]

C, pasted on Nov 22:
#include <conio.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

#define deltax(i,j) (mug[i].x-mug[j].x)
#define deltay(i,j) (mug[i].y-mug[j].y)

struct pt {int num;int x;int y;};
struct line {float k;float b;};
struct ptD3 {int numD1;int numD2;int x;int y;float r;};

int inorout(struct pt *,struct pt *,struct pt *);//Zapolnenie D2
void enterarr(struct pt *);//Zapolnenie D1
struct line getline(int x1, int y1, int x2, int y2);
int distance(struct pt *,struct pt *,int ,float ,struct ptD3 *);//zapolnenie D3
void PasteSort(int ,struct ptD3 *);
void swap(struct ptD3 *, int i, int j);
float perimeter_calculation(struct pt *);
float area_calculation(struct pt *);

int main()
{
    int i,sizeD1,sizeD2,sizeD3;
    float R=7.2,perimeter,area;
    struct pt mug[4]={1,1,1 , 2,15,1 , 3,10,8 , 4,2,14},line[2]={5,-1,-1 , 6,8,15},D1[20],*D2;
    struct ptD3 *D3;
    
    sizeD2=0;
    sizeD3=0;
    
    printf("Vvedite koordinati tochek parami cherez probel.\nroordinati tochki v promezhutke 0<=x<=20 & 0<=y<=20\n");
    enterarr(D1);
 
    D2=(struct pt*)malloc(sizeof(struct pt)*5);
    sizeD2=inorout(D1,D2,mug);
    for(i=0;i<sizeD2;i++)
    {
                     printf("%d %d %d\n",D2[i].num,D2[i].x,D2[i].y) ;                
    } 
    D3=(struct ptD3*)malloc(sizeof(struct ptD3)*5);
    sizeD3=distance(line,D2,sizeD2,R,D3);
    for(i=0;i<sizeD3;i++)
    {
                     printf("D3 UNSORTED %d %d %d %d %f\n",D3[i].numD1,D3[i].numD2,D3[i].x,D3[i].y,D3[i].r) ;                
    } 
    PasteSort(sizeD3,D3);
    for(i=0;i<sizeD3;i++)
    {
                     printf("d3 SORTED %d %d %d %d %f\n",D3[i].numD1,D3[i].numD2,D3[i].x,D3[i].y,D3[i].r) ;                
    } 
    perimeter=perimeter_calculation(mug);
    area=area_calculation(mug);
    printf("perimeter = %f\n",perimeter);
    printf("area = %f\n",area);
    free(D2);
    free(D3);
    getch();
    return 0;
}
void enterarr(struct pt *arr)
{
       int i;
              
       for(i=0;i<20;i++)
       {
                        arr[i].num=i+1;
                        printf("Enter x and y of point N%d\t",arr[i].num);
                        scanf("%d %d",&(arr[i]).x,&(arr[i]).y);
                                              
                        if(((arr[i]).x < 0 || (arr[i]).x > 20) || ((arr[i]).y < 0 || (arr[i]).y > 20))
                        {
                                      i--;
                                      printf("\tERROR: 0<=x<=20 & 0<=y<=20. REPEAT\n");
                        }
                        printf("\n");
       }  
}

int inorout(struct pt *arr1,struct pt *arr2,struct pt *mug)//arr1=D1, arr2=D2, mug=mug
{
       int i,j,size;
       float ynn,ynv,ynl,ynp;
       struct line mug_lines[4];
       
       size=0;
       
       mug_lines[0]=getline(mug[0].x,mug[0].y,mug[1].x,mug[1].y);//AB
       mug_lines[1]=getline(mug[1].x,mug[1].y,mug[2].x,mug[2].y);//BC
       mug_lines[2]=getline(mug[2].x,mug[2].y,mug[3].x,mug[3].y);//CD
       mug_lines[3]=getline(mug[3].x,mug[3].y,mug[0].x,mug[0].y);//DA
       /*printf("%f %f\n",mug_lines[0].k,mug_lines[0].b); 
       printf("%f %f\n",mug_lines[1].k,mug_lines[1].b);
       printf("%f %f\n",mug_lines[2].k,mug_lines[2].b);
       printf("%f %f\n",mug_lines[3].k,mug_lines[3].b);*/
       for(i=0;i<20;i++)
       {
                        //printf("arr1[i] %f\n",(float)arr1[i].x);
                        ynn=mug_lines[0].k*(float)arr1[i].x+mug_lines[0].b;
                        ynv=mug_lines[2].k*(float)arr1[i].x+mug_lines[2].b;
                        ynl=((float)arr1[i].y-mug_lines[3].b)/mug_lines[3].k;
                        ynp=((float)arr1[i].y-mug_lines[1].b)/mug_lines[1].k;
                        //printf("ynn%f ynv%f ynl%f ynp%f\narr[i].y %f \tarr[i].y %f\n",ynn,ynv,ynl,ynp,(float)arr1[i].y,(float)arr1[i].x);
                        if (ynn<=((float)arr1[i].y) && ynv>=((float)arr1[i].y) && ynl<=((float)arr1[i].x) && ynp>=((float)arr1[i].x))
                        {
                                       arr2[size].num=arr1[i].num;
                                       arr2[size].x=arr1[i].x;
                                       arr2[size].y=arr1[i].y;
                                       size++;
                                       if (size%5==0) arr2=(struct pt *)realloc(arr2,sizeof(struct pt)*(size+5));
                        }
       }
       
       return size;       
}
struct line getline(int x1, int y1, int x2, int y2)
{
       float delta_y,delta_x;
       struct line temp;
       
       delta_x=x1-x2;
       delta_y=y1-y2;
       //printf("x1 %d x2 %d y1 %d y2 %d\n",x1,x2,y1,y2);
       //printf("x - %f y - %f\n",delta_x,delta_y);
       temp.k=delta_y/delta_x;
       temp.b=y1-x1*temp.k;
       //printf("k - %f b - %f\n\n",temp.k,temp.b);
       return temp;
}

int distance(struct pt *line,struct pt *D2,int sizeD2,float R,struct ptD3 *D3)
{
    int size,i;
    struct line main_line,normal_line;
    float x0,y0,r;
    
    size=0;
    
    main_line=getline(line[1].x,line[1].y,line[0].x,line[0].y);
    //printf("k=%f b=%f",main_line.k,main_line.b);
    normal_line.k=-1/main_line.k;
    for(i=0;i<sizeD2;i++)
    {
                         normal_line.b=D2[i].y-normal_line.k*D2[i].y;
                         x0=(normal_line.b-main_line.b)/(main_line.k-normal_line.k);
                         y0=(x0*(main_line.k+normal_line.k)+main_line.b+normal_line.b)/2;
                         r=sqrt((x0-D2[i].x)*(x0-D2[i].x)+(y0-D2[i].y)*(y0-D2[i].y));
                         printf("x0=%f y0=%f r=%f\n",x0,y0,r);
                         if (r<=R)
                         {
                                       D3[size].numD1=D2[i].num;
                                       D3[size].numD2=i;
                                       D3[size].x=D2[i].x;
                                       D3[size].y=D2[i].y;
                                       D3[size].r=r;
                                       size++;
                                       if (size%5==0) D3=(struct ptD3 *)realloc(D3,sizeof(struct ptD3)*(size+5));
                         }
                         
    }    
    
    return size;
}

void PasteSort(int size, struct ptD3 *D3)//swap(D3,i-1,i);
{
    int i,j;
    i = 1;
    j = 2;
    while(i < size)
    {
        if (D3[i - 1].r <= D3[i].r)
        {
            i = j;
            j++;
        }
        else
        {
            swap(D3,i - 1,i);
            i--;
            if (i == 0)
            {
                i = j;
                j++;
            }
        }
    }
}

void swap(struct ptD3 *arr, int i, int j)
{
     struct ptD3 temp;
     //printf("%f %f\n",arr[i].r,arr[j].r);
     temp=arr[i];
     arr[i]=arr[j];
     arr[j]=temp;
     //printf("%f %f\n\n",arr[i].r,arr[j].r);
}

float perimeter_calculation(struct pt *mug)
{
      int i;
      float result;
      result=0;
      
      for(i = 0;i < 4;i++)
      {
       result+=sqrt(deltax((i+1)%4,i)*deltax((i+1)%4,i)+deltay((i+1)%4,i)*deltay((i+1)%4,i));
      }
      return result;  
}
      
float area_calculation(struct pt *mug)
{
      int i;
      float S1,S2,AB,AC,AD,BC,CD,P1,P2;
      
      AB=sqrt(deltax(0,1)*deltax(0,1)+deltay(0,1)*deltay(0,1));
      AC=sqrt(deltax(0,2)*deltax(0,2)+deltay(0,2)*deltay(0,2));
      AD=sqrt(deltax(0,3)*deltax(0,3)+deltay(0,3)*deltay(0,3));
      BC=sqrt(deltax(2,1)*deltax(2,1)+deltay(2,1)*deltay(2,1));
      CD=sqrt(deltax(3,2)*deltax(3,2)+deltay(3,2)*deltay(3,2));
      P1=(AB+BC+AC)/2.;
      P2=(AC+CD+AD)/2.;
      S1=sqrt(P1*(P1-AB)*(P1-BC)*(P1-AC));//Formula Gerona
      S2=sqrt(P2*(P2-AC)*(P2-CD)*(P2-AD));
      //printf("AB %f ac %f AD %f BC %f Cd %f\n",AB,AC,AD,BC,CD);
      //printf("P1=%f P2=%f\nS1 %f S2 %f \n",P1,P2,S1,S2);
      
      return S1+S2;
}


Output:
1
Line 18: error: conio.h: No such file or directory


Create a new paste based on this one


Comments: