2015-07-31 1 views
0

Я создаю приложение WPF для Pixelsense, где у меня есть семь полигонов. Я могу перемещать их, используя прикосновение. В настоящее время они перекрывают друг друга, как показано на рисунке 1 ниже.Предотвращение перекрытия полигонов

enter image description here

Я хочу форму (форма А), чтобы не перекрывать другую форму (формы В), вместо этого он должен зафиксироваться (Форма A и Форма B в конечном итоге бок о бок или выше и ниже каждого другое) при приближении, как показано ниже.

enter image description here

Я искал StackOverflow для подобных проблем, однако, я был только в состоянии найти несколько ссылок, связанных с проверкой, если точка или мыши находится внутри формы. Не для полного перекрытия фигур или для того, чтобы привязать их к месту.

Есть ли у кого-нибудь идеи относительно того, как я мог это сделать? Любая помощь будет высоко ценится.

+0

Stack Overflow не является форумом/BBS, поэтому их короткий код здесь не будет работать. Попробуйте узнать, как использовать синтаксис обозначения SO. – Raptor

+0

Большое вам спасибо за его исправление. Я попытался добавить изображения, используя синтаксис SO, но он сказал, что мне нужно иметь репутацию 10, прежде чем я смогу отправить изображения. – Naaz

+0

Возможно, я могу предоставить код, который вы можете обнаружить наложением. Было бы полезно? – Ugur

ответ

0

Если мы предположим, что вы используете многоугольник, здесь некоторые решения для обнаружения перекрытия;

public static bool PointCollectionsOverlap_Slow(PointCollection area1, PointCollection area2) 
{ 
    PathGeometry pathGeometry1 = GetPathGeometry(area1); 
    PathGeometry pathGeometry2 = GetPathGeometry(area2); 
    bool result = pathGeometry1.FillContainsWithDetail(pathGeometry2) != IntersectionDetail.Empty; 
    return result; 
} 

public static PathGeometry GetPathGeometry(PointCollection polygonCorners) 
{ 
    List<PathSegment> pathSegments = new List<PathSegment> { new PolyLineSegment(polygonCorners, true) }; 
    PathGeometry pathGeometry = new PathGeometry(); 
    pathGeometry.Figures.Add(new PathFigure(polygonCorners[0], pathSegments, true)); 
    return pathGeometry; 
} 

и более быстрый;

public static bool PointCollectionsOverlap_Fast(PointCollection area1, PointCollection area2) 
{ 
    for (int i = 0; i < area1.Count; i++) 
    { 
     for (int j = 0; j < area2.Count; j++) 
     { 
      if (lineSegmentsIntersect(area1[i], area1[(i + 1) % area1.Count], area2[j], area2[(j + 1) % area2.Count])) 
      { 
       return true; 
      } 
     } 
    } 

    if (PointCollectionContainsPoint(area1, area2[0]) || 
     PointCollectionContainsPoint(area2, area1[0])) 
    { 
     return true; 
    } 

    return false; 
} 

public static bool PointCollectionContainsPoint(PointCollection area, Point point) 
{ 
    Point start = new Point(-100, -100); 
    int intersections = 0; 

    for (int i = 0; i < area.Count; i++) 
    { 
     if (lineSegmentsIntersect(area[i], area[(i + 1) % area.Count], start, point)) 
     { 
      intersections++; 
     } 
    } 

    return (intersections % 2) == 1; 
} 

private static double determinant(Vector vector1, Vector vector2) 
{ 
    return vector1.X * vector2.Y - vector1.Y * vector2.X; 
} 

private static bool lineSegmentsIntersect(Point _segment1_Start, Point _segment1_End, Point _segment2_Start, Point _segment2_End) 
{ 
    double det = determinant(_segment1_End - _segment1_Start, _segment2_Start - _segment2_End); 
    double t = determinant(_segment2_Start - _segment1_Start, _segment2_Start - _segment2_End)/det; 
    double u = determinant(_segment1_End - _segment1_Start, _segment2_Start - _segment1_Start)/det; 
    return (t >= 0) && (u >= 0) && (t <= 1) && (u <= 1); 
} 
+0

Спасибо за это. Я пытаюсь работать с первым битом кода, который вы дали (как это выглядит несколько проще), и мне было просто интересно, можете ли вы оказать дополнительную помощь в понимании этого. У меня есть список объектов, которые являются различными формами, поэтому мне интересно, что я передаю методу PointCollectionsOverlap_Slow() как область 1 и 2? Должен ли я сначала определить, где происходит столкновение, а затем взять эти два объекта? – Naaz

+0

Итак, если у вас есть список фигур, у вас должен быть также список точек для каждого полигона/фигуры. В качестве параметра вы должны передать эти списки точек в виде «PointCollection collection = polygon1.Points;» – Ugur

+0

Таким образом, он обнаружит, существует ли пересечение или нет – Ugur