case class Point(var x:Double,var y:Double) extends Drawable{
def shift(deltaX:Double,deltaY:Double){x+=deltaX;y+=deltaY}
}
trait Drawable{
def draw(){println(this.toString)}
}
abstract class Shape(var location:Point){
def moveTo(newLocation:Point){
location = newLocation
}
def zoom(scale:Double)
}
class Line(beginPoint:Point,var endPoint:Point) extends Shape(beginPoint) with Drawable{
override def draw(){
println(s"Line:(${location.x},${location.y})--(${endPoint.x},${endPoint.y})")}
override def moveTo(newLocation:Point){
endPoint.shift(newLocation.x - location.x,newLocation.y - location.y)
location = newLocation
}
override def zoom(scale:Double){
val midPoint = Point((endPoint.x + location.x)/2,(endPoint.y + location.y)/2)
location.x = midPoint.x + scale * (location.x - midPoint.x)
location.y = midPoint.y + scale * (location.y -midPoint.y)
endPoint.x = midPoint.x + scale * (endPoint.x - midPoint.x)
endPoint.y = midPoint.y + scale * (endPoint.y -midPoint.y)
}
}
class Circle(center:Point,var radius:Double) extends Shape(center) with Drawable{
override def draw(){
println(s"Circle center:(${location.x},${location.y}),R=$radius")}
override def zoom(scale:Double){
radius = radius*scale
}
}
object MyDraw{
def main(args: Array[String]) {
val p=new Point(10,30)
p.draw;
val line1 = new Line(Point(0,0),Point(20,20))
line1.draw
line1.moveTo(Point(5,5))
line1.draw
line1.zoom(2)
line1.draw
val cir= new Circle(Point(10,10),5)
cir.draw
cir.moveTo(Point(30,20))
cir.draw
cir.zoom(0.5)
cir.draw
}
}