Отрисовав 2 эллипса
Pen myPen = new Pen(Color.Black, 2);
Graphics g = e.Graphics;
g.DrawEllipse(myPen, 150, 70, 300, 300);
Pen myPen1 = new Pen(Color.Red, 2);
Graphics u = e.Graphics;
u.DrawEllipse(myPen1, 165, 85, 270, 270);
Хочу узнать по событию MouseClick попал ли пользователем курсором между ними. Пытался брать значение x и y по нажатию
int x = e.X;
int y = e.Y;
Но не понимаю какое условие использовать
Нужно рисовать не эллипсы, а GraphicsPath
с отрисовкой эллипса:
using (var myPen1 = new Pen(Color.Black, 2))
using (var myPen2 = new Pen(Color.Red, 2))
{
DrawPath(e.Graphics, myPen1, rectangle1);
DrawPath(e.Graphics, myPen2, rectangle2);
}
private void DrawPath(Graphics g, Pen pen, Rectangle rectangle)
{
using (var path = GetEllipsePath(rectangle))
{
g.DrawPath(pen, path);
}
}
private GraphicsPath GetEllipsePath(Rectangle rectangle)
{
var path = new GraphicsPath();
path.AddEllipse(rectangle);
return path;
}
, где rectangle1
и rectangle2
это нужные вам прямоугольники, описывающие эллипс:
Rectangle rectangle1 = new Rectangle(150, 70, 300, 300);
Rectangle rectangle2 = new Rectangle(165, 85, 270, 270);
Для определения принадлежности точки экземпляру GraphicsPath
воспользуемся методом IsVisible
. Т.о., метод, показывающий, находится ли определенная точка между указанными эллипсами будет выглядеть следующим образом:
private bool IsPointBetweenEllipses(Point p)
{
using (var path1 = GetEllipsePath(rectangle1))
using (var path2 = GetEllipsePath(rectangle2))
{
return path1.IsVisible(p) ^ path2.IsVisible(p);
}
}
PS. Практически все примитивы из System.Drawing
реализуют IDisposable
. Поэтому не забывайте их высвобождать.
вариант принадлежности точки к эллипсу через математическое определение
int a = 300;//большая полуось
int b = 300;//малая полуось
int x = 150, y = 70;
int f1f2 = sqrt(a*a-b*b)*2;//расстояние между фокусами
int f1 = x + a/2 - f1f2/2;
int f2 = x + a/2 + f1f2/2;
int fy = y + b/2;
if (diastance(e.X,e.Y,f1,fy) + diastance(e.X,e.Y,f1,fy) <= 2*a)
{
//точка в эллипсе
}
метод distance:
float diastance(int x1, int y1, int x2, int y2)
{
int d1 = abs(x1-x2);
int d2 = abs(y1-y2);
return sqrt(d1*d1 + d2*d2);
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
На C# написана программа, есть там тип данных List<Tuple<double,double,DateTime>>, необходимо это передать во встраиваемую библиотеку С++Kак в С++ именно...
Добрый деньЕсть одна форма и user control
Пользователь вводит текстЕсли слово заканчивается на гласную, то заменить окончание на "program"(c #)