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

goodguy 12.02.2011 20:10

Пытаюсь разобраться с векторами, но есть вопросы
 
Понимаю, что название темы не особо раскрывает сути вопроса, но подругому никак, прошу не закрывать =)

В общем, с математикой в школе у меня было сложно (не повезло с учителями), а сейчас нужно разобраться с некоторыми вопросами. С тригонометрическими функциями разобрался давно, и достаточно быстро, но векторы до сих пор оставляют много вопросов, не смотря на то, что перечитал уже кучу инфы.

Нашел такую статью про SAT. В принципе, описание понятно, но реализция этого в коде, не совсем.
http://noregret.org/tutor/n/collision/#1.1

Для прояснения ситуации скачал Vector2D класс от рокетмэна.

А теперь к делу.
Вопрос №1: Как я понимаю, если создать экземпляр класса Vector2D и задать х и у координаты, то вектор в любом случае будет начинаться в координатах 0, 0, а х и у здесь будет точка, куда направлен вектор.
Не могу понять, почему вектору задается только одна точка? Его начало должно находиться в координатах 0, 0 всегда?

in4core 12.02.2011 20:14

Вопрос 1. Да вы все верно говорите. Его начало вроде всегда из 0, 0 идет

goodguy 12.02.2011 20:29

Спасибо.

Тогда другой вопрос. В SAT (скажем, пример №9 по ссылке из первого поста), есть оси на которые проецируются фигуры. Как создать эту ось в коде?
Если эта ось тоже вектор, то как она может, начинаясь в координатах 0, 0, перемещаться целиком?
(надеюсь вопрос будет понятен :D )

in4core 12.02.2011 21:27

goodguy а вообще хелп по флешу разве ничего не дает в эту сторону, насчет настроек вектора ?

goodguy 12.02.2011 21:33

Не более чем сайт рокетмэна. А по второму вопросу вообще ничего. + меня интересует не теория, а применения этого в коде. Теории я уже начитался не мало

samana 12.02.2011 22:15

О векторах очень хорошо, наглядно в картинках и примерах, рассказывается в хорошей книжке - AdvancED Game Design with Flash
правда на английском

i.o. 12.02.2011 22:21

Цитата:

Вопрос №1: Как я понимаю, если создать экземпляр класса Vector2D и задать х и у координаты, то вектор в любом случае будет начинаться в координатах 0, 0, а х и у здесь будет точка, куда направлен вектор.
Не могу понять, почему вектору задается только одна точка? Его начало должно находиться в координатах 0, 0 всегда?
Вектор указывает направление.
Откуда он начинается - дело сугубо личное. Просто принято, что вектор указывает направление из точки [0, 0].
Если смотреть на вектор с точки зрения реализации, то это, грубо говоря, обычная точка, у которой есть свойства x и y.

goodguy 12.02.2011 22:29

Цитата:

О векторах очень хорошо, наглядно в картинках и примерах, рассказывается в хорошей книжке - AdvancED Game Design with Flash
правда на английском
Точно. Надо глянуть примеры оттуда. До них руки так и не дошли
Цитата:

Откуда он начинается - дело сугубо личное. Просто принято, что вектор указывает направление из точки [0, 0].
Хорошо, тогда как задать начальную точку, скажем для этого Vector2D?

п.с. Дело не конкретно в этом классе. Я встречал много его реализаций, и нигде нельзя было задать другую начальную точку.

i.o. 12.02.2011 22:34

Цитата:

Хорошо, тогда как задать начальную точку, скажем для этого Vector2D?

п.с. Дело не конкретно в этом классе. Я встречал много его реализаций, и нигде нельзя было задать другую начальную точку.
Если только переписать код под себя. Только цели неясны..
Вам зачем для вектора две точки?
Обычно есть точка (отдельно) и есть вектор (отдельно). Вот с этими двумя величинами и оперируют, например прикладывают вектор к точке, получая тем самым сдвиг по направлению вектора.

goodguy 12.02.2011 22:37

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

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

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

semenyakinVS 13.02.2011 15:48

(Через минуту)

Ясно. А чего с $ начинается? Это часть стиля?

Добавлено через 3 минуты
Кстати, по поводу статических переменных... Не знаю, может, я что-то не так делал, но я пробовал для набора родственных классов делать статические переменные, чтобы не творить их заново.

К удивлению, я только потерял в быстродействии.

i.o. 13.02.2011 15:52

ну типа статичный регистр. f01 - сокращение от float01, хотя по-сути тут числа double.., да неважно впрочем. Надо же как то выделить было :)

Добавлено через 6 минут
фишка то не в названии, а в том, что при выносе промежуточной локальной переменной из функции в приватное поле класса, наблюдается прирост быстродействия. Я ни в коем случае не настаиваю использовать такие конструкции в ущерб функциональности. Просто коли уж зашел разговор о выдавливании последних капель производительности из кода, то вот, знайте, есть и такие вариации так сказать :)

