ウィンドウライブラリとか使ってるのかどうかわかりませんが、2Dでいいんですか?
ドラッグは概念的には↓のような感じです。
(GeometryViewerはいくつかの図形を表示しているビュークラスだと思ってください。)
C++
1class GeometryViewer
2{
3private:
4 std::vector<Geometry*> m_geometries;
5 Geometry* m_draggingGeometry = nullptr;
6 Point m_dragOffset;
7public:
8
9 void mouseDown(const Point& p)
10 {
11 m_draggingGeometry = getGeometryAtPoint(p);
12 if(m_draggingGeometry){
13 // 図形の位置からクリックした位置までのオフセットを記憶
14 m_dragOffset = p - m_draggingGeometry->location();
15 invalidate();
16 }
17 }
18
19 void mouseMove(const Point& p)
20 {
21 if(m_draggingGeometry){
22 // マウスの位置からマウスダウン時のオフセットを引けばドラッグする位置が求まる
23 m_draggingGeometry->setLocation(p - m_dragOffset);
24 invalidate();
25 }
26 }
27
28 void mouseUp(const Point& p)
29 {
30 if(m_draggingGeometry){
31 // ドラッグ終了
32 m_draggingGeometry = nullptr;
33 invalidate();
34 }
35 }
36
37 Geometry* getGeometryAtPoint(const Point& p)
38 {
39 // 図形の配列から位置を含むものを探す
40 for(auto g : m_geometries){
41 if(g->contains(p)) return g;
42 }
43 return nullptr;
44 }
45};
単純にマウスダウン時にその位置に図形があるか調べ、あればその図形と図形の原点からのオフセットを記憶、マウス移動時はマウスの位置からオフセット分を引いた位置を図形の位置としてやればドラッグできます。
3Dの場合でもマウスの位置に対応する(x,y,z)と図形のオフセットから同様に計算できます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/09/25 14:30