|
|
|||||
Регистрация: Apr 2009
Сообщений: 409
|
Расстояние до фигуры
Здравствуйте, имеются мувики произвольной формы. при клике необходимо определить ближайшее расстояние до границ фигуры? Есть ли возможность это сделать? Кроме как считать расстояние до центра?
Сейчас единсвтенное что приходит на ум - это выпускать из точки клика лучи в разные стороны. и для каждого обсчитывать момент пересечения с фигурой через hitTestPoint и выбирать кратчайший. Последний раз редактировалось faraday; 04.07.2014 в 17:20. |
|
|||||
Регистрация: Jun 2013
Адрес: Воронеж
Сообщений: 101
|
У мувиков всегда одна форма - прямоугольная. И если точка регистрации мувиклипа в центре, то да - расстояние до границ можно определить через координаты центра и габаритных значений клипа.
__________________
В лесу родилась ёлочка, в лесу она росла! Зимой и летом... |
|
|||||
Если Вы умеете находить расстояние между двумя точками - добавьте к каждому объекту несколько контрольных точек и смотрите на расстояние до них.
Если Вы умеете находить расстояние между точкой и прямой - опишите каждый объект совокупностью прямых (если у Вас получится с точками, то дальше с прямыми будет просто) и находите то что хотите найти. В общем случае довольно "дорого" получается проверять каждую точку объекта на предмет удаленности от заданной, поэтому почти всегда используется приближение. Варианты приближения я описал выше.
__________________
...вселенская грусть |
|
|||||
Регистрация: Apr 2009
Сообщений: 409
|
Ёлочка, Форма может и прямоугольная, но внутри вложенный объект их не все может занимать, и это можно проверить.
gloomyBrain, цена вычислений здесь не имеет значения, т.к это ключевой момент. И в случае дорого не понятно как взять каждую точку объекта. когда она уже фигура, а не массив точек. |
|
|||||
Регистрация: Jun 2013
Адрес: Воронеж
Сообщений: 101
|
faraday, то есть, ты хочешь посчитать расстояние до границ, например, такой фигуры в мувиклипе?
Опиши задачу подробнее. Какие именно у тебя фигуры? Как они создаются? Что ты вообще сделать хочешь?
__________________
В лесу родилась ёлочка, в лесу она росла! Зимой и летом... |
|
|||||
Регистрация: Apr 2009
Сообщений: 409
|
есть фигура, есть точка. нужно найти кратчайшее расстояние
|
|
|||||
faraday, можно отрисовать объект в BitmapData и пройтись по всем непрозрачным пикселям. Путем перебора найти ближайший пиксель к заданной точке. Можно оптимизировать перебор, перебирая точки из нужной части картинки.
ЗЫ если Вы сами рисуете фигуры и они не создаются динамически - то не должно быть проблемой добавить/вычислить контрольные точки или описывающие прямые
__________________
...вселенская грусть |
|
|||||
Регистрация: Jun 2013
Адрес: Воронеж
Сообщений: 101
|
Цитата:
faraday, вот так попробуй. import flash.display.Shape; import flash.events.MouseEvent; import flash.events.Event; import flash.display.MovieClip; import flash.geom.Point; var mc:MovieClip; var ray:Shape = new Shape(); var ray_length:Number = 0; const RAY_LENGTH:Number = 1000; ray.x = 0; ray.y = 400; this.addChild( ray ); stage.addEventListener( Event.ENTER_FRAME, update ); function update( e:Event ):void { targeting(); checkHitText(); drawRay(); } function targeting():void { ray.rotation = Math.atan2( stage.mouseY - ray.y, stage.mouseX - ray.x ) * 180 / Math.PI - 90; } function checkHitText():void { var hit_point:Point; ray_length = RAY_LENGTH; for ( var i:int = 0; i <= RAY_LENGTH; i++ ) { hit_point = ray.localToGlobal( new Point( 0, i ) ); if ( mc.hitTestPoint( hit_point.x, hit_point.y, true ) ) break; } ray_length = Math.sqrt( Math.pow( ray.x - hit_point.x, 2 ) + Math.pow( ray.y - hit_point.y, 2 ) ); } function drawRay():void { ray.graphics.clear(); ray.graphics.lineStyle( 1, 0xff0000 ); ray.graphics.moveTo( 0, 0 ); ray.graphics.lineTo( 0, ray_length ); }
__________________
В лесу родилась ёлочка, в лесу она росла! Зимой и летом... |
|
|||||
Регистрация: Apr 2009
Сообщений: 409
|
Ёлочка, Да, спасибо, то что нужно)
gloomyBrain, вот набросал пример по вашему плгоритму, но что то прозрачность не попределяет function minDistance(point:Point,figure:DisplayObject):int{ var bmp:BitmapData=new BitmapData(figure.width,figure.height); var minDist:int=0; bmp.draw(figure); for (var _x:int=0;_x<bmp.width;_x++) for (var _y:int=0;_y<bmp.height;_y++) if((bmp.getPixel32(_x,_y)>> 24 & 0xFF).toString(16)=='ff'){ var curDist:int=Math.sqrt(Math.pow(_x - point.x, 2) + Math.pow(_y - point.y, 2)); if (minDist>curDist) minDist=curDist; } } |
|
|||||
http://xitri.com/2008/09/22/simple-e...-top-view.html
Для чего-то простого сойдет.
__________________
тут я |
Часовой пояс GMT +4, время: 09:16. |
|
« Предыдущая тема | Следующая тема » |
|
|