![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Feb 2009
Сообщений: 28
|
Как все печально.
|
|
|||||
|
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
|
Lorem ipsum
|
Цитата:
Первый же ответ в этом топике является окончательным: А потом начали наваливать хлама и философии. Какие три формулы? P.S. Аж неловко оттого, что я повторяюсь... то же самое, только короче и сдержанней, писал выше =)
__________________
Поймай яблоко 2! |
|
|||||
|
А если угол надо найти с вершиной в точке(Point)?
В моем случае нужен угол перемещения курсора после нажатия относительно точки. |
|
|||||
|
ИМХО всетки, чтобы в любой ситуации получить именно наименьший угол между векторами и без всяких делений на ноль(за исключением случая с векторами нулевой длинны) надо делать так:
Цитата:
Последний раз редактировалось expl; 14.11.2010 в 15:35. |
|
|||||
|
Не прокатило
![]() package { import flash.display.Sprite; import flash.events.MouseEvent; import flash.geom.Point; public class Main extends Sprite { var pot:Sprite; var point:Point; var save1:Point; var save2:Point; var angle:Number; public function Main() { point=new Point(100,100); pot=new Sprite; pot.graphics.beginFill(0xFF0000); pot.graphics.drawRect(-5,-5,10,10); addChild(pot); pot.x=point.x; pot.y=point.y; pot.addEventListener(MouseEvent.MOUSE_DOWN, potDownListener); pot.addEventListener(MouseEvent.MOUSE_UP, potUpListener); stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownListener); stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpListener); } private function potDownListener(event:MouseEvent):void{ pot.startDrag(false); } private function potUpListener(event:MouseEvent):void{ point.x=pot.x; point.y=pot.y; pot.stopDrag(); } private function mouseDownListener(event:MouseEvent):void { save1=new Point(mouseX,mouseY); stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveListener); } private function mouseMoveListener(event:MouseEvent):void{ save2=new Point(mouseX,mouseY); var dssX1:Number=save1.x-point.x; var dssX2:Number=save2.x-point.x; var dssY1:Number=save1.y-point.y; var dssY2:Number=save2.y-point.y; //var modul1:Number=Math.sqrt(dssX1*dssX1+dssY1*dssY1); //var modul2:Number=Math.sqrt(dssX2*dssX2+dssY2*dssY2); //var a:Number=Math.atan2((dssX1*dssY1+dssX2*dssY1)/(modul1*modul2),(dssX1*dssY2-dssX2*dssY1)/(modul1*modul2)); var a:Number=Math.atan2((dssX1*dssY1+dssX2*dssY1),(dssX1*dssY2-dssX2*dssY1)); angle=a*180/Math.PI; trace(angle); } private function mouseUpListener(event:MouseEvent):void{ removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveListener); } } } |
|
|||||
|
Да, поднакосячил маленько, еще оказалось что atan2(y, x), а подсказка во FlashBulder сказала x, y
![]() Плюс в скалярном произведении идексы попутал (по определению (x0, y0) * (x1, y1) == x0 * x1 + y0 * y1). Исправленное и дополненное: package { import flash.display.DisplayObject; import flash.display.Graphics; import flash.display.Sprite; import flash.events.MouseEvent; import flash.geom.Point; import flash.text.TextField; import flash.text.TextFieldAutoSize; public class Main extends Sprite { private static const WIDTH:int = 800; private static const HEIGHT:int = 600; private var tfAngle:TextField; private var marker1:Marker; private var marker2:Marker; private var point0:Point; private var save1:Point; private var save2:Point; private var angle:Number; public function Main() { point0 = new Point(200, 200); drawPoint0(); tfAngle = new TextField(); tfAngle.autoSize = TextFieldAutoSize.LEFT; addChild(tfAngle); addChild(marker1 = new Marker()); addChild(marker2 = new Marker()); marker1.setPosition(point0); marker2.setPosition(point0); stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown); stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp); } private function drawPoint0():void { var g:Graphics = graphics; g.lineStyle(0, 0x000000); g.moveTo(0, point0.y); g.lineTo(WIDTH, point0.y); g.moveTo(point0.x, 0); g.lineTo(point0.x, HEIGHT); } private function onMouseDown(event:MouseEvent):void { marker1.x = mouseX; marker1.y = mouseY; marker2.x = mouseX; marker2.y = mouseY; stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove); } private function onMouseUp(event:MouseEvent):void { stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove); updateAngle(); } private function onMouseMove(event:MouseEvent):void { updateAngle(); } private function updateAngle():void { marker2.x = mouseX; marker2.y = mouseY; var g:Graphics = graphics; g.clear(); drawPoint0(); g.lineStyle(0, 0xff0000); g.moveTo(point0.x, point0.y); g.lineTo(marker1.x, marker1.y); g.moveTo(point0.x, point0.y); g.lineTo(marker2.x, marker2.y); var angle:Number = angleBetwin2Vectors(point0, new Point(marker1.x, marker1.y), new Point(marker2.x, marker2.y)); tfAngle.text = "Последний посчитанный угол: " + angle + " градусов"; } private function angleBetwin2Vectors(p0:Point, p1:Point, p2:Point):Number { var p01:Point = p1.clone().subtract(p0);//01 - значит вектор от точки 0 к точке 1 var p02:Point = p2.clone().subtract(p0); var modul01:Number = p01.length; var modul02:Number = p02.length; var a:Number = Math.atan2( (p01.x * p02.y - p02.x * p01.y) / (modul01 * modul02), (p01.x * p02.x + p01.y * p02.y) / (modul01 * modul02) ); return a * 180 / Math.PI; } } } import flash.display.Sprite; import flash.geom.Point; // Только рисует квадратик - ничего больше class Marker extends Sprite { public function Marker() { graphics.beginFill(0xFF0000); graphics.drawRect(-5,-5,10,10); } public function setPosition(point:Point):void { x = point.x; y = point.y; } } Последний раз редактировалось expl; 14.11.2010 в 19:00. |
|
|||||
|
БОООЛЬШОЕ СПАСИБО !!!!!
![]() |
|
|||||
|
Кто может подробно прокомментировать это:
|
![]() |
![]() |
Часовой пояс GMT +4, время: 17:17. |
|
|
« Предыдущая тема | Следующая тема » |
|
|