我正在制作图像编辑程序。我设法弄清楚如何从图像中选择一个矩形,但我也喜欢徒手选择工具。
我把选择的所有点都收集到一个列表中,这对于绘图来说已经足够了,但我需要能够确定图像的哪些部分在选择之外以及它内部是什么。
此外,我还需要一种方法来确保选择不会自行交叉,或者如果发生这种情况,交叉部分将合并到选择中。
我不是在找人帮我,但我甚至不知道从哪里开始寻找答案。
是否有图书馆或首选方式?
我的代码:
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);
答案 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)