Swift - удаление пересекающихся линий - PullRequest
0 голосов
/ 28 февраля 2020

Помощь! Как удалить пересекающиеся линии, чтобы у меня была только внешняя форма?

enter image description here

Что мне нужно изменить в этом, чтобы удалить пересекающиеся линии ?

let width = 300
func circle(withRadius radius: CGFloat) -> UIView {
    let path = UIBezierPath(arcCenter: CGPoint(x: width * (1/2), y: width * (1/3)), radius: 80, startAngle: .zero, endAngle: .pi * 2, clockwise: true)
    path.append(UIBezierPath(arcCenter: CGPoint(x: width * (1/3), y: width * (2/3)), radius: 80, startAngle: .zero, endAngle: .pi * 2, clockwise: true))
    path.append(UIBezierPath(arcCenter: CGPoint(x: width * (2/3), y: width * (2/3)), radius: 80, startAngle: .zero, endAngle: .pi * 2, clockwise: true))

    let shapeLayer = CAShapeLayer()
    shapeLayer.path = path.cgPath
    shapeLayer.fillColor = UIColor.clear.cgColor
    shapeLayer.strokeColor = UIColor.black.cgColor
    shapeLayer.lineWidth = 3.0

    backView.layer.addSublayer(shapeLayer)
    return backView
}

Ответы [ 2 ]

0 голосов
/ 28 февраля 2020

В общем случае вам нужно решить квадратное уравнение c, чтобы вычислить точку пересечения окружностей. Уравнение окружности есть (x-x0) ^ 2 + (y-y0) ^ 2 = r ^ 2, где (x0, y0) центр круга. Но я нашел несколько похожих точек для определения значений ширины и радиуса.

    let width: CGFloat = 300
    let radius: CGFloat = 80

    let point1 = CGPoint(x: width * (1/2), y: width * (1/3))
    let point2 = CGPoint(x: width * (1/3), y: width * (2/3))
    let point3 = CGPoint(x: width * (2/3), y: width * (2/3))

    circle(center: point1, withRadius: radius, startAngle: .pi - .pi/10, endAngle: .pi * 2 + .pi/10)
    circle(center: point2, withRadius: radius, startAngle: .pi / 3.5, endAngle: .pi / 3.5 + .pi * 1.11)
    circle(center: point3, withRadius: radius, startAngle: .pi * 1.6, endAngle: .pi * 1.72 + .pi)

    func circle(center: CGPoint, withRadius radius: CGFloat, startAngle: CGFloat, endAngle: CGFloat) {
        let path = UIBezierPath(arcCenter: center, radius: radius, startAngle: startAngle, endAngle: endAngle, clockwise: true)

        let shapeLayer = CAShapeLayer()
        shapeLayer.path = path.cgPath
        shapeLayer.fillColor = UIColor.clear.cgColor
        shapeLayer.strokeColor = UIColor.black.cgColor
        shapeLayer.lineWidth = 3.0

        backView.layer.addSublayer(shapeLayer)
    }
0 голосов
/ 28 февраля 2020

Один из способов сделать это - вычислить положение 3 внешних точек, где срезаются круги. (Точка обведена красным на изображении). enter image description here

Затем вы вычисляете центр этих точек (мы назовем эту точку центром). После этого вы хотите рассчитать расстояние между одной внешней точкой и центром (мы будем называть это расстояние радиусом). Затем вы можете создать эллипс в центре с радиусом, который мы нашли ранее. Этот эллипс должен быть того же цвета, что и фон, и его zPosition больше, чем остальные 3 круга. И готово, пересекающиеся линии теперь исчезли:)

(Если вы не знаете, как создать elipse, это скрипт, который может вам помочь:)

let circle = SKShapeNode(circleOfRadius: radius)
circle.position = center
circle.zPosition = 100 //Need to be greater than the others zPosition
self.addChild(circle)
...