Calculate vertices for n sided regular polygon
我试着按照这个答案去做
它对于创建多边形很好,但是我可以看到它没有到达包含矩形的边缘。
下面的gif显示了我的意思。特别是对于5边多边形,很明显它不会像我希望的那样"跨越"矩形。
这是我用来创建顶点的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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 } |
这是使用顶点的代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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 } |
所以问题是。如何使多边形填充矩形
更新:
矩形不一定是正方形。它的高度和宽度可能不同。从评论来看,我似乎在把多边形拟合成一个圆,但目的是把它拟合成一个矩形。
如果第一条(i=0)垂线固定在顶部矩形边缘的中间,我们可以计算边界矩形的最小宽度和高度:最右边的垂直索引
1 2 | ir = (N + 2) / 4 // N/4, rounded to the closest integer, not applicable to triangle MinWidth = 2 * R * Sin(ir * 2 * Pi / N) |
底部垂直索引
1 2 | ib = (N + 1) / 2 // N/2, rounded to the closest integer MinHeight = R * (1 + Abs(Cos(ib * 2 * Pi / N))) |
因此,对于给定的矩形维数,我们可以适当地计算R参数来刻划多边形。