C# DrawEllipse определение координат

161
11 марта 2018, 20:03

Отрисовав 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;

Но не понимаю какое условие использовать

Answer 1

Нужно рисовать не эллипсы, а 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. Поэтому не забывайте их высвобождать.

Answer 2

вариант принадлежности точки к эллипсу через математическое определение

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);
}
READ ALSO
Передать параметры из C# в библиотеку C++

Передать параметры из C# в библиотеку C++

На C# написана программа, есть там тип данных List<Tuple<double,double,DateTime>>, необходимо это передать во встраиваемую библиотеку С++Kак в С++ именно...

149
взять данные из другого формы через user control (winforms)

взять данные из другого формы через user control (winforms)

Добрый деньЕсть одна форма и user control

142
LINQ сумма в итогах

LINQ сумма в итогах

Здравствуйте!

150
Заменить окончания слов (c#)

Заменить окончания слов (c#)

Пользователь вводит текстЕсли слово заканчивается на гласную, то заменить окончание на "program"(c #)

160