
//#define pnt num*
typedef num *pnt

/*
Curve[
p *(1-cos(a ))+q*(1-sin(a)) ,
r *(1-cos(a ))+s*(1-sin(a))
,a,0,90deg]
x_1=s_1 cos a_1=p
x_2=s_2 cos a_2=q
Curve[curve1(a).x-p*cos(a+90deg)-q*sin(a+90deg),curve1(a).y-r*cos(a+90deg)-s*sin(a+90deg),a,0,90deg]
*/
num angle(pnt p1,pnt p2,pnt p3){ return aatan(p3[0]-p2[0],p3[1]-p2[1])-aatan(p1[0]-p2[0],p1[1]-p2[1]);}
num angle_ori(pnt p2,pnt p3){ return aatan(p3[0]-p2[0],p3[1]-p2[1]);}
num segment(pnt p1,pnt p2)
	return sqrt(pow(p1[0]-p2[0],2)+pow(p1[1]-p2[1],2))
num segment_ori(pnt p1){ return sqrt(pow(p1[0]-0,2)+pow(p1[1]-0,2));}
pnt vect(pnt p0,num length,num angle)
	p0[0]=length*cos1(angle) ;p0[1]=length*sin1(angle) ;return p0
#define midpoint(p0,p1,p2) ({ \;
	p0[0]=(p1[0]+p2[0])/2 ;\;
	p0[1]=(p1[1]+p2[1])/2 ;\;
	p0 ;});
//
pnt scalar_div_p(pnt p0,pnt p1,num n)
	p0[0]=p1[0]/n;p0[1]=p1[1]/n;return p0
pnt scalar_mult2_p(pnt p0,num n,pnt p1)
	p0[0]=p1[0]*n;p0[1]=p1[1]*n;return p0
pnt add_p(pnt p0,pnt p1,pnt p2)
	p0[0]=p1[0]+p2[0]
	p0[1]=p1[1]+p2[1]
	return p0
pnt negate_p(pnt p0,pnt p2)
	p0[0]=-p2[0];p0[1]=-p2[1];return p0
#define neg_p negate_p
#define sub_p(p0,p1,p2) add_p(p0,p1,neg_p(p0,p2))
#define mult_p_ori(p1) ((p1)[0]*1+(p1)[1]*1)
pnt rotate(pnt p0,pnt p1,num a,/*around*/pnt p2)
	num a1=aatan(p1[0]-p2[0],p1[1]-p2[1])
	num r=segment(p1,p2);vect(p0,r,a1+a);return add_p(p0,p0,p2)
#define stat_p(p,x,y) ({static num macp[]={x,y};p=macp;})
pnt copy_p(pnt p0,pnt p1)
	p0[0]=p1[0] ;p0[1]=p1[1] ;return p0
pnt set_p(pnt p0,num n1,num n2)
	p0[0]=n1 ;p0[1]=n2 ;return p0
static num p,q,r,s
static num curve2_b[2] ,curve2_v[2];static num curve2_a
#define curve_rnit(p3,p2,p1) curve_init(p1,p2,p3)
inline void curve_init(pnt p1,pnt p2,pnt p3)
	static num x1y0[]={1,0}
	static num p0[2]
	p=segment(p1,p2) *cos1(angle(add_p(p0,p2,x1y0),p2,p1))
	q=segment(p3,p2) *cos1(angle(add_p(p0,p2,x1y0),p2,p3))
	r=segment(p1,p2) *sin1(angle(add_p(p0,p2,x1y0),p2,p1))
	s=segment(p3,p2) *sin1(angle(add_p(p0,p2,x1y0),p2,p3))
	set_p(curve2_b,p2[0],p2[1])
	/*printf("%f %f %f %f\n",p,q,r,s)*/
inline pnt curve2(num a)
	//,a,0,90deg
	curve2_v[0]=p *(1-cos1(a ))+q*(1-sin1(a))+curve2_b[0]
	curve2_v[1]=r *(1-cos1(a ))+s*(1-sin1(a))+curve2_b[1]
	curve2_a=a;return curve2_v
inline num curve2_rot()
	num a=curve2_a;a+=0.9;return aatan(-p*cos1(a)-q*sin1(a),-r*cos1(a)-s*sin1(a))