We define an ADT specification for a point in a two dimensional space as follows:

Name: \(\texttt{point}\)
Use: \(\texttt{float, Boolean}\)
Functions:
\(\begin{array}{p{1cm} l l l} & \textbf{Init} & \texttt{float} \times \texttt{float} & \rightarrow \texttt{point}\\ & \textbf{Move} & \texttt{point} \times \texttt{float} \times \texttt{float} & \rightarrow \texttt{point}\\ & \textbf{Distance} & \texttt{point} \times \texttt{point} & \rightarrow \texttt{float}\\ & \textbf{Equal} & \texttt{point} \times \texttt{point} & \rightarrow \texttt{Boolean}\\ \end{array}\)

  1. Complete \(\texttt{point}\) ADT.
  2. Use \(\texttt{point}\) ADT to define \(\texttt{Circle}\) ADT by including functions allowing to:
  • Create a circle from a point and a radius;
  • Compute circle's radius;
  • Compute circle's center;
  • Compute circle's perimeter;
  • Compute circle's area;
  • Move a circle;
  • Test if a point is on the circle;
  • Resize a circle according to a (percent) ratio (modifies the radius value);
  • Test if two circles are tangents;
  • Test if two circles are concentric.

 


Difficulty level
This exercise is mostly suitable for students
Let 	dx, dy, x1, y1, x2, y2 :float
	p1, p2 : point
	* move(init(x1,y1), dx, dy)= init(x1+dx, y1+dy)
	* distance(  init(x1,y1),  init(x2,y2) )= sqrt((x1-x2)2 + (y1-y2)2)
	* compare(init(x1, y1) , init(x2, y2) )= { if(  (x1== x2)&&(y1==y2)  )  then true else false } 

ADT
Name : Circle
Uses : point, boolean, float
Operations: 

	* Init: point x point 		-> circle
	* Radius: circle 		-> float 
	* Center  : circle 		-> point 
	* perimeter: circle 		-> float  
	* area : circle 		-> float  
	* Move: circle x float x float	-> circle
	* Belong: circle x point 	-> boolean
	* Resize : circle x float 	-> circle 
	* tangent : circle x circle 	-> Boolean 

axioms : 
Let 	dx, dy , radius1, radius2, ratio : float
	pt1, pt2 : point
	C1, C2: circle 
	* Center(init(pt1, radius1))= pt1
	* Radius(init(pt1, radius1))=  radius1
	* Permiter(init(pt1, radius1))= 2*PI*radius1
	* Area(init(pt1, radius1))= PI*radius1 * radius1
	* Move(init(pt1, radius1), dx, dy)= init(move(pt1, dx, dy), radius1) 
	* Belong(init(pt1, radius1), pt2) = {  if distance(pt1, pt2)== radius1 then true else false }
	* Resize (init(pt1, radius1), ratio) = init(pt1, radius1 * ratio)
	* Tangent(init(pt1, radius1), init(pt2, radius2)) = {if(distance(p1, p2)) == radius1 + radius2  then true else false }
	* Concentric(init(pt1, radius1), init(pt2, radius2)))= {if equal(pt1, pt2) then true else false}


Back to the list of exercises
Looking for a more challenging exercise, try this one !!
Program output 8