用Scala实现模拟图形绘制-所有图形都用参数描述,参数即特征

//模拟图形绘制
//所有图,用一个接口实现
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}")
   }
  }
}

运行结果:

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值