Добавлено через 13 минут
хотя в данном примере можно было поступить еще проще: заюзать уже существующую локальную переменную
Код AS3:

        public function normalize( len:Number=1.0 ):void
        {
                len /= Math.sqrt(x*x + y*y);
 
                x *= len;
                y *= len;
        }


semenyakinVS 13.02.2011 16:07

Не... Так я ж тоже так думал! Но проверил - и с удивлением, с грустью даже осознал, что таки нет. Не помогло! Могу показать функцию, в которой применял:


Код AS3:

public static function segINTseg(segm1:Segm2d, segm2:Segm2d):Point2d
                {
                        var kx1:Number = segm1.DeltaX;
                        var kx2:Number = segm2.DeltaX;
 
                        var ky1:Number = segm1.DeltaY;
                        var ky2:Number = segm2.DeltaY;
 
                        var tmpCord:Number;
 
                        // *************
                        //  0 0 line_2
                        //  |/
                        //  /
                        //  /|
                        // 0 0 line_1
                        // *************
 
                        if (kx1 == 0)
                        { 
                        . . .

Вот. Есть статический класс Math2d.

Указанный кусок - начало функции поиска точки пересечения двух отрезков. Я сделал простую вещь. Проверил время выполнения для этой версии функции (10000 итераций), а потом - просто сделав копи-паст, запустил ту же функцию, но со статическими переменными, т. е., в коде класса Math2d сделал:

Код AS3:

static var kx1:Number;
static var kx2:Number;
 
static var ky1:Number;
static var ky2:Number;

А в коде функции просто использовал эти переменные. В результате производительность упала (!) где-то в полтора раза.

Не понимаю даже - почему.

i.o. 13.02.2011 16:11

приватные нужно, приватные.
Я проверял где-то год назад это все - наблюдался небольшой прирост, иначе и не писал бы.
И прирост собственно будет только в "маленьких" методах, который пару строчек. На котором хоть как-то сказывается инициализация локальной переменной.
Если у вас потом идет тяжелый расчет, то толку абсолютно никакого не будет, скорее падение будет наблюдаться.

semenyakinVS 13.02.2011 16:14

Ну так, приватные... Без модификатора доступа они, как я понимаю, по-умолчанию приватные...

Ладно. Наверное, что-то где-то напутал, когда проверял скорость выполнения. Ещё раз исправлю - гляну, что выйдет. Отпишусь.

А за идею использовать $ в начале названий переменных спасибо. Как раз недавно голову ломал по этому поводу. Забыл, что этот символ входит в набор разрешённых для начала имени переменной.
Буду теперь юзать для служебных параметров классов.

i.o. 13.02.2011 16:15

по-умолчанию internal

Добавлено через 2 минуты
$ так-то еще у супер-методов принято ставить...

Psycho Tiger 13.02.2011 19:09

В оригинальной конвенции $ предлагают ставить перед методами финалистами =)

@Автор: вектор — это направленный отрезок. При этом 2 вектора считаются одинаковыми если они совпадают параллельным переносом. То есть вектора
(0,0; 10; 10) и
(10; 10; 20; 20) совершенно одинаковые. А раз такая пьянка то смысла задавать первую точку нет

@i.o., я вот не очень понял. Скорость сохранения в статичное поле класса в твоём примере быстрее, чем в локальную переменную или что?

alatar 13.02.2011 20:14

Кто нибудь тестировал на производительность этот Vector2 в сравнении с Point? Какой смысл его вообще использовать?

goodguy 13.02.2011 20:18

Да какая разница. Для меня его производительность вообще не имеет значения. И суть темы не в этом.
Цитата:

@Автор: вектор — это направленный отрезок. При этом 2 вектора считаются одинаковыми если они совпадают параллельным переносом. То есть вектора
(0,0; 10; 10) и
Кэп ;)
Об этом написано в википедии и еще на куче ресурсов.

Для меня важна не теория, а применение на практике. В данном случае в коде на ActionScript 3.

alatar 13.02.2011 20:35

Цитата:

Для меня важна не теория, а применение на практике. В данном случае в коде на ActionScript 3.
http://www.flasher.ru/forum/showpost...4&postcount=25

i.o. 14.02.2011 01:22

Цитата:

@i.o., я вот не очень понял. Скорость сохранения в статичное поле класса в твоём примере быстрее, чем в локальную переменную или что?
год назад, когда я тестил, именно так и было (к короткими методами, где объявление локальной переменной существенно влияет на скорость выполнения метода). Не исключаю, что за это время все могло измениться и теперь не имеет смысла :)

Волгоградец 14.02.2011 12:02

