Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to determine if a point is within an ellipse?

Tags:

c#

geometry

I'm having troubles finding the classic 'Contains' method which returns if a point is within a rectangle, ellipse or some other object. These objects are in a canvas.

I've tried VisualTreeHelper.FindElementsInHostCoordinates but I can't find the way.

How can I do this?

like image 765
MirlvsMaximvs Avatar asked Nov 08 '12 08:11

MirlvsMaximvs


2 Answers

This works for me. *(If you find it usefull please vote it!)

http://my.safaribooksonline.com/book/programming/csharp/9780672331985/graphics-with-windows-forms-and-gdiplus/ch17lev1sec22

 public bool Contains(Ellipse Ellipse, Point location)
        {
            Point center = new Point(
                  Canvas.GetLeft(Ellipse) + (Ellipse.Width / 2),
                  Canvas.GetTop(Ellipse) + (Ellipse.Height / 2));

            double _xRadius = Ellipse.Width / 2;
            double _yRadius = Ellipse.Height / 2;


            if (_xRadius <= 0.0 || _yRadius <= 0.0)
                return false;
            /* This is a more general form of the circle equation
             *
             * X^2/a^2 + Y^2/b^2 <= 1
             */

            Point normalized = new Point(location.X - center.X,
                                         location.Y - center.Y);

            return ((double)(normalized.X * normalized.X)
                     / (_xRadius * _xRadius)) + ((double)(normalized.Y * normalized.Y) / (_yRadius * _yRadius))
                <= 1.0;
        }
like image 125
MirlvsMaximvs Avatar answered Sep 28 '22 14:09

MirlvsMaximvs


It's not quite so simple with C#.

First you need a GraphicsPath. Then initialise it which the shape that you want, for an ellipse use the method AddEllipse. Then use the IsVisible method to check if your point is contained within the shape. You can test for arbitrary shapes by using one of the various AddLine methods.

eg.

Rectangle myEllipse = new Rectangle(20, 20, 100, 50);
// use the bounding box of your ellipse instead
GraphicsPath myPath = new GraphicsPath();
myPath.AddEllipse(myEllipse);
bool pointWithinEllipse = myPath.IsVisible(40,30);
like image 34
Dunes Avatar answered Sep 28 '22 13:09

Dunes