5

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?

4

2 に答える 2

13

これは私のために働きます。*(有用だと思われる場合は投票してください!)

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;
        }
于 2012-11-08T10:10:18.757 に答える
3

C# ではそれほど単純ではありません。

まず、 が必要ですGraphicsPath。次に、必要な形状を初期化します。楕円の場合は、メソッドを使用しますAddEllipse。次に、IsVisibleメソッドを使用して、ポイントが形状内に含まれているかどうかを確認します。さまざまな方法のいずれかを使用して、任意の形状をテストできAddLineます。

例えば。

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);
于 2012-11-08T08:46:35.293 に答える