#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;
}