2016-07-17 47 views
4

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

我怎样才能同时移动一个矩形的所有四个点?

操作原理:如果我用一个点拖动1点,其他3点将同时按照相同的偏移量跟随它。

enter image description here

这是如何元件构建:

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) 
} 

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

+0

你想象什么样的约束:

的线沿线的东西吗?对于其他点与您所拖动的点相比如何移动,有各种不同的思考方式。 (这是你正在考虑的情况,对吗?与同一时间只是同时移动所有点?) –

+0

是的,我希望其他3个点相对于点移动我在拖。 – andy

+0

好的。你应该澄清他们应该采取什么行动。在锁步?就好像两点之间的连线是通过弹性连接的?就好像其他点有质量?实际上你可能会想要达到很多效果(从简单到复杂的物理),而且你可能正在想象一种特定的效果,但是你需要详细描述在人们能够帮助你弄清楚实现这一目标。 –

回答

1

基本上,你需要计算偏移被应用到跟踪点并应用偏移到所有其他点。分离计算和更新最简单,因此更新始终在所有点上运行。

要计算偏移量,只需从新点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 
    } 
} 
+0

你知道当前被跟踪的点,所以你知道它的位置,并且你知道鼠标的位置。 – Wain

+0

非常感谢。我有两个问题:1)...什么是trackPoint?和2)... allPoints数组适合4分,但如果我有很多矩形,比如说100? – andy

+0

点触摸开始拖动,我想它与self.trackVertex有关 - 如果他们不必以一个点开始,那么当他们开始时,你需要选择一个并计算初始偏移量并将其应用于计算中我的回答也是。你也可以迭代许多矩形,但如果你这样做,你不需要一个初始点,你只是跟踪每次更新之间的鼠标移动量... – Wain