Форум 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=150501)

i.o. 12.02.2011 22:39

Цитата:

Сообщение от goodguy (Сообщение 972885)
Ясно. Один вопрос отпал :D Спасибо ;)

а что, есть второй? ;)

goodguy 12.02.2011 22:41

Его пока нет, но, думаю скоро появится :D И не один

Я только начал изучать векторы http://www.flasher.ru/forum/image.ph...ine=1296634964

semenyakinVS 13.02.2011 03:15

М-да...

Код AS3:

                public function set length(value:Number):void {
                        var _angle:Number = angle;
                        _x = Math.cos(_angle) * value;
                        _y = Math.sin(_angle) * value;
                        if(Math.abs(_x) < 0.00000001) _x = 0;
                        if(Math.abs(_y) < 0.00000001) _y = 0;
                }
                /**
                * Returns the length of the vector.
                **/

                public function get length():Number {
                        return Math.sqrt(lengthSquared);
                }

Обе функции - очень плохие.

Длину надо кэшировать. Для того, чтобы можно было:

Код AS3:

        public function set length(value:Number):void {
                x *= value/_cashLength;
                y *= value/_cashLength;
 
                // Вот это всё-таки надо… Против глюков.
                if(Math.abs(_x) < 0.00000001) _x = 0;
                if(Math.abs(_y) < 0.00000001) _y = 0;
        }
 
        public function get length():Number {
                return _cashLength;
        }


goodguy 13.02.2011 08:50

Цитата:

Длину надо кэшировать. Для того, чтобы можно было:
В чем смысл?

semenyakinVS 13.02.2011 13:52

Хм... Ну, как сказать. Вместо трёх тригонометрических функций и двух умножений имеем два умножения и два деления.

goodguy 13.02.2011 13:57

Цитата:

Обе функции - очень плохие.
Не такие уж и плохие.
Не знаю, если бы это были какие-то сложнейшие функции, то может и был бы смысл их заменять, а так...

semenyakinVS 13.02.2011 14:17

Ладно... Объясню по-другому.

Я проверял быстродействие разных элементарных математический операций. Результаты (10000000 итераций):

(+): 819
(-): 748
(*): 775
(/): 856
(%): 1263
(cos): 3102
(atan2): 3807

Если честно, немного удивил результат для умножения и деления. До этого я получал другие показатели.

Код проверки:

Код AS3:

var iterCount:uint = 10000000;
 
var i:uint;
var time:Number;
var b:Number = Math.random();
 
// =====================================
time = getTimer();
for(i = 1 ; i <= iterCount ; i++)
{
        i+b;
}
trace("(+): "+(getTimer()-time));
 
// =====================================
time = getTimer();
for(i = 1 ; i < iterCount ; i++)
{
        i-b;
}
trace("(-): "+(getTimer()-time));
// =====================================
time = getTimer();
for(i = 1 ; i <= iterCount ; i++)
{
        i*i;
}
trace("(*): "+(getTimer()-time));
// =====================================
time = getTimer();
for(i = 1 ; i <= iterCount ; i++)
{
        i/b;
}
trace("(/): "+(getTimer()-time));
// =====================================
time = getTimer();
for(i = 1 ; i <= iterCount ; i++)
{
        b%i;
}
trace("(%): "+(getTimer()-time));
// =====================================
time = getTimer();
for(i = 1 ; i <= iterCount ; i++)
{
        Math.cos(i);
}
trace("(cos): "+(getTimer()-time));
// =====================================
time = getTimer();
for(i = 1 ; i <= iterCount ; i++)
{
        Math.atan2(b,i);
}
trace("(atan2): "+(getTimer()-time));
// =====================================


i.o. 13.02.2011 15:01

Раз пошла такая пьянка, то вот вам пища для размышления :)
Код AS3:

public class Vector2
{
        public function Vector2( x:Number=0.0, y:Number=1.0 )
        {
                this.x = x;
                this.y = y;
        }
 
        // fields
        public var x:Number;
        public var y:Number;
 
        // registers
        private static var $r_f01:Number;
 
 
        public function normalize( len:Number=1.0 ):void
        {
                $r_f01 = len / Math.sqrt(x*x + y*y);
 
                x *= $r_f01;
                y *= $r_f01;
        }
}


semenyakinVS 13.02.2011 15:43

О!.. Кстати, давно хотел спросить - что вот это такое? $r_f01

i.o. 13.02.2011 15:47

не понял? обычная переменная вроде бы как..


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

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