![]() |
|
||||||||||
|
|||||
|
Регистрация: 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, время: 00:10. |
|
|
« Предыдущая тема | Следующая тема » |
|
|