Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Тригонометрическая фигня (http://www.flasher.ru/forum/showthread.php?t=158061)

Ssannn 14.06.2011 18:41

Тригонометрическая фигня
 
Вложений: 1
Или я полностью флэш не понимаю(недавно начал осваивать), или я тупой, но как у меня получается отрицательный синус из положительного угла?
Мне просто нужно создать шарик почти на краю пушки
Код AS3:

import flash.events.Event;
import flash.events.MouseEvent;
stop();
var angle:Number = 0;
var AB:Number = 0;
var BC:Number = 0;
var i:uint = 0;
Mouse.hide();
gun.nextFrame();
function mcursor (event:Event)
{
        cursor.x = mouseX;
        cursor.y = mouseY;
        if ((mouseX > gun.x)&&(mouseY < gun.y))
        {
                AB = Math.sqrt((mouseX - gun.x)*(mouseX - gun.x)+(gun.y - mouseY)*(gun.y - mouseY))
                BC = gun.y - mouseY;
                angle = 90 - (Math.asin(BC/AB)* (180 / Math.PI)) + 270;
        }
        if ((mouseX < gun.x)&&(mouseY < gun.y))
        {
                AB = Math.sqrt((gun.x - mouseX)*(gun.x - mouseX)+(gun.y - mouseY)*(gun.y - mouseY))
                BC = gun.y - mouseY;
                angle = Math.asin(BC/AB)* (180 / Math.PI) + 180;
        }
        if ((mouseX < gun.x)&&(mouseY > gun.y))
        {
                AB = Math.sqrt((gun.x - mouseX)*(gun.x - mouseX)+(mouseY - gun.y)*(mouseY - gun.y))
                BC = mouseY - gun.y;
                angle = 90 - (Math.asin(BC/AB)* (180 / Math.PI)) + 90;
        }
        if ((mouseX > gun.x)&&(mouseY > gun.y))
        {
                AB = Math.sqrt((mouseX - gun.x)*(mouseX - gun.x)+(mouseY - gun.y)*(mouseY - gun.y))
                BC = mouseY - gun.y;
                angle = Math.asin(BC/AB)* (180 / Math.PI);
        }
        gun.rotation = Math.round(angle);
        traceText.htmlText = ("угол: "+angle+"<br>косинус: "+Math.cos(angle)+"<br>синус: "+Math.sin(angle));
}
function addBall (event:MouseEvent)
{
        var newBall:ball = new ball();
        if ((mouseX > gun.x)&&(mouseY < gun.y))
        {
                newBall.x = gun.x + Math.cos(angle - 270) * 46.85;
                newBall.y = gun.y - Math.sin(angle - 270) * 46.85;
        }
        if ((mouseX < gun.x)&&(mouseY < gun.y))
        {
                newBall.x = gun.x - Math.cos(angle - 180) * 46.85;
                newBall.y = gun.y - Math.sin(angle - 180) * 46.85;
        }
        if ((mouseX < gun.x)&&(mouseY > gun.y))
        {
                newBall.x = gun.x - Math.cos(angle - 90) * 46.85;
                newBall.y = gun.y + Math.sin(angle - 90) * 46.85;
        }
        if ((mouseX > gun.x)&&(mouseY > gun.y))
        {
                newBall.x = gun.x + (Math.cos(angle) * 46.85);
                newBall.y = gun.y + (Math.sin(angle) * 46.85);
        }
        addChild(newBall).name = "ball" + i;
        i ++;
}
stage.addEventListener (Event.ENTER_FRAME, mcursor);
stage.addEventListener (MouseEvent.CLICK, addBall);


S-ed 14.06.2011 18:56

Math.sin и вообще все тригонометрические функции принимают аргумент в радианах.

КорДум 14.06.2011 19:03

Переделайте хотя бы if-if-if на if-else.

samana 14.06.2011 19:04

Цитата:

Мне просто нужно создать шарик почти на краю пушки
Узнайте координаты на пушке, где должен появится шар. Переведите эти координаты в глобальные, и поместите туда шар.
Код AS3:

var boom_point:Point=boom.localToGlobal(new Point(50,0));
ball.x=boom_point.x;
ball.y=boom_point.y;


Ssannn 14.06.2011 19:06

Большое спасибо! Просто в самом флэше в описании классов для Math.asin было написано в радианах, а в Math.sin ничего не написали, вот я и подумал, что в градусах!

alatar 14.06.2011 19:19

Даже если бы Math.sin принимал параметры в градусах, синус положительного угла может быть отрицательным, а отрицательного положительным.

goodguy 14.06.2011 19:22

samana, если пушка поворачивается, то так сделать не получится.
Вообще, это делается элементарно:
Код AS3:

ball.x = cannon.x + Math.sin(angle * Math.PI / 180) * 100;
ball.y = cannon.y - Math.cos(angle * Math.PI / 180) * 100;

Отставит шар от пушки на 100 пикселей. В зависимости от того, как изначально сделано изображение пушки, возможно прийдется изменить минус на плюс, или наоборот, или сделать оба плюса. Ну, это уже мелочи

Ssannn 14.06.2011 19:26

Цитата:

Узнайте координаты на пушке, где должен появится шар. Переведите эти координаты в глобальные, и поместите туда шар.
Код AS3:

var boom_point:Point=boom.localToGlobal(new Point(50,0));
ball.x=boom_point.x;
ball.y=boom_point.y;


а куда нужно писать этот код? в мувик с пушкой или на кадр? А то как ни пробовал - кучу ошибок наловил

samana 14.06.2011 19:36

Цитата:

Сообщение от goodguy (Сообщение 1003744)
samana, если пушка поворачивается, то так сделать не получится.

Странно, но у меня получается :)

В вашем варианте таки нужно оба плюса.

alatar 14.06.2011 19:52

Плюсы, минусы...
Код AS3:

/* расстояние от центра башни
 * до конца ствола
 */

var len:int = 50;
/* угол поворота башни */
var angle:Number = 45;
 
var point:Point = Point.polar(len, angle * Math.PI / 180);
 
/* при условии, что центр башни в локальных
 * координатах 0, 0. В противном случае добавить
 * смещение.
 */

newBall.x = gun.x + point.x;
newBall.y = gun.y + point.y;


udaaff 14.06.2011 20:51

Название темы не раскрывает сути вопроса.


Часовой пояс GMT +4, время: 10:28.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.