Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Расширение класса Point (http://www.flasher.ru/forum/showthread.php?t=175536)

PlutDem 19.02.2012 21:11

Расширение класса Point
 
Здравствуйте, понадобилось добавить классу Point ряд методов линейной алгебры. Вот только код не компилится, пишет что fd не определена.
Код AS3:

public class pVector extends Point {
 
                public function pVector(x:Number,y:Number):void {
                        super(x,y);
                }
                public function pAdd( v:pVector ):void{
                        x += v.x;
                        y += v.y;
                }
                public function pMulNum( i:Number ):void{
                        x *= i;
                        y *= i;
                }
 
        }

Код AS3:

fd = new pVector(22, 22);
                        trace(fd);// ошибка копмиляции


КорДум 19.02.2012 21:26

Код AS3:

private var fd:pVector;

Классы принято с Большой Буквы называть.

PlutDem 19.02.2012 21:38

Не объявил переменную и пытался, что то с ней сделать. Прошу прощенья, видимо PHP иссушил мозг.:)
Теперь споткнулся вот об это:
Код AS3:

var objCenterPoint:pVector;
objCenterPoint = obj.localToGlobal(new pVector(33, 53));

Похоже localToGlobal() ругается на не соответствие типов данных. Видимо придется делать методы pVector статическими.:(

expl 20.02.2012 01:16

Там не localToGlobal ругается, а оператор "=", на то что обычную точку присваиваете переменной с objCenterPoint.

Там нужно возвращаемую localToGlobal точку как-то преобразовать в точку типа pVector.
Один из вариантов (может не адекватный вашим задачам, но для примера сойдёт):
Код AS3:

public static function fromPoint(point:Point):pVector
{
    return new pVector(point.x, point.y);
}
 
var objCenterPoint:pVector;
objCenterPoint = pVector.fromPoint(obj.localToGlobal(new pVector(33, 53)));

А вообще, да:
Если Вы _не_ навешивате дополнительных полей на точку, а только хотите добавить несколько методов - лучше действительно не делать подклассов. А просто сделать кучу функций, принимающих обычные точки и работающих с ними (эти функции можно реализовать как статические в каком-нибудь классе или как отдельные, лежащие в пакете).

Потому что иначе придется создавать объекты своего типа, когда те же операции можно делать и с просто Point.

PlutDem 01.03.2012 23:47

Вот еще одна дилемма:
Код AS3:

public static function summ( v1:Point,v2:Point ):void{
                        v1.x += v2.x;
                        v1.y += v2.y;
                }

Код AS3:

// В функцию нужно передать сумму векторов не изменяя их значения, однако в этом случае
//к вектору v1 навсегда прибавится v2
somefunction( pVector.summ(v1,v2) );

Можно сделать так:
Код AS3:

public static function summ( v1:Point,v2:Point ):Point{
                        pX = v1.x + v2.x;
                        pY = v1.y + v2.y;
                        return new Point(pX,pY)
                }

Код AS3:

//Но в этом случае придется писать довольно длинно
v1= pVector.summ(v1,v2)
//вместо короткого
pVector.summ(v1,v2)

К тому же, насколько я могу судить, во втором случае старые значения векторов будут складироваться в ожидании Сборщика Мусора а это не есть хорошо.
В общем, хотелось бы узнать как все грамотно сделать.

Wolsh 02.03.2012 00:01

Цитата:

Но в этом случае придется писать довольно длинно
А в каком случае короче?
У Вас ни одно предложение не согласуется с другим. Функции имеют разные имена в примерах. Написано что ничего не возвращает, но завершается return'ом, написано "не хочу менять v1 и тут же пример v1 = ...
Нельзя ли чуточку поуважительней? Тут не телепаты.

PlutDem 02.03.2012 00:28

Цитата:

Сообщение от Wolsh (Сообщение 1066557)
А в каком случае короче?
У Вас ни одно предложение не согласуется с другим. Функции имеют разные имена в примерах. Написано что ничего не возвращает, но завершается return'ом, написано "не хочу менять v1 и тут же пример v1 = ...
Нельзя ли чуточку поуважительней? Тут не телепаты.

Извиняюсь, был невнимателен. В основном заставляет сомневаться второй вариант и его проблемы с мусором.

ChuwY 02.03.2012 00:47

А не пытаетесь ли вы сделать add и offset?
А еще можете посмотреть в сторону методов Vector3D. Например на scaleBy.

PlutDem 02.03.2012 01:02

ChuwY
Посмотрел Vector3D и решил, что используя Point, занимаюсь велосипедоводством и экономией на спичках:)
Но опять же, как при вызове функции сохранить исходное значение v1?
Код AS3:

somefunction( v1.add(v2) );


Wolsh 02.03.2012 01:45

Посмотреть мало, надо прочитать.
Цитата:

Добавляет значения элементов x, y и z текущего объекта Vector3D к значениям элементов x, y и z другого объекта Vector3D. Метод add() не изменяет текущий объект Vector3D. Вместо этого он возвращает новый объект Vector3D с новыми значениями.


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

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