手绘选择,在c#

时间:2017-10-07 15:31:40

标签: c# graphics drawing

我正在制作图像编辑程序。我设法弄清楚如何从图像中选择一个矩形,但我也喜欢徒手选择工具。

我把选择的所有点都收集到一个列表中,这对于绘图来说已经足够了,但我需要能够确定图像的哪些部分在选择之外以及它内部是什么。

此外,我还需要一种方法来确保选择不会自行交叉,或者如果发生这种情况,交叉部分将合并到选择中。

我不是在找人帮我,但我甚至不知道从哪里开始寻找答案。

是否有图书馆或首选方式?

提前致谢enter image description here

我的代码:

mouseMove事件:

            if (mdown)
            {
                cut_points.Add(e.Location);

                foreach(Point p in cut_points)
                {
                    if (p.X < cut.X || cut.X == -1) { cut.X = p.X; }
                    if (p.Y < cut.Y || cut.Y == -1) { cut.Y = p.Y; }
                    if (p.X > cut.X + cut.Width) { cut.Width = p.X - cut.X; }
                    if (p.Y > cut.Y + cut.Height) { cut.Height = p.Y - cut.Y; }
                }

                this.Invalidate();
            }

抽奖活动:

            using (Brush br = new SolidBrush(Color.FromArgb(120, Color.White)))
            {
                e.Graphics.FillRectangle(br, new Rectangle(0, 0, Width, Height));
            }

            //Freehand
            for (int i = 0; i < cut_points.Count; i++)
            {
                if(i < cut_points.Count - 1)
                {
                    e.Graphics.DrawLine(Pens.Blue, cut_points[i], cut_points[i + 1]);
                    e.Graphics.DrawLine(Pens.Blue, new Point(cut_points[i].X + 1, cut_points[i].Y), new Point(cut_points[i + 1].X + 1, cut_points[i + 1].Y));
                    e.Graphics.DrawLine(Pens.Blue, new Point(cut_points[i].X, cut_points[i].Y + 1), new Point(cut_points[i + 1].X, cut_points[i + 1].Y + 1));
                }
                else
                {
                    e.Graphics.DrawLine(Pens.Blue, cut_points[i], cut_points[0]);
                    e.Graphics.DrawLine(Pens.Blue, new Point(cut_points[i].X + 1, cut_points[i].Y), new Point(cut_points[0].X + 1, cut_points[0].Y));
                    e.Graphics.DrawLine(Pens.Blue, new Point(cut_points[i].X, cut_points[i].Y + 1), new Point(cut_points[0].X, cut_points[0].Y + 1));
                }
            }

            e.Graphics.DrawRectangle(Pens.Black, cut);

1 个答案:

答案 0 :(得分:0)

在OlivierJacot-Descombes和TaW的帮助下,我找到了我需要的解决方案。 我首先开始使用Raycasting,但在非复杂多边形的情况下,这只是可靠的。经过一番搜索后,我发现绕组号可能是我最好的解决方案。

我找到了一个网站,他们很好地解释了这个概念,并提供了用于绕线数计算的C代码以及一些与计算机图形相关的其他很棒的功能。 (网址:http://geomalgorithms.com/a03-_inclusion.html

我将代码从C转换为C#,它运行良好。

代码:

import socks
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "{}".format(proxy_row['ip']), proxy_row['port'], True, 'username', 'password')
socket.socket = socks.socksocket
url = 'http://website.domain'
response = f.get(url, timeout=10)