只贴VC了:
//
// ViewController.swift
// AbilityDiagramDemo
//
// Created by Heyuan Li on 17/2/8.
// Copyright © 2017年 Heyuan Li. All rights reserved.
//
import UIKit
import SnapKit
class ViewController: UIViewController {
private let abilityImageSize: CGFloat = 300
private lazy var imageView: UIImageView = {
let iv = UIImageView()
iv.backgroundColor = UIColor.blue
iv.image = self.drawAbilityCover()
iv.layer.shouldRasterize = true
return iv
}()
override func viewDidLoad() {
super.viewDidLoad()
setupUI()
}
private func setupUI() {
view.addSubview(self.imageView)
imageView.snp.makeConstraints { (make) in
make.width.equalTo(abilityImageSize)
make.height.equalTo(abilityImageSize)
make.center.equalToSuperview()
}
}
/// 给定中心点,和外接圆半径,获取各个点
private func calculatePolygonPoints(n: UInt, center: CGPoint, radius: CGFloat) -> [CGPoint] {
var arr = [CGPoint]()
let rotateDegree = CGFloat(540) / CGFloat(n) - 90
/// let rotateDegree = 0
for i in 0..<n {
let degree = 2 * CGFloat.pi * (CGFloat(i) / CGFloat(n)) - CGFloat.pi / CGFloat(180) * CGFloat(rotateDegree)
let x = center.x + radius * cos(degree)
let y = center.y + radius * sin(degree)
arr.append(CGPoint(x: rint(x), y:rint(y)))
}
debugPrint(arr)
return arr
}
private func calculateRatioPoints(center: CGPoint, point: CGPoint, ratio: CGFloat) -> CGPoint {
let newX = (point.x - center.x) * ratio + center.x
let newY = (point.y - center.y) * ratio + center.y
return CGPoint(x: rint(newX), y:rint(newY))
}
/// 绘制能力值图层
private func drawAbilityCover() -> UIImage? {
defer {
/// Context end
UIGraphicsEndImageContext()
}
let size = CGSize(width: abilityImageSize, height: abilityImageSize)
/// Context begin
UIGraphicsBeginImageContext(size)
guard let ctx = UIGraphicsGetCurrentContext() else {
return nil
}
/// Draw Debug Circle
ctx.setFillColor(UIColor.green.cgColor)
ctx.fillEllipse(in: CGRect(x: 0, y: 0, width: abilityImageSize, height: abilityImageSize))
/// Center point
let centerPoint = CGPoint(x: abilityImageSize / 2, y: abilityImageSize / 2)
/// Draw polygon path
ctx.setFillColor(UIColor.red.withAlphaComponent(1.0).cgColor)
ctx.setStrokeColor(UIColor.black.cgColor)
let path = CGMutablePath()
let polygonPoints = calculatePolygonPoints(n: 5,
center: centerPoint,
radius: abilityImageSize / 2)
if polygonPoints.count > 0 {
path.move(to: polygonPoints[0])
for i in 1..<polygonPoints.count {
path.addLine(to: polygonPoints[i])
}
}
ctx.addPath(path)
ctx.drawPath(using: .fill)
/// Draw ratio polygon path
ctx.setFillColor(UIColor.black.withAlphaComponent(0.6).cgColor)
ctx.setStrokeColor(UIColor.black.cgColor)
let polygonPoints2 = polygonPoints.map { (point) -> CGPoint in
return calculateRatioPoints(center: centerPoint, point: point, ratio: CGFloat(arc4random()) / CGFloat(UInt32.max))
}
debugPrint(polygonPoints2)
let path2 = CGMutablePath()
if polygonPoints2.count > 0 {
path2.move(to: polygonPoints2[0])
for i in 1..<polygonPoints2.count {
path2.addLine(to: polygonPoints2[i])
}
}
ctx.addPath(path2)
ctx.drawPath(using: .fill)
/// Draw ratio polygon edge circle
ctx.setFillColor(UIColor.yellow.withAlphaComponent(1.0).cgColor)
ctx.setStrokeColor(UIColor.black.cgColor)
let edgeCircleRadius: CGFloat = 4
for point in polygonPoints2 {
ctx.fillEllipse(in: CGRect(x: point.x - edgeCircleRadius,
y: point.y - edgeCircleRadius,
width: edgeCircleRadius * 2,
height: edgeCircleRadius * 2))
}
/// Get UIImage
let image = UIGraphicsGetImageFromCurrentImageContext()
return image
}
}
//
// ViewController.swift
// AbilityDiagramDemo
//
// Created by Heyuan Li on 17/2/8.
// Copyright © 2017年 Heyuan Li. All rights reserved.
//
import UIKit
import SnapKit
class ViewController: UIViewController {
private let abilityImageSize: CGFloat = 300
private lazy var imageView: UIImageView = {
let iv = UIImageView()
iv.backgroundColor = UIColor.blue
iv.image = self.drawAbilityCover()
iv.layer.shouldRasterize = true
return iv
}()
override func viewDidLoad() {
super.viewDidLoad()
setupUI()
}
private func setupUI() {
view.addSubview(self.imageView)
imageView.snp.makeConstraints { (make) in
make.width.equalTo(abilityImageSize)
make.height.equalTo(abilityImageSize)
make.center.equalToSuperview()
}
}
/// 给定中心点,和外接圆半径,获取各个点
private func calculatePolygonPoints(n: UInt, center: CGPoint, radius: CGFloat) -> [CGPoint] {
var arr = [CGPoint]()
let rotateDegree = CGFloat(540) / CGFloat(n) - 90
/// let rotateDegree = 0
for i in 0..<n {
let degree = 2 * CGFloat.pi * (CGFloat(i) / CGFloat(n)) - CGFloat.pi / CGFloat(180) * CGFloat(rotateDegree)
let x = center.x + radius * cos(degree)
let y = center.y + radius * sin(degree)
arr.append(CGPoint(x: rint(x), y:rint(y)))
}
debugPrint(arr)
return arr
}
private func calculateRatioPoints(center: CGPoint, point: CGPoint, ratio: CGFloat) -> CGPoint {
let newX = (point.x - center.x) * ratio + center.x
let newY = (point.y - center.y) * ratio + center.y
return CGPoint(x: rint(newX), y:rint(newY))
}
/// 绘制能力值图层
private func drawAbilityCover() -> UIImage? {
defer {
/// Context end
UIGraphicsEndImageContext()
}
let size = CGSize(width: abilityImageSize, height: abilityImageSize)
/// Context begin
UIGraphicsBeginImageContext(size)
guard let ctx = UIGraphicsGetCurrentContext() else {
return nil
}
/// Draw Debug Circle
ctx.setFillColor(UIColor.green.cgColor)
ctx.fillEllipse(in: CGRect(x: 0, y: 0, width: abilityImageSize, height: abilityImageSize))
/// Center point
let centerPoint = CGPoint(x: abilityImageSize / 2, y: abilityImageSize / 2)
/// Draw polygon path
ctx.setFillColor(UIColor.red.withAlphaComponent(1.0).cgColor)
ctx.setStrokeColor(UIColor.black.cgColor)
let path = CGMutablePath()
let polygonPoints = calculatePolygonPoints(n: 5,
center: centerPoint,
radius: abilityImageSize / 2)
if polygonPoints.count > 0 {
path.move(to: polygonPoints[0])
for i in 1..<polygonPoints.count {
path.addLine(to: polygonPoints[i])
}
}
ctx.addPath(path)
ctx.drawPath(using: .fill)
/// Draw ratio polygon path
ctx.setFillColor(UIColor.black.withAlphaComponent(0.6).cgColor)
ctx.setStrokeColor(UIColor.black.cgColor)
let polygonPoints2 = polygonPoints.map { (point) -> CGPoint in
return calculateRatioPoints(center: centerPoint, point: point, ratio: CGFloat(arc4random()) / CGFloat(UInt32.max))
}
debugPrint(polygonPoints2)
let path2 = CGMutablePath()
if polygonPoints2.count > 0 {
path2.move(to: polygonPoints2[0])
for i in 1..<polygonPoints2.count {
path2.addLine(to: polygonPoints2[i])
}
}
ctx.addPath(path2)
ctx.drawPath(using: .fill)
/// Draw ratio polygon edge circle
ctx.setFillColor(UIColor.yellow.withAlphaComponent(1.0).cgColor)
ctx.setStrokeColor(UIColor.black.cgColor)
let edgeCircleRadius: CGFloat = 4
for point in polygonPoints2 {
ctx.fillEllipse(in: CGRect(x: point.x - edgeCircleRadius,
y: point.y - edgeCircleRadius,
width: edgeCircleRadius * 2,
height: edgeCircleRadius * 2))
}
/// Get UIImage
let image = UIGraphicsGetImageFromCurrentImageContext()
return image
}
}
// // ViewController.swift // AbilityDiagramDemo // // Created by Heyuan Li on 17/2/8. // Copyright © 2017年 Heyuan Li. All rights reserved. // import UIKit import SnapKit class ViewController: UIViewController { private let abilityImageSize: CGFloat = 300 private lazy var imageView: UIImageView = { let iv = UIImageView() iv.backgroundColor = UIColor.blue iv.image = self.drawAbilityCover() iv.layer.shouldRasterize = true return iv }() override func viewDidLoad() { super.viewDidLoad() setupUI() } private func setupUI() { view.addSubview(self.imageView) imageView.snp.makeConstraints { (make) in make.width.equalTo(abilityImageSize) make.height.equalTo(abilityImageSize) make.center.equalToSuperview() } } /// 给定中心点,和外接圆半径,获取各个点 private func calculatePolygonPoints(n: UInt, center: CGPoint, radius: CGFloat) -> [CGPoint] { var arr = [CGPoint]() let rotateDegree = CGFloat(540) / CGFloat(n) - 90 /// let rotateDegree = 0 for i in 0..<n { let degree = 2 * CGFloat.pi * (CGFloat(i) / CGFloat(n)) - CGFloat.pi / CGFloat(180) * CGFloat(rotateDegree) let x = center.x + radius * cos(degree) let y = center.y + radius * sin(degree) arr.append(CGPoint(x: rint(x), y:rint(y))) } debugPrint(arr) return arr } private func calculateRatioPoints(center: CGPoint, point: CGPoint, ratio: CGFloat) -> CGPoint { let newX = (point.x - center.x) * ratio + center.x let newY = (point.y - center.y) * ratio + center.y return CGPoint(x: rint(newX), y:rint(newY)) } /// 绘制能力值图层 private func drawAbilityCover() -> UIImage? { defer { /// Context end UIGraphicsEndImageContext() } let size = CGSize(width: abilityImageSize, height: abilityImageSize) /// Context begin UIGraphicsBeginImageContext(size) guard let ctx = UIGraphicsGetCurrentContext() else { return nil } /// Draw Debug Circle ctx.setFillColor(UIColor.green.cgColor) ctx.fillEllipse(in: CGRect(x: 0, y: 0, width: abilityImageSize, height: abilityImageSize)) /// Center point let centerPoint = CGPoint(x: abilityImageSize / 2, y: abilityImageSize / 2) /// Draw polygon path ctx.setFillColor(UIColor.red.withAlphaComponent(1.0).cgColor) ctx.setStrokeColor(UIColor.black.cgColor) let path = CGMutablePath() let polygonPoints = calculatePolygonPoints(n: 5, center: centerPoint, radius: abilityImageSize / 2) if polygonPoints.count > 0 { path.move(to: polygonPoints[0]) for i in 1..<polygonPoints.count { path.addLine(to: polygonPoints[i]) } } ctx.addPath(path) ctx.drawPath(using: .fill) /// Draw ratio polygon path ctx.setFillColor(UIColor.black.withAlphaComponent(0.6).cgColor) ctx.setStrokeColor(UIColor.black.cgColor) let polygonPoints2 = polygonPoints.map { (point) -> CGPoint in return calculateRatioPoints(center: centerPoint, point: point, ratio: CGFloat(arc4random()) / CGFloat(UInt32.max)) } debugPrint(polygonPoints2) let path2 = CGMutablePath() if polygonPoints2.count > 0 { path2.move(to: polygonPoints2[0]) for i in 1..<polygonPoints2.count { path2.addLine(to: polygonPoints2[i]) } } ctx.addPath(path2) ctx.drawPath(using: .fill) /// Draw ratio polygon edge circle ctx.setFillColor(UIColor.yellow.withAlphaComponent(1.0).cgColor) ctx.setStrokeColor(UIColor.black.cgColor) let edgeCircleRadius: CGFloat = 4 for point in polygonPoints2 { ctx.fillEllipse(in: CGRect(x: point.x - edgeCircleRadius, y: point.y - edgeCircleRadius, width: edgeCircleRadius * 2, height: edgeCircleRadius * 2)) } /// Get UIImage let image = UIGraphicsGetImageFromCurrentImageContext() return image } }