Просмотр полной версии : Расширение класса Point
Здравствуйте, понадобилось добавить классу Point ряд методов линейной алгебры. Вот только код не компилится, пишет что fd не определена.
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;
}
}
fd = new pVector(22, 22);
trace(fd);// ошибка копмиляции
private var fd:pVector;
Классы принято с Большой Буквы называть.
Не объявил переменную и пытался, что то с ней сделать. Прошу прощенья, видимо PHP иссушил мозг.:)
Теперь споткнулся вот об это:
var objCenterPoint:pVector;
objCenterPoint = obj.localToGlobal(new pVector(33, 53));
Похоже localToGlobal() ругается на не соответствие типов данных. Видимо придется делать методы pVector статическими.:(
Там не localToGlobal ругается, а оператор "=", на то что обычную точку присваиваете переменной с objCenterPoint.
Там нужно возвращаемую localToGlobal точку как-то преобразовать в точку типа pVector.
Один из вариантов (может не адекватный вашим задачам, но для примера сойдёт):
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.
Вот еще одна дилемма:
public static function summ( v1:Point,v2:Point ):void{
v1.x += v2.x;
v1.y += v2.y;
}
// В функцию нужно передать сумму векторов не изменяя их значения, однако в этом случае
//к вектору v1 навсегда прибавится v2
somefunction( pVector.summ(v1,v2) );
Можно сделать так:
public static function summ( v1:Point,v2:Point ):Point{
pX = v1.x + v2.x;
pY = v1.y + v2.y;
return new Point(pX,pY)
}
//Но в этом случае придется писать довольно длинно
v1= pVector.summ(v1,v2)
//вместо короткого
pVector.summ(v1,v2)
К тому же, насколько я могу судить, во втором случае старые значения векторов будут складироваться в ожидании Сборщика Мусора а это не есть хорошо.
В общем, хотелось бы узнать как все грамотно сделать.
Но в этом случае придется писать довольно длинно
А в каком случае короче?
У Вас ни одно предложение не согласуется с другим. Функции имеют разные имена в примерах. Написано что ничего не возвращает, но завершается return'ом, написано "не хочу менять v1 и тут же пример v1 = ...
Нельзя ли чуточку поуважительней? Тут не телепаты.
А в каком случае короче?
У Вас ни одно предложение не согласуется с другим. Функции имеют разные имена в примерах. Написано что ничего не возвращает, но завершается return'ом, написано "не хочу менять v1 и тут же пример v1 = ...
Нельзя ли чуточку поуважительней? Тут не телепаты.
Извиняюсь, был невнимателен. В основном заставляет сомневаться второй вариант и его проблемы с мусором.
А не пытаетесь ли вы сделать add (http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/flash/geom/Point.html#add()) и offset (http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/flash/geom/Point.html#offset())?
А еще можете посмотреть в сторону методов Vector3D (http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/flash/geom/Vector3D.html). Например на scaleBy (http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/flash/geom/Vector3D.html#scaleBy()).
ChuwY
Посмотрел Vector3D и решил, что используя Point, занимаюсь велосипедоводством и экономией на спичках:)
Но опять же, как при вызове функции сохранить исходное значение v1?
somefunction( v1.add(v2) );
Посмотреть мало, надо прочитать.
Добавляет значения элементов x, y и z текущего объекта Vector3D к значениям элементов x, y и z другого объекта Vector3D. Метод add() не изменяет текущий объект Vector3D. Вместо этого он возвращает новый объект Vector3D с новыми значениями.
gloomyBrain
02.03.2012, 10:12
objCenterPoint = obj.localToGlobal(new pVector(33, 53));
Конечно ругается! Вы возвращаете ему void, а надо point, если я правильно понял:
public function pVector(x:Number,y:Number):Point {
super(x,y);
return this;
}
Ужас какой. Сами не понимаете, и другим не можете объяснить.
Аха. Круче может быть только нерекурсивная передача ссылки в конструктор [x]
Посмотреть мало, надо прочитать.
:)Я имел в виду не конкретно тот случай, а в принципе. Если бы somefunctionB изменяла бы объект var1 , как в таком случае сохранить его исходное состояние?
// var1 == x
somefunctionA( var1.somefunctionB(var2) );
// var1 == y, а должно быть х
Может вот так?
class Values {
public static var someVar:someVar;
}
// var1 == x
Values.someVar = var1.clone();
somefunctionA( Values.someVar.somefunctionB(var2) );
// var1 == x
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.