#include <conio.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
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 GnomeSort(int ,struct ptD3 *);
void swap(struct ptD3 *, int i, int j);
int main()
{
int i,sizeD1,sizeD2,sizeD3;
float R=7.2;
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) ;
}
GnomeSort(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) ;
}
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 GnomeSort(int size, struct ptD3 *D3)//swap(D3,i-1,i);
{
int i,j;
struct ptD3 x;
for(i=1;i<size;i++)
{
x=D3[i];
for(j=i-1;j>=0 && D3[j]>x;j--)
{
D3[j+1]=D3[j];
}
D3[j+1] = x;
}
}
void swap(struct ptD3 *arr, int i, int j)
{
struct ptD3 temp;
temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}