三维空间中xoy平面上特定抛物线的正等测投影解析解的一种求法
背景
背景:为锻炼代同学,老师给了她一个反向工程微信“跳一跳”小游戏的任务,希望做一个一样的出来。跳一跳中,有方块,有小人,小人站在方块上。
这个游戏的玩法是,用手指按住手机屏幕,松开手指小人飞出。随着屏幕按压时间的增加,跳跃距离也会增加。希望得到小人跳跃的曲线。
观察到游戏中的抛物线并不对称,猜测它是在三维空间建模投影到一个平面上的。看《交互式计算机图形学》(Edward Angel,交互式计算机图形学,电子工业出版社,2012.5,p141)中,正等测(正等测等价于等轴测)的例子(图一)和跳一跳游戏中方块(图二)很相似(感谢代同学提供图片),猜测它使用的是三维空间正等测投影到二维平面上的投影。假设跳一跳的方块是由三维直角坐标系下的方块做正等测投影得到的,观察跳一跳方块中朝向我们的角,三个角都是120度,这和正等测的定义相符合。
图一
图二
解析解是什么
此前我的文章中讲了数值解的求法,按顺序给出了几百个点作为抛物线的采样,但有了解析式(参数方程也是一种解析式),就可以通过在公式中代入参数来求得坐标,而且可以求得精确的坐标(数值解并不精确)。比如,y=x^2精确的描述了一条抛物线。
一段题外话
与张慧杰老师讨论了计算机图形学opengl库的本质。都是矢量图形,用矩阵运算可以实现各种变换,光栅化后得到点。屏幕是一个一个的像素点,矢量图形要变成像素点才能显示在屏幕上。
矩阵与坐标变换
在计算机图形学中,三维的点用四维齐次坐标表示。点的投影,可以通过点左乘一个变换矩阵来实现。正等测的变换矩阵是:

将抛物线y=x^2表示为参数方程形式。
x=t
y=t^2
z=0
观察该参数方程知,该抛物线可看作齐次坐标下点(t,t^2,0,1),其中t为实数。
点乘以变换矩阵,得到变换后的点。
结果为:
x = 0.7071 t - 0.7071 t^2
y = 0
z = -0.4082 t - 0.4082 t^2
于是
x = 0.7071 t - 0.7071 t^2
y = 0
z = -0.4082 t - 0.4082 t^2
就是三维空间中抛物线y=x^2正等测投影后的抛物线参数方程。
在跳一跳游戏的三维空间中,如图1…. 
所示的抛物线的隐函数表达式是z=(100-(x-10)(x-10))/10(0<x<=20)
这条抛物线的参数方程为
x=-i
z=(100-(i-10)(i-10))/10(0<i<=20)
正等测变换过程就是矩阵乘法,将(x,y,z,i)左乘正等测投影矩阵,得到变换后的参数方程。
变换后的参数方程为
x=0.7071t
y=-0.4082t+0.8165(100-(t-10)(t-10))/10 (0<t<=20)
正等测变换后的抛物线如图2所示
在研发中的应用
在跳一跳游戏中,代秋彤同学调用由代秋彤同学提供的函数,抛物线数组 foo(起始点坐标,x的系数)。采样数量事先约定为采样共八个点。x是平面中抛物线的二次项。
由起始点坐标、x的系数可以确定抛物线。
根据平移变换,把抛物线的起点平移到起始点坐标。根据伸缩变换,改变投影前的抛物线的x的系数,抛物线将被拉长。我们观察到,跳一跳小游戏中不管抛物线多长,其高度不变。于是我们只拉长/缩短抛物线,这样符合我们观察到的现象。
应用示例
如,根据如图3所示的抛物线,代秋彤同学传来起始坐标(62,221)和x的系数1/2
隐函数方程:
z(x)=100 - (x/2-10)*(x/2-10))/2
参数方程:
x=t
z=100 - (t/2-10)*(t/2-10))/2
正等测变换后的参数方程:
x = 0.7071t
z = -0.4082t + 0.8165(100 - (t/2-10)(t/2-10))/2
平移:
x = 0.7071t-14.1422
z = -0.4082t + 0.8165(100 - (t/2-10)(t/2-10))/2+8.1642
根据采样间隔得到采样点:
(65,221) (65,199) (69,187) (72,176) (77,172) (81,176) (86,187) (90,205)
根据采样点,我们可以用小人在屏幕上画出曲线。
感谢小霞给出写作意见。
感谢刘典老师,没有他我们还在错误的路线上继续。
感谢代同学与我讨论、帮助我给出数据。
三维空间中xoy平面上特定抛物线的正等测投影解析解的一种求法的更多相关文章
- 三维点集拟合:平面拟合、RANSAC、ICP算法
		
