我最近了解到,我们在物理计算中经常使用勾股定理,恐怕我并没有真正理解这一点。
这是一本书的示例,以确保对象MAXIMUM_VELOCITY
在水平面中的移动速度不会快于常量:
MAXIMUM_VELOCITY = <any number>;
SQUARED_MAXIMUM_VELOCITY = MAXIMUM_VELOCITY * MAXIMUM_VELOCITY;
function animate(){
var squared_horizontal_velocity = (x_velocity * x_velocity) + (z_velocity * z_velocity);
if( squared_horizontal_velocity <= SQUARED_MAXIMUM_VELOCITY ){
scalar = squared_horizontal_velocity / SQUARED_MAXIMUM_VELOCITY;
x_velocity = x_velocity / scalar;
z_velocity = x_velocity / scalar;
}
}
让我们用一些数字尝试一下:
对象试图在x中移动5个单位,在z中移动5个单位。总共只能水平移动5个单位!
MAXIMUM_VELOCITY = 5;
SQUARED_MAXIMUM_VELOCITY = 5 * 5;
SQUARED_MAXIMUM_VELOCITY = 25;
function animate(){
var x_velocity = 5;
var z_velocity = 5;
var squared_horizontal_velocity = (x_velocity * x_velocity) + (z_velocity * z_velocity);
var squared_horizontal_velocity = 5 * 5 + 5 * 5;
var squared_horizontal_velocity = 25 + 25;
var squared_horizontal_velocity = 50;
// if( squared_horizontal_velocity <= SQUARED_MAXIMUM_VELOCITY ){
if( 50 <= 25 ){
scalar = squared_horizontal_velocity / SQUARED_MAXIMUM_VELOCITY;
scalar = 50 / 25;
scalar = 2.0;
x_velocity = x_velocity / scalar;
x_velocity = 5 / 2.0;
x_velocity = 2.5;
z_velocity = z_velocity / scalar;
z_velocity = 5 / 2.0;
z_velocity = 2.5;
// new_horizontal_velocity = x_velocity + z_velocity
// new_horizontal_velocity = 2.5 + 2.5
// new_horizontal_velocity = 5
}
}
现在这很好用,但是没有毕达哥拉斯,我们可以做同样的事情:
MAXIMUM_VELOCITY = 5;
function animate(){
var x_velocity = 5;
var z_velocity = 5;
var horizontal_velocity = x_velocity + z_velocity;
var horizontal_velocity = 5 + 5;
var horizontal_velocity = 10;
// if( horizontal_velocity >= MAXIMUM_VELOCITY ){
if( 10 >= 5 ){
scalar = horizontal_velocity / MAXIMUM_VELOCITY;
scalar = 10 / 5;
scalar = 2.0;
x_velocity = x_velocity / scalar;
x_velocity = 5 / 2.0;
x_velocity = 2.5;
z_velocity = z_velocity / scalar;
z_velocity = 5 / 2.0;
z_velocity = 2.5;
// new_horizontal_velocity = x_velocity + z_velocity
// new_horizontal_velocity = 2.5 + 2.5
// new_horizontal_velocity = 5
}
}
没有毕达哥拉斯的好处:
- 行数少
- 在这些行中,更容易阅读正在发生的事情
- ...由于乘法较少,因此计算时间较少
在我看来,没有毕达哥拉斯定理,计算机和人类将获得更好的收益!但是,我确定我错了,因为我已经在许多著名的地方看到了毕达哥拉斯定理,所以我想向我解释一下将毕达哥拉斯定理用于数学新手的好处。
这和单位向量有关系吗?对我而言,单位矢量是当我们将矢量标准化并将其转化为分数时。我们通过将向量除以更大的常数来完成此操作。我不确定它是什么常数。图的总大小?无论如何,因为它是分数,所以我认为单位矢量基本上是一个图形,它可以适合3D网格,其中x轴从-1到1,z轴从-1到1,y轴从-1到1。这实际上是我所知道的关于单位矢量的所有信息...:P太少了,我看不到它们的用处。
另外,在上面的示例中,我们并没有真正创建单位矢量。我应该像这样确定标量吗:
// a mathematical work-around of my own invention. There may be a cleverer way to do this! I've also made up my own terms such as 'divisive_scalar' so don't bother googling
var divisive_scalar = (squared_horizontal_velocity / SQUARED_MAXIMUM_VELOCITY);
var divisive_scalar = ( 50 / 25 );
var divisive_scalar = 2;
var multiplicative_scalar = (divisive_scalar / (2*divisive_scalar));
var multiplicative_scalar = (2 / (2*2));
var multiplicative_scalar = (2 / 4);
var multiplicative_scalar = 0.5;
x_velocity = x_velocity * multiplicative_scalar
x_velocity = 5 * 0.5
x_velocity = 2.5
再说一次,我看不出为什么这样更好,但是它更多的是“ unit-vector-y”,因为multiplicative_scalar是unit_vector吗?如您所见,我使用诸如“ unit-vector-y”之类的词,因此我实际上不是数学家!还应注意,单位矢量可能与勾股定理无关,因此,如果我在错误的树上吠叫,则可以忽略所有这些。
我是一个非常有视觉素养的人(3D建模者和行业的概念艺术家!),我发现图表真的非常有用,所以请尽可能多地人道主义!
sqrt(2.5*2.5 + 2.5*2.5)
(2.5, 2.5)
了,不是5的约3.54的幅度