scala 列表 LineSegment

scala list LineSegment

我有一个由一组点组成的多边形,我想通过组合对应点的列表然后将最后一个点与第一个点组合来找到该多边形的线段列表

例如:点列表 - (p1,p2,p3,p4,p5,p6) 线段列表 - ((p1,p2),(p2,p3),(p3,p4),(p4,p5),(p5,p6),(p6,p1))

sealed trait Shape

case class Point(x: Int, y: Int) extends Shape {
//require(x != null & y !=null, "null values for point")
}

case class LineSegment(point1: Point, point2: Point)  extends Shape {
 require(point1 != point2)

class Group(val children: Shape*) extends Shape {
 require(children != null, "null children in " + getClass.getSimpleName)
 require(!children.contains(null), "null child in " +
 getClass.getSimpleName) }


 object Group {
 def apply(children: Shape*) = new Group(children: _*)
 def unapply(g: Group) = Some(g.children)
 }

 /** A special case of a group consisting only of Points. */
  case class Polygon(override val children: Point*) 
   extends Group(children:   _*){
   require(children != null)

    def findLineSegments(poylgon: Polygon): List[LineSegment] = {
     val points  = children.toList
     val lineSegmentList = points.grouped(2).toList
     return lineSegmentList
    } }

  // polygon example
  val simplePolygon = Polygon(
   Point(50, 50),
   Point(60, 100),
   Point(100, 110),
   Point(120, 60)
   )

我正在定义行为 findLineSegment 以对相应的点进行分组,但我得到的是 List[list(points)].. 如何将此列表转换为 LineSegments 列表?

最简单的方法大概就是下面这样了

val rot1 = simplePolygon.drop(1) ++ simplePolygon.take(1)
for ((pi,pj) <- simplePolygon zip rot1) yield LineSegment(pi, pj)

在这里,您通过删除一个元素并将其添加回末尾来创建第二个移位一位的列表。

然后通过压缩它们一次遍历这两个列表,并在每个步骤中将两个点关联到一个新的 LineSegment 中。 (这是一个案例class,所以我们实际上在这里调用了伴生对象的apply方法。)

您可以 zip 列表自身的旋转版本,然后映射到 LineSegments:

(points zip ((points drop 1) ::: (points take 1))) map LineSegment.tupled

您可能还对 sliding 方法感兴趣:

points.sliding(2).map { case List(a, b) => LineSegment(a, b) } 
    :+ LineSegment(points.last, points.head)