帶節點的曲線,可以滑鼠拖動節點,類似PS
阿新 • • 發佈:2019-01-10
轉自: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)
{
判斷點在不在曲線的某個節點裡
- C# code
-
bool isHandle(Point p)
{
foreach (Point pt in points)
{
if (isInside(p, getHandle(pt)))
{
downIndex = points.IndexOf(pt);
downPoint = pt;
current
畫手柄
- 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(); } }
完整程式碼看這裡
下載原始碼