计算n边正多边形的顶点

时间:2015-01-28 02:50:25

标签: ios cocoa-touch swift geometry polygon

我试图关注此answer

它可以很好地创建多边形,但我可以看到它没有到达包含矩形的边缘。

以下gif显示了我的意思。特别是对于5边多边形,很明显它并没有跨越"跨越"我希望它做的矩形

A sample gif to show that the polygon sometimes doesn't reach all the edges

这是我用来创建顶点的代码

  func verticesForEdges(_edges: Int) -> [CGPoint] {
    let offset = 1.0
    var vertices: [CGPoint] = []

    for i in 0..._edges {
      let angle = M_PI + 2.0 * M_PI * Double(i) / Double(edges)
      var x = (frame.width / 2.0) * CGFloat(sin(angle)) + (bounds.width / 2.0)
      var y = (frame.height / 2.0) * CGFloat(cos(angle)) + (bounds.height / 2.0)
      vertices.append(CGPoint(x: x, y: y))
    }

    return vertices
  }

这是使用顶点的代码

override func layoutSublayers() {
    super.layoutSublayers()

    var polygonPath = UIBezierPath()
    let vertices = verticesForEdges(edges)

    polygonPath.moveToPoint(vertices[0])

    for v in vertices {
      polygonPath.addLineToPoint(v)
    }

    polygonPath.closePath()
    self.path = polygonPath.CGPath

  }

所以问题是。如何使多边形填充矩形

更新

矩形不一定是正方形。它的宽度可以与高度不同。从评论看来,我似乎将多边形拟合成一个圆形,但是用意的是将它放在一个矩形中。

1 个答案:

答案 0 :(得分:1)

如果第一个(i = 0)顶点固定在顶部矩形边的中间,我们可以计算边界矩形的最小宽度和高度:
最右边的顶点索引

ir = (N + 2) / 4   // N/4, rounded to the closest integer, not applicable to triangle
MinWidth = 2 * R * Sin(ir * 2 * Pi / N)

底部顶点索引

ib = (N + 1) / 2   // N/2, rounded to the closest integer
MinHeight = R * (1 +  Abs(Cos(ib * 2 * Pi / N)))

因此,对于给定的矩形尺寸,我们可以计算R参数以正确地标注多边形