ACM算法分类:http://www.kuqin.com/algorithm/20080229/4071.html 一: 拟合一个平面:使用SVD分解,代码里面去找吧 空间平面方程的一般表达式为: A ...
 - Delphi接口的底层实现(接口在内存中仍然有其布局,它依附在对象的内存空间中,有汇编解释)——接口的内存结构图,简单清楚,深刻 good
		
引言 接口是面向对象程序语言中一个很重要的元素,它被描述为一组服务的集合,对于客户端来说,我们关心的只是提供的服务,而不必关心服务是如何实现的:对于服务端的类来说,如果它想实现某种服务,实现与该服务相 ...
 - 浅析Linux用户空间中的Mmap
		
一.MMap基础概念 mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系.实现这样的映射关系后,进程就可以采 ...
 - Oracle导入dmp备份文件到不同的表空间中
		
原文链接:http://www.2cto.com/database/201211/171081.html 将DMP导入到不同的表空间中 1,用imp导出数据 cmd进入orcle安装目录bin下 ...
 - POJ C程序设计进阶  编程题#4:寻找平面上的极大点
		
编程题#4:寻找平面上的极大点 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描 ...
 - COJN 0485 800503寻找平面上的极大点
		
800503寻找平面上的极大点 难度级别:C: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 在一个平面上,如果有两个点(x,y),(a,b) ...
 - uva10245-The Closest Pair Problem(平面上的点分治)
		
解析:平面上的点分治,先递归得到左右子区间的最小值d,再处理改区间,肯定不会考虑哪些距离已经大于d的点对,对y坐标归并排序,然后从小到大开始枚举更新d,对于某个点,x轴方向只用考虑[x-d,x+d]( ...
 - 平面上的地图搜索--Java学习笔记(四)
		
版权声明: 本文由Faye_Zuo发布于http://www.cnblogs.com/zuofeiyi/, 本文可以被全部的转载或者部分使用,但请注明出处. 这一个月以来,都在学习平面上的地图搜索,主 ...
 - 平面上给定n条线段,找出一个点,使这个点到这n条线段的距离和最小。
		
题目:平面上给定n条线段,找出一个点,使这个点到这n条线段的距离和最小. 源码如下: #include <iostream> #include <string.h> #incl ...
 
随机推荐
- 【转】tomcat搭建本地服务器 实现apk更新下载
			
转自:http://www.kankanews.com/ICkengine/archives/121748.shtml 做apk的更新下载功能,测试的时候需要个服务器. 所以就选用 Apache To ...
 - 记一次异机rman还原后的操作
			
当时从主库通过rman备份到目前测试库还原之后,由于备份是在备库备份的,所以数据库还原后状态为readonly,standby_file_management参数为auto.首先需要通过alter d ...
 - SAP函数PREPARE_STRING:提取字符串中的数字
			
今天调整一个同事的需求时,要计算一个含税金额.报表内已经取到税率,但存在的形式是字符串格式:16%. 正好SAP内有一个标准函数:PREPARE_STRING 可以处理字符串,将特别标志替换为有效标志 ...
 - React-Native项目中使用Redux
			
前言 网上别人的文档都是 直接 就是上redux redux-thunk react-redux ,immutable这样的一套,这个有经验的看还行,新手看就很吃力了,需要了解一步一步的安装redux ...
 - Scala的文件读写操作与正则表达式
			
目录 在本篇博客中你将会学习并了解常用的文件处理任务,例如读取文件的一行文本,本博客的要点包含: Source.fromFile(...).getLines.toArray 输出文件所有行 Sourc ...
 - RMAN 与control文件的关系
			
试验: SQL> oradebug setmypid;Statement processed.SQL> 接着,进行backup: RMAN> list backup; using t ...
 - 远心镜头(Telecentric lens)原理介绍
			
远心镜头(Telecentric lens)原理介绍 远心镜头(Telecentric lens),是为纠正传统镜头视差而设计,它可以在一定的物距范围内,使得到的图像放大倍率不会变化,简单的说这种镜头 ...
 - 在CMD 中,如何切换python2.x 版本 和 python3.x版本?
			
1.cmd中输入python,启动python2.x版本,如何切换呢? 2.找到python2.x安装路径,修改python.exe名称为:python27.exe 3. 打开cmd,输入python ...
 - zhengruioi 470 区间
			
区间 链接 题意:给定n个区间[li,ri].你可以选出任意一些区间,设选出的区间个数是s,[l,r]是这些区间的交,求min(s,r-l+1)的最大值. N≤3×105 分析:首先按照左端点排序,然 ...
 - AGC 030 B - Tree Burning
			
B - Tree Burning 链接 题意: 一个长度为L的环,有n个位置上有树,从0出发,每次选择一个方向(顺时针或者逆时针),一直走,直到走到一棵树的位置,烧掉这棵树,重复这个过程,直到没有树. ...