酒喝多了,吐槽:无聊,很无聊。。整个论坛就没好玩的,新手就只有问题问题问题问题问题。高手就只有语重心长语重心长语重心长语重心长。辩论也只有对骂对骂对骂对骂对骂对骂。有那精力有那水平想点东西来做好不好?就剩我这种门外汉瞎j8在弄在玩。我承认我是闲的大把时间玩,你们上班都很累了,你们做的都是拿来赚钱的,不能放出来。累了你上店里放松去,别上网啊。毛伯伯甩出去小妹妹「大哥」「老公」「亲爱的」叫得亲热,比这听「前辈」「高人」「大牛」爽多了。谁来介绍点乐子啊,人生太无聊了。我的智商已经无限低了。………………下周开始戒赌戒票。。去大学蹭课。。先来PS的
再来刚做的,极其简单。
思路很简单1.曲线由一组Point表示节点
2.鼠标移动节点实际是修改单个Point
3.插入删除Point
4.一个节点是一个手柄Handle,就是一个小方块
5.在Paint里画出一条经过所有节点的曲线DrawCurve
6.随便画个十字准星表示当前节点
7.鼠标按下,判断是否在某个已有节点里,如果有,标记之,否则添加新节点
8.鼠标按下且移动,如果已有节点,则节点坐标为鼠标坐标
9.刷新画图懒得写分析什么的了。画图的时候分层就行。背景
准星
曲线
手柄代码贴出来自己看。节点:
 List<Point> points;手柄
        Rectangle getHandle(Point p)
        {
            Rectangle rect = new Rectangle(
                p.X - 3,
                p.Y - 3,
                6,
                6);
            return rect;
        }
判断一个点Point在不在手柄里
        bool isInside(Point p, Rectangle rect)
        {
            return rect.Contains(p);
        }
判断点在不在曲线的某个节点里        bool isHandle(Point p)
        {
            foreach (Point pt in points)
            {
                if (isInside(p, getHandle(pt)))
                {
                    downIndex = points.IndexOf(pt);
                    downPoint = pt;
                    current = pt;
                    return true;
                }
            }            return false;
        }
画手柄
        void drawHandle(Graphics g, Point p)
        {
            if (points.IndexOf(p) == downIndex)
                g.FillRectangle(
                    Brushes.Black,
                    getHandle(p));
            else
                g.DrawRectangle(
                    Pens.Black,
                    getHandle(p));
        }
画曲线
        void drawCurve(Graphics g)
        {
            g.DrawCurve(Pens.Black, points.ToArray());
        }
画十字准星(交叉线)
        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);
        }
拖动
        protected override void OnMouseMove(MouseEventArgs e)
        {
            mousePoint = e.Location;
            if (mouseDown)
            {
                if (Current != null)
                {
                    Current = mousePoint;
                }                Refresh();
            }
        }
完整代码看这里下载源码

解决方案 »

  1.   

    我了个去,CSDN应该给比比开个专版了。
      

  2.   

    论坛多一些野比小王子少一些二13的XXX之王将是一件不错的事情。
      

  3.   

    计算几何大牛:http://www.codeproject.com/KB/recipes/Wykobi.aspx排料大全.chm 来自美国斯泰森大学(Stetson University) 
    http://download.csdn.net/detail/zhao4zhong1/4055807够楼主玩多长时间捏?
    (^_^)
      

  4.   


    说对一半,大牛上CSDN只是来看业内新闻的,不逛论坛。
      

  5.   


    Bezier曲线的节点不在曲线上,除了两端以外。
      

  6.   

    支持下LZCSDN整天地吵闹也是一大风景能丰富大家的业余生活
      

  7.   

    小野我觉得你应该去MSDN论坛上去看看真正的大牛
      

  8.   

    大家可以去看看ouravr(电子设计)的开发氛围,学习氛围,交流氛围,绝对让csdn汗颜。。每隔一段时间就会推出一个DIY项目,大家群策群力,共同完善。。http://www.amobbs.com/
    搞硬件这种成本高周期长的尚且如此,怎么玩软件的论坛没玩个什么名堂出来?
      

  9.   

    顶野比兄,厉害,觉得论坛多一些野比兄这样的牛人,论坛也能更有活力啊。额...java骂C#,Android的喷IOS,微软的说苹果的不好....这些对喷都看麻木了,非要这样喷来喷去吗。自己用什么觉得爽,自己回家捂被子偷着乐啊,非要对喷整出点优越感么...以后多多关注野比兄啊
      

  10.   


    没错!其实我写的很清楚了,DrawCurve(),不是DrawBezier()
      

  11.   

    第一遍的时候发现一个小bug哦,后来再想看又没看到了
      

  12.   


    bug多,不崩溃不报错,逻辑问题懒得改
      

  13.   

    为了避免误导大家,我公布下逻辑上的bug1.移动和点选没有判断左右键,所以左右键都可移动
    2.点击检测的矩阵区域和手柄区一样,使得点到方框上等于点到方框外
    3.状态更新不及时欢迎找bug,改bug,然后贴到这里来。
      

  14.   

    为了避免误导大家,我公布下逻辑上的bug1.移动和点选没有判断左右键,所以左右键都可移动
    2.点击检测的矩阵区域和手柄区一样,使得点到方框上等于点到方框外
    3.状态更新不及时
      

  15.   

    不如搞个开源项目吧,就从绘图开始,干掉PS,GIMP什么的,我觉得那些软件也没什么高深的,只要下功夫,一样做得出来
      

  16.   

    如此……这般……(截取自Photoshop CS 6)