Лучший отвечающий
Пересечение прямоугольников с не параллельными сторонами.

Вопрос
-
Всем доброго вечера.
Столкнулся с таким вопросом. Пишу игрушку на 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
Ответы
-
Комментарий от Дмитрия про неактивность, видимо, генерится автоматом ;)
- Предложено в качестве ответа 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 -
Комментарий от Дмитрия про неактивность, видимо, генерится автоматом ;)
- Предложено в качестве ответа 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