gpt4 book ai didi

delphi - TVector3D.AddVector3D 不起作用(对我来说)

转载 作者:行者123 更新时间:2023-12-03 18:27:21 26 4
gpt4 key购买 nike

使用 德尔福 XE4 (update1) 和 FMX , 我要 移动相机使用此代码(在滚轮鼠标事件内):

AVector := Vector3D(0, 0, 3);
Camera.Position.Vector.AddVector3D(AVector);

代码编译,什么都不做。使用调试器, Camera.Position.Vector值(value) 不变 .

当用

AVector := Vector3D(0, 0, 3);
Camera.Position.Vector := Camera.Position.Vector + AVector;

...有用 !!!和 AddVector3D() 一样奇怪函数正是执行此代码!

procedure TVector3D.AddVector3D(const AVector3D: TVector3D);
begin
Self := Self + AVector3D;
end;

我的代码有什么问题???

最佳答案

Camera.PositionTPosition3D 类型.和TPosition3D.VectorTVector3D 类型的属性有一个 setter/getter 和一个二传手。请注意 TVector3D是一条记录,它是值类型而不是引用类型。这个细节至关重要。

所以,当你写 Camera.Position.Vector您指的是向量的副本。这是一个副本,因为 TVector3D是一个值类型。

因此,非工作代码相当于:

var
TempVec: TVector3D;
....
TempVec := Camera.Position.Vector;
TempVec.AddVector3D(...);

显然是调用 AddVector3D不会修改 Camera.Position因为调用 AddVector3D只是改变临时本地。

在您的代码中,该临时局部变量仍然存在,但您没有给它命名。这是一个隐藏的隐式变量。

为了修改位置,您必须对 Vector 进行赋值。属性,这正是工作代码所做的。

作为一般规则,支持就地突变的值类型通常表示设计不佳。因此,在我看来,Embarcadero 工程师不应该添加像 AddVector3D 这样的变异实例方法。 , Normalize , Scale等等。这种方法会导致这种困惑。相反,使用返回新值的函数可以更好地实现该功能,就像重载运算符一样。

关于delphi - TVector3D.AddVector3D 不起作用(对我来说),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17844149/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com