1. 程式人生 > >帶節點的曲線,可以滑鼠拖動節點,類似PS

帶節點的曲線,可以滑鼠拖動節點,類似PS

轉自:http://topic.csdn.net/u/20120626/22/D778EDE8-CC97-4F13-AC5D-DA65BFB94E50.html

先來PS的



再來剛做的,極其簡單。


思路很簡單

1.曲線由一組Point表示節點
2.滑鼠移動節點實際是修改單個Point
3.插入刪除Point
4.一個節點是一個手柄Handle,就是一個小方塊
5.在Paint裡畫出一條經過所有節點的曲線DrawCurve
6.隨便畫個十字準星表示當前節點
7.滑鼠按下,判斷是否在某個已有節點裡,如果有,標記之,否則新增新節點
8.滑鼠按下且移動,如果已有節點,則節點座標為滑鼠座標
9.重新整理畫圖

懶得寫分析什麼的了。

畫圖的時候分層就行。

背景
準星
曲線
手柄

程式碼貼出來自己看。

節點:
C# code
List<Point> points;


手柄
C# code
Rectangle getHandle(Point p) { Rectangle rect =new Rectangle( p.X -3, p.Y -3, 6, 6); return rect; }


判斷一個點Point在不在手柄裡
C# code
bool isInside(Point p, Rectangle rect) {
return rect.Contains(p); }


判斷點在不在曲線的某個節點裡

C# code
bool isHandle(Point p) { foreach (Point pt in points) { if (isInside(p, getHandle(pt))) { downIndex = points.IndexOf(pt); downPoint = pt; current
= pt; returntrue; } } returnfalse; }


畫手柄
C# code
void drawHandle(Graphics g, Point p) { if (points.IndexOf(p) == downIndex) g.FillRectangle( Brushes.Black, getHandle(p)); else g.DrawRectangle( Pens.Black, getHandle(p)); }


畫曲線
C# code
void drawCurve(Graphics g) { g.DrawCurve(Pens.Black, points.ToArray()); }


畫十字準星(交叉線)
C# code
void drawCrosshair(Graphics g, Point p) { g.DrawLine( Pens.Gray, 0, p.Y, clientRect.Width, p.Y); g.DrawLine( Pens.Gray, p.X, 0, p.X, clientRect.Height); }


拖動
C# code
protectedoverridevoid OnMouseMove(MouseEventArgs e) { mousePoint = e.Location; if (mouseDown) { if (Current !=null) { Current = mousePoint; } Refresh(); } }


完整程式碼看這裡

下載原始碼