隐藏UIBezierPath的一部分
问题描述:
我有3个UIBezierPath,有2个圆圈,一行从1个圆圈的中心到另一个,它看起来像是底部的图片。我想隐藏像顶部图片一样的圆圈内部分。有没有简单的方法来做到这一点?隐藏UIBezierPath的一部分
我的策略是从中心画出一条看不见的线,然后从两个圆的圆周画一条黑线,因为我知道斜坡等,但看起来工作太多了。
private func pathForBoxCircle1() -> UIBezierPath {
let circlePath = UIBezierPath(arcCenter:circle1BoxCurrentCenter, radius: 25, startAngle: 0.0, endAngle: CGFloat(2*M_PI), clockwise: false)
//circlePath.fill()
pathBoxCircle1Global = circlePath
return circlePath
}
private func pathForBoxCircle2() -> UIBezierPath {
let circlePath = UIBezierPath(arcCenter:circle2BoxCurrentCenter, radius: 25, startAngle: 0.0, endAngle: CGFloat(2*M_PI), clockwise: false)
//circlePath.fill()
pathBoxCircle2Global = circlePath
return circlePath
}
private func pathForHorizonLine() -> UIBezierPath {
let path = UIBezierPath()
path.move(to: circle1BoxCurrentCenter)
path.addLine(to: circle2BoxCurrentCenter)
path.lineWidth = 5.0
//pathHorizonLineGlobal = path
return path
}
override func draw(_ rect: CGRect) {
pathForBoxCircle1().stroke()
pathForBoxCircle2().stroke() // same as stroke()
pathForHorizonLine().stroke()
}
答
不能混合在同一形状透明和不透明线。你将不得不绘制2个圆,然后从第一个圆的外侧到第二个圆的外侧绘制线段。
要做到这一点,你需要trig或者pythagoras来计算连接线与你的2个圆相交的点的坐标。
如果C1是你的第一个圆,C2是你的第二个圆,C1在(C1.x,C1.y),C2在(C2.x,C2.y),C1的半径是R1,和C2的半径为R2,那么伪代码将是这个样子:
angle1 = atan2(C1.y - C2y, C1.x - C2.x)
angle2 = atan2(C2.y - C1.y, C2.x - C1.x)
xOffset1 = R1 * cos(angle1)
yOffset1 = R1 * sin(angle1)
point1 = (C1.x + xOffset1, C1.y + yOffset1)
xOffset2 = R2 * cos(angle2)
yOffset2 = R2 * sin(angle2)
point2 = (C2.x + xOffset2, C2.y + yOffset2)
绘制自己的圈子,然后画点1和点2之间的线路。
(请注意,我TRIG是有点生疏,而且我勾勒了这一点,在一张草稿纸。我认为这是正确的,但它是完全未经测试)。
填充圆圈的颜色? – HMHero
@HHHero我想圈出来看看 – bakalolo
你可以显示你的代码来绘制路径吗?你能不能从圆圈的最右边画线到另一个圆圈的最左边部分? – Ali