Цитата:

Сообщение от alatar (Сообщение 973040)
Кто нибудь тестировал на производительность этот Vector2 в сравнении с Point? Какой смысл его вообще использовать?

Тут скорее идеологический вопрос - вектор и точка похожи во многом, однако точка не может показывать направление, а вектор именно для этого и существует. Плюс такие полезные операции как дот-, кросс-продукты не логично применять к точкам. И я тестировал нативные классы - Vector3D, Point - они пипец тормозные. А Vector3D вообще после normalize может дать результат больше 1.
Автор - я в блоге тут на флэшере писал про вектора и САТ...

alatar 14.02.2011 13:45

Цитата:

Тут скорее идеологический вопрос - вектор и точка похожи во многом, однако точка не может показывать направление, а вектор именно для этого и существует.
Point это вектор, разница только в названии.
Цитата:

А Vector3D вообще после normalize может дать результат больше 1.
Это как это вы его так хитро нормализовали?

Psycho Tiger 14.02.2011 14:09

Цитата:

Point это вектор, разница только в названии.
С тем же успехом можно сказать что любые 2 числа это вектор. Когда мне понадобится узнать направление в вектора в градусах — Point предоставит мне эту возможность? Или я должен буду везде писать тригонометрические выражения вместо вызова метода?

Волгоградец 14.02.2011 14:21

alatar, в этом и дело, что в моем понятии (да и не только в моем) - Point - это точка. Ну может нулевой вектор можно представить как точку. Две точки на плоскости не дадут мне визуального представления об углах и пропорциях между ними... Но повторюсь - это идеологический момент - вектор показывает изменение, а точка - конкретное состояние.
Про Vector3D не понял вопрос... Это не я нормализовал - это стандартный метод класса Vector3D...

alatar 14.02.2011 15:20

Цитата:

Когда мне понадобится узнать направление в вектора в градусах — Point предоставит мне эту возможность?
Не все реализации вектора содержат этот функционал. Для векторных операций эта информация не является необходимой.
Цитата:

Две точки на плоскости не дадут мне визуального представления об углах и пропорциях между ними...
Это вы о чем? Класс Vector2D уже стал визуальным и содержит больше одной пары координат?
Цитата:

Но повторюсь - это идеологический момент - вектор показывает изменение, а точка - конкретное состояние.
В английском point — это не только точка.
Цитата:

point
г. (глагол) указать, показывать пальцем; наводить, направлять; прицеливаться, целиться; наставить, быть направленным; свидетельствовать; заточить, заострить, точить; ставить знаки препинания

сущ. точка; деление шкалы, румб; место, пункт, станция; момент; очко, балл; единица продовольственной или промтоварной карточки; вопрос, дело; главное, суть, смысл; особенность, достоинство, преимущество; статья; кончик, острие, наконечник; редька [мор.]; мыс, выступающая морская коса; вершина горы, гравировальная игла

goodguy 14.02.2011 15:27

Цитата:

В английском point — это не только точка.
А вот это точно подмечено

В качестве точки чаще используется dot

Psycho Tiger 14.02.2011 15:34

Цитата:

Не все реализации вектора содержат это функционал. Для векторных операций эта информация не является необходимой.
Ну супер. Для вектора и точки общее то, что определяющими этих штук являются 2 числа.
Например, судя по этой статье каждая составляющая звука — это пара громкость-высота. Вы хотите работать с кодом, где звук представлен совокпуностью... Point`ов? Пара вес-рост это тоже 2 значения. Сумма этих значений — это единицы для весовых категорий ряда единоборств.
Я до абсурда могу довести быстро и просто. Если я работаю с вектором — я хочу в любой момент одним движением кисти узнать его угол наклон к OX, одним взмахом глаза нормализовать и одной силой мысли вывести его на экран для дебага.

alatar 14.02.2011 15:53

Цитата:

Для вектора и точки общее то, что определяющими этих штук являются 2 числа.
У них гораздо больше общего.
Цитата:

Если я работаю с вектором — я хочу в любой момент одним движением кисти узнать его угол наклон к OX
Еще раз повторюсь, для операций с векторами, а именно сложение, вычитание и умножение векторов угол не важен.
Цитата:

одним взмахом глаза нормализовать
У point'а есть метод для нормализации.
Цитата:

одной силой мысли вывести его на экран для дебага.
В чем проблема?

Psycho Tiger 14.02.2011 16:09

Цитата:

Еще раз повторюсь, для операций с векторами, а именно сложение, вычитание и умножение векторов угол не важен.
Причем тут вообще операции с векторами? Я хочу пользователю вывести угол наклона.
Цитата:

У них гораздо больше общего.
Что?


В целом я пасс заводить класс VectorPointExtenstion чтобы добавлять к существующему Point функционал.


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

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