//模拟图形绘制
//所有图,用一个接口实现
trait Drawable{
def draw():Unit={
println(this.toString)
}
}
//创建一个点样例类,所有图形都包括点,用一个样例类对点实现封装
case class Point(var x:Double,var y:Double) extends Drawable{
//点移动方法
def shift(deltaX:Double,deltaY:Double)={
x = x + deltaX
y = y + deltaY
}
}
//所有图形的父类是抽象类
abstract class Shape(var position:Point){
//移动
def moveTo(newPosition:Point)={
position = newPosition
}
//伸缩
def zoom(scaleFactor:Double):Unit
override def toString: String = s"Shape:position($position)"
}
//直线类
class Line(start:Point,end:Point) extends Shape(start) with Drawable{
//末点
private var endPoint = end
//移动
override def moveTo(newPosition:Point):Unit={
val deltaX = newPosition.x-position.x
val deltaY = newPosition.y - position.y
super.moveTo(newPosition)
endPoint.shift(deltaX,deltaY)
}
//伸缩
override def zoom(scaleFactor: Double): Unit = {
val newEndX = position.x + (endPoint.x - position.x)*scaleFactor
val newEndY = position.y + (endPoint.y - position.y)*scaleFactor
endPoint = Point(newEndX,newEndY)
}
override def toString:String = s"Line:$position--$endPoint"
}
//圆类
class Circle(center:Point,radius:Double) extends Shape(center) with Drawable{
private var circleRadius:Double=radius//半径
//伸缩
def zoom(scaleFactor: Double): Unit = {
circleRadius = circleRadius*scaleFactor
}
override def toString: String = s"Circle center:$position,R=$circleRadius"
}
object MyDraw {
def main(args:Array[String])={
try{
//创建一个点对象
val p = new Point(10,30)
//输出对象
p.draw()
//创建一个直线对象
val line1 = new Line(Point(0,0),Point(20,20))
//输出直线对象本身
line1.draw()
//将直线移动到Point(5,5)
line1.moveTo(Point(5,5))
//输出直线对象的位置
line1.draw()
//将直线伸长为原来的两倍
line1.zoom(2)
//输出直线对象
line1.draw()
//创建一个圆
val cir = new Circle(Point(10,10),5)
//输出圆
cir.draw()
//移动到点(30,20)
cir.moveTo(Point(30,20))
//输出圆的参数
cir.draw()
//缩小为原来的一半
cir.zoom(0.5)
//输出圆的参数
cir.draw()
} catch {
case ex:Exception => println(s"Exception is ${ex.getMessage}")
}
}
}
运行结果: