none
Пересечение прямоугольников с не параллельными сторонами. RRS feed

  • Вопрос

  • Всем доброго вечера. 

    Столкнулся с таким вопросом. Пишу игрушку на WPF (надо). Имеется canvas. На нем имеется перемещаемый юзером Image. Этот Image юзер может перемещать и вертеть вокруг центра масс, так сказать.  Вращение и перемещение производится при помощи строк в таймере:

    ImageList[0].RenderTransform = new RotateTransform(...);

    ImageList[0].Margin = new Thickness(...);

    Также на canvas'е имеется массив из квадратных тайлов - кусочков карты. Для них создан отдельный класс Tile, содержащий информацию о текстурке тайла, координате, типе тайла и так далее.

    Требуется определить, пересекается ли наша Image с каким-либо из тайлов. Не составляет никакого труда представить каждый из тайлов в виде Rect. Но Image каждый раз повернута на произвольный угол, а Rect имеет параллельные сторонам окна стороны. Как мне установить факт пересечения этих прямоугольников?

    Поиск особого результата не дал, и пока на уме только идея представить прямоугольники в виде 2 наборов из 4 отрезков, и проверять пересечение попарно. Если пересеклась хоть одна пара => прямоугольники пересеклись. Но в таком случае я не знаю, как найти реальные координаты углов повернутой картинки, чтобы создать отрезки, составляющие эту картинку. Как поступить?

    • Перемещено Abolmasov Dmitry 20 ноября 2012 г. 8:54 (От:Игры)
    19 октября 2012 г. 16:12

Ответы

  • http://social.msdn.microsoft.com/Forums/ru-RU/fordesktopru/thread/9d313353-8d8c-4f3f-af49-422e5970e14e/.

    Комментарий от Дмитрия про неактивность, видимо, генерится автоматом ;)

    • Предложено в качестве ответа Abolmasov Dmitry 20 ноября 2012 г. 14:32
    • Помечено в качестве ответа Abolmasov Dmitry 30 ноября 2012 г. 14:29
    20 ноября 2012 г. 11:49
    Отвечающий
  •    Добрый день!

       Попробуйте использовать класс CombinedGeometry

    Вот Пример получения пересечения двух прямоугольников:

        <Canvas x:Name="DrawPane" HorizontalAlignment="Left" Height="320" VerticalAlignment="Top" Width="761">
            <Path Stroke="Black" StrokeThickness="1" Fill="#CCCCFF">
                <Path.Data>
                    <CombinedGeometry x:Name="UnionPath" GeometryCombineMode="Intersect">
                        <CombinedGeometry.Geometry1>
                            <GeometryGroup FillRule="Nonzero">
                                <RectangleGeometry Rect="30,55 100 30" />
    
                                <!-- Rotate the geometry 45 degrees using the Transform Property. -->
                                <GeometryGroup.Transform>
                                    <RotateTransform CenterX="40" CenterY="70" Angle="45" />
                                </GeometryGroup.Transform>
                            </GeometryGroup>
                        </CombinedGeometry.Geometry1>
                        <CombinedGeometry.Geometry2>
                            <GeometryGroup FillRule="Nonzero">
                                <RectangleGeometry Rect="30,55 100 30" />
                            </GeometryGroup>
                        </CombinedGeometry.Geometry2>
                    </CombinedGeometry>
                </Path.Data>
            </Path>
        </Canvas>
    

    • Помечено в качестве ответа Abolmasov Dmitry 30 ноября 2012 г. 14:29
    21 ноября 2012 г. 9:21

Все ответы

  • Уважаемый пользователь!

    В вашей теме отсутствует активность в течение последних 5 дней. При отсутствии каких-либо действий в течение 2 последующих дней, тема будет переведена в разряд обсуждений. Вы можете возобновить дискуссию, просто оставив сообщение в данной теме


    Для связи [mail]

    20 ноября 2012 г. 8:54
  • http://social.msdn.microsoft.com/Forums/ru-RU/fordesktopru/thread/9d313353-8d8c-4f3f-af49-422e5970e14e/.

    Комментарий от Дмитрия про неактивность, видимо, генерится автоматом ;)

    • Предложено в качестве ответа Abolmasov Dmitry 20 ноября 2012 г. 14:32
    • Помечено в качестве ответа Abolmasov Dmitry 30 ноября 2012 г. 14:29
    20 ноября 2012 г. 11:49
    Отвечающий
  •    Добрый день!

       Попробуйте использовать класс CombinedGeometry

    Вот Пример получения пересечения двух прямоугольников:

        <Canvas x:Name="DrawPane" HorizontalAlignment="Left" Height="320" VerticalAlignment="Top" Width="761">
            <Path Stroke="Black" StrokeThickness="1" Fill="#CCCCFF">
                <Path.Data>
                    <CombinedGeometry x:Name="UnionPath" GeometryCombineMode="Intersect">
                        <CombinedGeometry.Geometry1>
                            <GeometryGroup FillRule="Nonzero">
                                <RectangleGeometry Rect="30,55 100 30" />
    
                                <!-- Rotate the geometry 45 degrees using the Transform Property. -->
                                <GeometryGroup.Transform>
                                    <RotateTransform CenterX="40" CenterY="70" Angle="45" />
                                </GeometryGroup.Transform>
                            </GeometryGroup>
                        </CombinedGeometry.Geometry1>
                        <CombinedGeometry.Geometry2>
                            <GeometryGroup FillRule="Nonzero">
                                <RectangleGeometry Rect="30,55 100 30" />
                            </GeometryGroup>
                        </CombinedGeometry.Geometry2>
                    </CombinedGeometry>
                </Path.Data>
            </Path>
        </Canvas>
    

    • Помечено в качестве ответа Abolmasov Dmitry 30 ноября 2012 г. 14:29
    21 ноября 2012 г. 9:21