我正在處理圖像編輯程序。我設法弄清楚如何從圖像中選擇一個矩形,但我也喜歡手繪選擇工具。手繪選擇,複製手繪選定區域在c#
我把選擇的所有點都收集到一個列表中,這對繪圖來說足夠了,但我需要能夠確定圖像的哪些部分在選擇範圍之外以及其內部是什麼。
此外,我需要一種方法來確保選擇不會自己交叉,或者如果發生這種情況,交叉部分會合併到選擇中。
我不想找人爲我做,但我甚至不知道從哪裏開始尋找答案。
有沒有圖書館或首選的方法來做到這一點?
我的代碼:
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);
查找(https://en.wikipedia.org/wiki/Point_in_polygon)和多邊形相交的算法。 –
@ OlivierJacot-Descombes感謝您的提示!我會研究一下 – WolfyD
您應該看看__powerful GraphicsPath__及其各種方法!如果線路連續,也儘量避免單獨的DrawLine調用;而是使用DrawLines。對於freehande的選擇考慮使用DrawCurve。 – TaW