空间人物行走的向量实现(pku1835解题报告)

可以先看这道题目中的描述http://acm.pku.edu.cn/JudgeOnline/problem?id=1835

首先讨论数据结构。

由于我们的问题是在三维坐标下的,于是我们首先建立三维坐标下的数据结构三维向量类,为方便其运算同时封装它需要的运算。

第一个运算符*是向量的叉积,叉积的运算如右图所示,叉积不符合交换律。

第二个运算符*是向量的延长,这里主要用于产生位移向量。

第三个运算符+=是加上另一个向量。

对于空间内一个人, 比如航天员 astronaut, 他要完成前后左右转,那么就需要一个变量表示他的面朝哪边后文称面向量,他要完成上下转我们还需要知道哪个方向对他来说是上,于是我们还需要一个向量表示他的头朝哪边后文称为头向量,同时我们还必须一个向量来表示他在空间中的位置后文称位置向量。现在我们总共需要三个向量:面向量,头向量,位置向量。用f(face)h(head)pos(position)表示。

然后我们讨论基于这个数据结构完成的上下左右前后转动的算法。

前进不需要转动,后退只需要把面向量乘以-1即可。

下面讨论左右上下转动。 向量叉积

如图,假设a向量为头向量,b向量为面向量,那么我们可以发现a*b就是他左转以后的面向量,b*a就是他右转以后的面向量,而左右转的时候头向量是不变的。

向上与向下也很简单,向上转动以后,头朝着之前面向量相反的方向。面朝着之前的头的方向。

向下转动,头朝着之前的面向量,面朝着之前头向量的相反方向。程序实现的时候要注意转之前与转之后变量的变化与使用。

转动完了以后就讨论行走了。

由于面向量使用单位向量,于是转动以后的行走多少单位就是面向量乘以多少,这个叫做位移向量,位置向量加上位移向量就完成了一次行走了。

这里注意产生位移向量的时候要保证面向量是单位向量,由于这道题的转动都是直角转动,且面向量与头向量垂直,所以叉乘以后的向量模|a||b|sin90还是1可以直接拿来用

下面是行走的算法,cmd表示指令,m表示距离。astronaut是people类的全局变量,在people类的定义后声明过了。

我这里为方便起见使用了右手螺旋坐标,而题目上是左手螺旋坐标,在输出时需要简单处理一下,只需改变一下y轴符号即可,下面是main函数。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值