2016-08-15 5 views
2

図を描画するキャンバスを作成したいと思います。カスタムシェイプのNSTrackingArea

私はNSViewから派生したカスタムクラスを作成しました。ここで私は2つの長方形を溺死させ、2つの線でそれらを接続しました。

私はNSView.addTrackingArea機能を使用して、矩形を移動してサイズを変更します。

私が直面している問題、行のマウスイベントを追跡するための追跡領域を作成する方法は? (NSTrackingAreaNSRectの形状を受け入れます)

2番目の質問はアプローチの詳細です。どのように考えて、このアプローチは、グラフィックオブジェクトで操作するのは大丈夫ですか?

enter image description here

+0

実際にトラッキングエリアを使用したいと思うのですが、一部のコンピュータグラフィックスアルゴリズムではなく、小さな四角形で線を近似する必要があります。だから、潜在的には、3x3ポイントの領域があり、それぞれの正方形の中心がライン上にあります。 –

+0

もう1つのアプローチは何ですか?あなたはグラフィックスアルゴリズムに言及しました。 –

+0

私たちは大学の一部として、ずっと前に学んだことを学んだ...しかし、あなたはGoogleに何かしようとすることができます。私はちょうどスタックのオーバーフローで何かを見つけた:http://stackoverflow.com/questions/17692922/check-is-a-point-xy-is-between-two-points-drawn-on-a-straight-line –

答えて

1

私はあなたがあなたの質問に概説したアプローチが適切であるとは思いません。すでに見たように、トラッキングエリアは長方形ではない形状を表すことはできません。また、グラフィックスアプリケーションを作成する場合、線だけでなく長方形ではないさまざまな図形を表現する必要があります。幸いなことに、Apple自身の助けを借りて、Sketchという形で、スクリーンにさまざまな形をたくさん描こうとするプログラムの基本的なセットアップに関する基本的な質問に答えるサンプル描画アプリです。

enter image description here

は、ここで彼らはキャンバスに図形を取得する方法について、簡単に説明だと、彼らはこれらの形状・テストを打つ方法:

  • キャンバスはGraphicオブジェクトを含む単一の配列を持つ単一のNSViewです。
  • Graphicは、NSObjectを継承するの抽象基底クラスです。必要に応じて、上記の方法を実装それぞれが具体Graphicサブクラス(LineRectangleCircleSquare、等)の数がある

    Graphic: NSObject 
        - isContentUnderPoint(point: CGPoint) -> Bool 
        - frame: CGRect 
        - drawInRect(rect: CGPoint) 
    
  • :これは、多数の方法を公開します。

  • 画面に図形を取得するLineの場合

    // in MyCanvas (an NSView subclass) 
    func mouseDown(theEvent: NSEvent { 
        let canvasPoint = convertPoint(theEvent.locationInWindow, fromView: nil) 
        for shape in self.graphics { 
         if shape.isContentUnderPoint(canvasPoint) { 
          // do something! 
         } 
        } 
    } 
    

...ずっと同じ原理であるキャンバスのdrawRect:

// In MyCanvas (an NSView subclass) 
func drawRect(dirtyRect: CGRect) { 
    for shape in self.graphics { 
     shape.drawInRect(dirtyRect) 
    } 
} 
  • ヒットテストで発生します形状は、isContentUnderPointの実装では、線の方程式を計算し(開始点と終了点を使用して)、マウスダウンポイントを差し込み、の式に合っているかどうかを確認してください。全体としては、一握りのコード行を取るだけで、ココアの体操を完全に避けることができます。

  • +0

    これは私の2番目の質問に対する答えです。ライン検出に関しては、それだけでは十分ではない、と私は思う。線を打つには、線の太さに関わらず線の方程式に合った正確な点を打つ必要があります。私は解決策を見出し、ターゲットラインよりも太い線の周りに目に見えないNSBezierPathを構築することです。ヒット検出にはNSBezierPath.containsPointを使用します。 –

    関連する問題