![]() |
|
||||||||||
|
|||||
|
буду краток
модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
|
аналоговый хак:
отрисовываем мувик в битмапдату1. отрисовываем красную линию в битмапдату2. мержим (или copyChanell) битмапдату1 по альфаканалу битмапдаты2 в битмапдату3(размер общий, зависит от заимного расположения). или так: создаем битмапдату3 ( альфа=0) - размер которой зависит от размеров битмапа1 и битмапа2 и их расположения. копируем красный канал из битмапы2, копируем альфа канал из битмап1. берём результирующую выборку по красному цвету не 0 альфы (getColorBoundsRect) размер rect соответствует "степени пересечения"
__________________
Отряд Котовскага Последний раз редактировалось Котяра; 16.02.2010 в 10:35. |
|
|||||
|
Регистрация: Jan 2010
Сообщений: 147
|
Котяра, а не могли бы вы привести пример кодом, плиз. Я там в начале сразу указал, что у меня опыта не оч много
моя первая игруха... буду весьма благодарен |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Цитата:
__________________
Reality.getBounds(this); |
|
|||||
|
Регистрация: Jan 2010
Сообщений: 147
|
на самом деле, Wolsh, конечно прав. у этого алгоритма даже название есть... Wolsh, подскажи, плиз, как рисовать прямую, увеличивая ее шаг, если я пока рисую ее так
|
|
|||||
package { import flash.display.BitmapData; import flash.display.Shape; import flash.display.Sprite; import flash.events.Event; import flash.geom.Point; /** * ... * @author Mikhail Klabukov */ public class Main extends Sprite { private var shape:Shape = new Shape(); public function Main():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); shape.graphics.beginFill(0xFFCC00); shape.graphics.drawEllipse(200, 200, 100, 250); shape.graphics.endFill() addChild(shape); var startLine:Point = new Point(100, 100); var endLine:Point = new Point(500, 550); drawLine(startLine, endLine, 0x0000FF); checkIntersection(startLine, endLine); } private function checkIntersection(start:Point, end:Point):void { var bd:BitmapData = new BitmapData(stage.stageWidth, stage.stageHeight, true, 0); bd.draw(shape) var distance:uint = Point.distance(start, end); end.offset(-start.x, -start.y); var angle:Number = Math.atan2(end.y, end.x); var arr:Array = []; while (distance--){ var pnt:Point = Point.polar(distance, angle); pnt.offset(start.x, start.y); var col:uint = bd.getPixel(pnt.x, pnt.y); if (col){ //trace("ПересечениеXY:",uint(pnt.x),uint(pnt.y)) arr.push(pnt); } } if (arr.length){ drawLine(arr[0], arr[arr.length - 1]); trace("Пересечение:", arr[arr.length - 1], arr[0]) trace("Длина пересечения:", uint(Point.distance(arr[0], arr[arr.length - 1])) + "px") } } private function drawLine(start:Point, end:Point, color:Number = 0xff0000):void { var line:Shape = new Shape() line.graphics.lineStyle(2, color); line.graphics.moveTo(start.x, start.y); line.graphics.lineTo(end.x, end.y); line.graphics.endFill(); addChild(line); } } } |
|
|||||
|
Ну, конечно, если задать шаг в пиксель - то не проскочим - только вот цена такого алгоритма слишком дорога. Я бы так никогда не делал.
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
|
буду краток
модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
|
оптимизировать.
1) берем промежуток ограниченный баундсом мувика ( формулу сами посчитаете) 2) делаем шаг в delta = len/2 (посередине) 3) хиттестим. если false уменьшаем шаг ( дихотомией, фибоначчи, золотым сечением итп) и в 3) так до 1 пикселя, чтоб быть уверенным что проверили всё. чтоб не хиттестить уже проверенные точки, можно их помечать - записывать в массив или еще как, хотя проверка наличия метки может быть дороже хиттеста) нет здесь никакого экстремума)
__________________
Отряд Котовскага Последний раз редактировалось Котяра; 16.02.2010 в 13:11. |
|
|||||
|
Modus ponens
|
Ну так если точность не особо важна, так проще всего посчитать пересекаются ли окружность и прямая - нужно найти перпендикуляр к прямой проходящий через центр окружности и сравнить его с радиусом (если такой перпендикуляр не пересекается с данным отрезком, или радиус меньше длины перпендикуляра - не пересекаются, в противном случае - пересекаются). Аналогично просто посчитать пересекаются ли отрезок и прямоугольник - если крайняя правая точка отрезка левее прямоугольника, или нижняя точка выше, или крайняя левая - правее, или верхняя - ниже, то не пересекаются, в противном случае - пересекаются. Если вы можете описать многоугольник как массив отрезков - так мой первый вариант - будет самым простым решением т.как он как раз проверяет пересечение двух отрезков, просто переберите все отрезки из которых состоит многоугольник и проверьте пересечение.
__________________
Hell is the possibility of sanity |
|
|||||
|
Регистрация: Nov 2008
Сообщений: 205
|
По теме: у меня где - то завалялась геометрическая либа. Определяет пересечение графисеских примитивов с прямыми. Кому надо напомните и вечером вставлю
|
![]() |
![]() |
Часовой пояс GMT +4, время: 00:06. |
|
|
« Предыдущая тема | Следующая тема » |
|
|