2016-07-17 46 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