Тема: Мишкою оконтурити коло на PictureBox
Вітання.
Питання алгоритму, а не якихось особливостей C#, але проект на C#, тому вже тут спитаю.
Є вже наперед намальоване коло на picturebox. Потрібно оконтурити його іншим колом, яке малюється за допомоги руху миші. Не можу допетрати, як зробити, щоб коло, яке малюється мишкою, доторкалось своїм краєм до точки де початково натиснув кнопку миші (зараз точка початку це один з кутів квадрату в яке вписується коло). З-за цього не можна точно оконтурить. І ще одна проблема, щоб коло можна було починати малювати в будь якому напрямку, а не тільки в напрямку праворуч-вниз. Зараз більш-менш можна точно оконтурити коли тягнеш мишою праворуч-вниз, а рухом вверх доводити співпадіння кіл. Але думаю що я вигадую лісапєта і є якийсь вже відпрацьований алгоритм.
using System.Drawing;
using System.Windows.Forms;
namespace DrawRectangle1
{
public partial class Form1 : Form
{
bool isClicked = false; // прапорець натискання кнопки миші
int X = 0;
int Y = 0;
int X1 = 0;
int Y1 = 0;
public Form1()
{
InitializeComponent();
pictureBox1.Cursor = Cursors.Cross; // в межах pictureBox курсор у вигляді перехрестя
// Малюємо коло яке треба оконтурити
Bitmap bitmap = new Bitmap(pictureBox1.Width, pictureBox1.Height);
Graphics g = Graphics.FromImage(bitmap);
g.FillEllipse(Brushes.Gray, 70, 70, 150, 150);
pictureBox1.Image = bitmap;
}
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
isClicked = true;
X = e.X;
Y = e.Y;
}
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (isClicked)
{
X1 = e.X;
Y1 = e.Y;
pictureBox1.Invalidate(); //якщо кнопка затиснута то перемальовуємо
}
}
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
isClicked = false;
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
Pen pen = new Pen(Color.Red, 4);
if (X > X1 && Y < Y1) // Рух ліворуч вниз
{
e.Graphics.DrawEllipse(pen, X1, Y, System.Math.Abs(X1 - X), System.Math.Abs(X1 - X));
} else if(X > X1 && Y > Y1) // Рух ліворуч вверх
{
e.Graphics.DrawEllipse(pen, X1, Y1, System.Math.Abs(Y1 - Y), System.Math.Abs(Y1 - Y));
} else if(X < X1 && Y < Y1) // Рух праворуч вниз
{
e.Graphics.DrawEllipse(pen, X, Y, System.Math.Abs(X - X1), System.Math.Abs(X - X1));
} else if(X < X1 && Y > Y1) // Рух праворуч вверх
{
e.Graphics.DrawEllipse(pen, X, Y1, System.Math.Abs(X - X1), System.Math.Abs(X - X1));
}
}
}
}