2016-07-17 11 views
4

Я пишу код для прямоугольников для приложения. Я могу отдельно перемещать точки прямоугольников левой кнопкой мыши (LMB).Одновременно перемещайте четыре прямоугольника.

Как я мог перемещать все четыре точки прямоугольника одновременно?

Принцип работы: если я перетащил 1 очко с LMB, другие 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

Thanx много. У меня есть два вопроса: 1) ... Что такое отслеживание? и 2) ... массив allPoints подходит для 4 очков, но что, если у меня много прямоугольников, скажем, 100? – andy

+0

точка, к которой прикоснулся, чтобы начать перетаскивание, я думаю, что это связано с self.trackVertex - если им не нужно начинать с точки, тогда, когда они начинаются, вам нужно выбрать один и рассчитать начальное смещение и применить это к вычислению в мой ответ тоже. вы также можете перебирать множество прямоугольников, но если вы делаете это, вам не нужна начальная точка, вы просто отслеживаете количество движения мыши между каждым обновлением ... – Wain