/// <summary> /// Checks whether the two convex quadrilaterals intersect. Note that if one of the quadrilaterals is concave, the /// test may return a wrong result (so don't use them here). /// </summary> /// <returns>Returns <c>true</c> if both quadrilaterals intersect/overlap; returns <c>false</c> if they don't. /// </returns> public static bool CheckRectRectIntersection(Quadrilateral quad1, Quadrilateral quad2) { Point[] quad1Points = new Point[] { quad1.A, quad1.B, quad1.C, quad1.D }; Point[] quad2Points = new Point[] { quad2.A, quad2.B, quad2.C, quad2.D }; // // Check quad1 edges // if (DoAxisSeparationTest(quad1.A, quad1.B, quad1.C, quad2Points)) { return false; } if (DoAxisSeparationTest(quad1.A, quad1.D, quad1.C, quad2Points)) { return false; } if (DoAxisSeparationTest(quad1.D, quad1.C, quad1.A, quad2Points)) { return false; } if (DoAxisSeparationTest(quad1.C, quad1.B, quad1.A, quad2Points)) { return false; } // // Check quad2 edges // if (DoAxisSeparationTest(quad2.A, quad2.B, quad2.C, quad1Points)) { return false; } if (DoAxisSeparationTest(quad2.A, quad2.D, quad2.C, quad1Points)) { return false; } if (DoAxisSeparationTest(quad2.D, quad2.C, quad2.A, quad1Points)) { return false; } if (DoAxisSeparationTest(quad2.C, quad2.B, quad2.A, quad1Points)) { return false; } // If we found no separating axis, then the quadrilaterals intersect. return true; }
public static bool CheckRectRectIntersection(Quadrilateral quad1, Rect quad2) { return CheckRectRectIntersection(quad1, new Quadrilateral(quad2)); }
/// <summary> /// Отжатие кнопки мыши /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void myCanvas_MouseUp(object sender, MouseButtonEventArgs e) { //Если флаг = true, то сохраняем все выделенные элементы в массив //Флаг = false if (ZoomFlag) { ZoomFlag = false; IncStatus(); } if (SelectingZone) { for (int i = 0; i < myCanvas.Children.Count; i++) { Rect rect = new Rect(); rect.X = Canvas.GetLeft(myCanvas.Children[i]); rect.Y = Canvas.GetTop(myCanvas.Children[i]); rect.Width = myCanvas.Children[i].RenderSize.Width; rect.Height = myCanvas.Children[i].RenderSize.Height; Quadrilateral redQuad = new Quadrilateral(rect); rect.X = Canvas.GetLeft(selectedZone); rect.Y = Canvas.GetTop(selectedZone); rect.Width = selectedZone.Width; rect.Height = selectedZone.Height; Quadrilateral greenQuad = new Quadrilateral(rect); if (IntersectionTest.CheckRectRectIntersection(redQuad, greenQuad) && rect.Width > 0) { SelectObject(myCanvas.Children[i]); } } SelectingZone = false; myCanvas.Children.Remove(selectedZone); } Mouse.Capture(null); }