【问题标题】:Move all rectangle's points simultaneously同时移动所有矩形的点
【发布时间】:2016-07-17 10:23:58
【问题描述】:

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

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

操作原理:如果我用一个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) 
}

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

【问题讨论】:

  • 你在想象什么样的约束?有各种不同的方式来思考其他点如何相对于您拖动的点移动。 (这就是您正在考虑的情况,对吗?与在同一时间以相同方式移动所有点?)
  • 是的,我希望其他 3 个点相对于我拖动的点移动。
  • 好的。你应该澄清他们应该以什么方式移动。步调一致?好像点之间的线是用弹性连接的?好像其他点有质量?实际上,您可能希望实现许多效果(从简单到复杂的物理),并且您可能正在想象一种特定效果,但是您需要详细描述该效果是什么,然后才能帮助您弄清楚如何实现它。
  • 如果我移动一个矩形的一个点,那么其他三个同步跟随它。这与我在 Adob​​e Illustrator 中选择一个矩形并拖动它的效果相同——它的所有组件(它们之间的点和线)同时以相同的偏移量跟随鼠标指针。因此,如果我使用鼠标偏移一个矩形的点(x:+50,y:+200),其他三个以相同的偏移量移动。我不需要弹性线的效果,就好像点有质量一样。我不需要任何动态。
  • 嗯明白了。那么为什么不简单地用相同的偏移量更新所有几何图形呢?如果光标移动,例如 (+20, -35),您可以将该偏移应用到您希望移动的所有几何图形。我不知道您的数据结构是什么样的,因此您可以简单地遍历所有相关对象以更新它们。但是大多数绘图程序都会有一个对象层次结构,这样“矩形”的点都由具有自己“位置”的单个形状对象管理;更新形状位置的偏移量会更新它的所有边和点。

标签: swift macos core-graphics cgpoint nsevent


【解决方案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
    }
}

【讨论】:

  • 你知道当前被跟踪的点,所以你知道它的位置,你也知道鼠标的位置。
  • 非常感谢。我有两个问题:1)...trackingPoint 是什么?和 2)...allPoints 数组适合 4 个点,但如果我有很多矩形,比如说 100 个呢?
  • 触摸开始拖动的点,我想它与 self.trackVertex 有关 - 如果他们不必从一个点开始,那么当他们开始时你需要选择一个并计算初始偏移量并将其应用于我的答案中的计算。你也可以迭代许多矩形,但如果你这样做,你不需要一个初始点,你只是在每次更新之间跟踪鼠标移动量......
  • XXX 将填写您要跟踪的任何点 - 如果您要移动所有矩形,它可能是可穿透的鼠标点...
  • 您只需在第一次获得有关拖动的更新时设置它(您可以知道,因为您还没有 - 因为您在拖动时也将其设置回 nil完成)
猜你喜欢
  • 1970-01-01
  • 2015-10-24
  • 2016-06-19
  • 1970-01-01
  • 2017-09-09
  • 2017-12-08
  • 1970-01-01
  • 2014-12-02
  • 2019-05-22
相关资源
最近更新 更多