2016-07-17 20 views
4

Ich schreibe einen Code für App-Rechtecke. Mit der linken Maustaste kann ich Rechtecke einzeln verschieben (LMB).Vier Rechtecke gleichzeitig bewegen

Wie könnte ich alle vier Punkte eines Rechtecks ​​gleichzeitig verschieben?

Das Prinzip der Operation: Wenn ich 1 Punkt mit einem LMB ziehen, folgen die anderen 3 gleichzeitig mit dem gleichen Offset.

enter image description here

Dies ist, wie Elemente konstruiert wurden:

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

hier ein Verfahren mit LMB zum Ziehen:

func mouseDragged(event: NSEvent) { 

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

     updateDragging(point) 
} 

I einen Code (oder Pseudo-Code) benötigen, das ermöglicht, Ich ziehe alle vier Punkte eines Rechtecks ​​nach dem anderen.

+0

Welche Art von Zwang stellen sich vor, Sie? Es gibt alle möglichen Arten, darüber nachzudenken, wie sich die anderen Punkte im Verhältnis zu dem bewegen, was Sie ziehen. (Das ist der Fall, über den du nachdenkst, oder? Versus beweg dich einfach - alle Punkte - auf die gleiche Weise - zur selben Zeit?) –

+0

Ja, ich möchte, dass sich 3 andere Punkte in Bezug auf den Punkt bewegen Ich ziehe. – andy

+0

OK. Sie sollten klären, auf welche Weise sie sich bewegen sollten. Im Gleichschritt? Als ob die Linien zwischen den Punkten durch elastische verbunden sind? Als ob die anderen Punkte Masse haben? Es gibt tatsächlich viele Effekte, die Sie erreichen könnten (von einfacher bis zu komplexer Physik), und Sie stellen sich wahrscheinlich einen bestimmten Effekt vor, aber Sie müssen detailliert beschreiben, was dieser Effekt ist, bevor Ihnen jemand helfen kann, herauszufinden, wie es erreichen. –

Antwort

1

Grundsätzlich müssen Sie den Offset berechnen, der auf den verfolgten Punkt angewendet wird, und diesen Offset auf alle anderen Punkte anwenden. Dies geschieht am einfachsten, indem Sie die Berechnung und das Update trennen, sodass das Update immer in allen Punkten ausgeführt wird.

Um den Offset zu berechnen, subtrahieren Sie einfach den aktuellen Punkt x und y vom neuen Punkt x und y.

Etwas entlang der Linien von:

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

Sie wissen, dass der aktuelle Punkt verfolgt wird, sodass Sie seine Position kennen und die Position der Maus kennen. – Wain

+0

Vielen Dank. Ich habe zwei Fragen: 1) ... Was ist ein TrackingPoint? und 2) ... AllPoints-Array ist für 4 Punkte geeignet, aber was ist, wenn ich viele Rechtecke habe, um 100 zu sagen? – andy

+0

der Punkt, der berührt wurde, um mit dem Ziehen zu beginnen, stelle ich mir vor, dass es mit self.trackVertex zusammenhängt - wenn sie nicht mit einem Punkt beginnen müssen, dann müssen Sie einen auswählen und den ursprünglichen Offset berechnen und auf die Berechnung anwenden meine Antwort auch. Sie können auch über viele Rechtecke iterieren, aber wenn Sie das tun, brauchen Sie keinen Anfangspunkt, Sie verfolgen nur den Mausbewegungsbetrag zwischen jedem Update ... – Wain