Swift 仅在边上绘制CGPath

Swift 仅在边上绘制CGPath,swift,geometry,cgaffinetransform,cgpath,Swift,Geometry,Cgaffinetransform,Cgpath,我正在用Swift做一个游戏,我有一个任意角度的CGPath。现在让我们假设它总是一条直线 我想要创建的是这样的东西: 我已经尝试过一种非常简单的方法,用黑色粗线条宽度进行笔划,复制路径,然后用背景色稍微细一点的线条宽度再次进行笔划。这给了正确的外观,但它最终我需要中间是透明的 我认为这可以通过使用“父”路径(在中间)的转换来实现,但我不确定如何实现。沿单个轴的简单平移不起作用,因为路径是成角度的。我想我需要使用路径的端点计算路径的坡度,并使用一些数学方法找到一个与父路径有一定垂直距离的点。

我正在用Swift做一个游戏,我有一个任意角度的CGPath。现在让我们假设它总是一条直线

我想要创建的是这样的东西:

我已经尝试过一种非常简单的方法,用黑色粗线条宽度进行笔划,复制路径,然后用背景色稍微细一点的线条宽度再次进行笔划。这给了正确的外观,但它最终我需要中间是透明的

我认为这可以通过使用“父”路径(在中间)的转换来实现,但我不确定如何实现。沿单个轴的简单平移不起作用,因为路径是成角度的。我想我需要使用路径的端点计算路径的坡度,并使用一些数学方法找到一个与父路径有一定垂直距离的点。但我真的不知道该怎么做。有什么提示吗,或者有别的方法吗

编辑: 我确实尝试过使用CGPathCreateCopyByStrokingPath,但当然,这会划过整个路径,我真的需要只创建两条边,而不是端点。我不想要这样的东西:

用于创建新路径,该路径以指定的偏移量(偏移量为
线宽的一半)勾勒当前路径的轮廓。然后划过那条新路

更新 这是一个函数,它接受一条线段(作为一对点)和一个偏移量,并返回一条与原始线段平行且偏移的新线段

func lineSegment(segment: (CGPoint, CGPoint), offsetBy offset: CGFloat) -> (CGPoint, CGPoint) {
    let p0 = segment.0
    let p1 = segment.1

    // Compute (dx, dy) as a vector in the direction from p0 to p1, with length `offset`.
    var dx = p1.x - p0.x
    var dy = p1.y - p0.y
    let length = hypot(dx, dy)
    dx *= offset / length
    dy *= offset / length

    // Rotate the vector one quarter turn in the direction from the x axis to the y axis, so it's perpendicular to the line segment from p0 to p1.
    (dx, dy) = (-dy, dx)

    let p0Out = CGPointMake(p0.x + dx, p0.y + dy)
    let p1Out = CGPointMake(p1.x + dx, p1.y + dy)
    return (p0Out, p1Out)
}
下面是一个使用它的游乐场示例:

func stroke(segment: (CGPoint, CGPoint), lineWidth: CGFloat, color: UIColor) {
    let path = UIBezierPath()
    path.moveToPoint(segment.0)
    path.addLineToPoint(segment.1)
    path.lineWidth = lineWidth
    color.setStroke()
    path.stroke()
}

let mainSegment = (CGPointMake(20, 10), CGPointMake(50, 30))
UIGraphicsBeginImageContextWithOptions(CGSizeMake(80, 60), true, 2)
UIColor.whiteColor().setFill(); UIRectFill(.infinite)
stroke(mainSegment, lineWidth: 1, color: .blackColor())
stroke(lineSegment(mainSegment, offsetBy: 10), lineWidth: 2, color: .redColor())
stroke(lineSegment(mainSegment, offsetBy: -10), lineWidth: 2, color: .blueColor())
let image = UIGraphicsGetImageFromCurrentImageContext()
XCPlaygroundPage.currentPage.captureValue(image, withIdentifier: "image")
结果:


请参见上面的“我的编辑”。我尝试过这个,但我认为它对我的用例不起作用。它非常有效,比我预期的要多得多。谢谢你的路径只是一条直线段吗?是的,它是一条直线段。