同时移动所有矩形的点

Move all rectangle's points simultaneously

我正在编写应用构建矩形的代码。我可以用鼠标左键单独移动矩形的点(LMB)。

如何同时移动矩形的所有四个点

操作原理:如果我用鼠标左键拖动1个点,其他3个点将同时以相同的偏移量跟随。

元素是这样构造的:

enum RectPoint {

    case point1(point: CGPoint)
    case point2(point: CGPoint)
    case point3(point: CGPoint)
    case point4(point: CGPoint)

    func pointCoord() -> [CGPoint] {    
        switch self {  
            case .point1(let point): return [point]
            case .point2(let point): return [point]
            case .point3(let point): return [point]
            case .point4(let point): return [point]
        }
    }
    ..........................
}

class SpecialView: NSView {

    var array: [RectPoint] = [] 
    private var trackVertex: RectPoint?
    private var trackVertexIndex: Int?
    private var trackElementIndex: Int?

    ..........................

    private func updateDragging(point: CGPoint) {
        guard let trackVertex = self.trackVertex,
              let trackVertexIndex = self.trackVertexIndex,
              let trackElementIndex = self.trackElementIndex   
        else { 
            return 
        }

        let newVertex = trackVertex.debugReleaseChecking(point, 
                                                atElementIndex: trackElementIndex)

        array[trackVertexIndex] = newVertex     
        self.needsDisplay = true
    }
}

LMB拖动方法如下:

func mouseDragged(event: NSEvent) {

   var point = self.convertPoint(event.locationInWindow, fromView: nil)
   updateDragging(point) 
}

我需要一个代码(或伪代码)允许我一次拖动任何矩形的所有四个点。

基本上,您需要计算应用于跟踪点的偏移量并将该偏移量应用于所有其他点。最简单的做法是将计算和更新分开,因此更新始终在所有点上运行。

要计算偏移量,只需从新点 x 和 y 中减去当前点 x 和 y。

大致如下:

func mouseDragged(event: NSEvent) {
    let eventPoint = self.convertPoint(event.locationInWindow, fromView: nil)
    let trackingPoint = XXX

    let xOffset = eventPoint.x - trackingPoint.x
    let yOffset = eventPoint.y - trackingPoint.y

    for point in allPoints {
        point.x += xOffset
        point.y += yOffset
    }
}