/* ANGLE.
Inference Rules for Angles and Inclinations
Alan Bundy 9.4.81 */


/*INCLINATION OF HORIZONTAL LINE*/
incline(Line,0,Point) :-
  dc slope(Line,hor).

/*INCLINATION OF STRAIGHT LINE*/
incline(Line,Ang,Point1) :-
  ncc concavity(Line,stline),
  dc point_of(_,Line,Point2), diff(Point1,Point2),
  ncc incline(Line,Ang,Point2).

/* incline is at rightangle to angle */
incline(Path,Ang1,Point) :-
  ncc angle(Path,Ang2,Point), leftturn(Ang2,Ang1).

/* Another path shares the point */
incline(Ph2,Ang2,Pt) :-
  type(path,Ph2),
  dc point_of(_,Ph1,Pt),
  diff(Ph1,Ph2),			% add smooth transition condition!!
  ncc incline(Ph1,Ang1,Pt),
  condturn2(Pt,Ph1,Ph2,Ang1,Ang2).	% angle may flip 180 degrees

/*FIND ANGLE OF MINIMAL PATH*/
angle(Path,Ang,Point) :-
  bitof(Subpath,Path), ncc angle(Subpath,Ang,Point).

/*ANGLE IS AT RIGHT ANGLES TO INCLINE*/
angle(Path,Ang1,Point) :-
  ncc incline(Path,Ang2,Point), rightturn(Ang2,Ang1).

/*INCLINATION At Pt ALONG PATH FROM ONE END*/

/* For simple curves */
along(Path,Start,Pt,Dir) :-
  dc concavity(Path,Conc), norm(Conc,Nc),
  dc end(Path,Start,Par),
  cc incline(Path,Dir,Pt),
  condturn1(Nc,Par,Dir,Ang).

/* For non-simple curves */
along(Path,Start,Pt,Dir) :-		
	dc point_of(path,Path1,Pt),		%ugly hack
	diff(Path,Path1),
	dc cued(motion(Part,Path1,Start1,Side1,Per1)),
	along(Path1,Start1,Pt,Dir).

/* Dir2 is normal from Surface to Part at Pt at Time */
towards(Surface,Part,Start,SSide,Pt,Time,Dir2) :-
	cc angle(Surface,Dir1,Pt),
	dc end(Surface,Start,Par),
	condval(Par,SSide,LSide),
	dc concavity(Surface,Conv), norm(Conv,Nc),
	opposite(Nc,Nc1),
	condturn1(Nc1,LSide,Dir1,Dir2).


/*IS PATH HORIZONTAL AT POINT*/
horizontal(Path,Point) :- ncc incline(Path,0,Point).
horizontal(Path,Point) :- ncc incline(Path,180,Point).


/* Short term (?) hack - Angles can be eliminated from equations
using stationary values method, and do not need solving for */

eliminable(Quan) :- kind(Quan,angle,_,_).

