三维空间中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 ...
随机推荐
- for 循环使用 enumerate 以及yield生成器简单例子
>>>seq = ['one', 'two', 'three'] >>> for i, element in enumerate(seq): ... print i ...
- index range scan,index fast full scan,index skip scan发生的条件
源链接:https://blog.csdn.net/robinson1988/article/details/4980611 index range scan(索引范围扫描): 1.对于unique ...
- iOS开发过程中易犯的小错误
addGestureRecognizer(_:) 一个手势对象只绑定一个view // 只有最后一个imgv有点击事件 let tap = UITapGestureRecognizer(target: ...
- vue watch关于对象内的属性监听
vue可以通过watch监听data内数据的变化.通常写法是: data: { a: 100 }, watch: { a(newval, oldVal) { // 做点什么... console.lo ...
- Java开发工程师基础Math,Random,Scanner类的使用
Math类的使用(重点) (1)数学操作类:该类没有构造函数,方法均为静态的 (2)掌握内容 A:成员变量 **E:比任何其他值都更接近e(即自然对数的底数)的double值. **PI:比任何其他值 ...
- muduo 网络库学习之路(一)
前提介绍: 本人是一名大三学生,主要使用C++开发,兴趣是高性能的服务器方面. 网络开发离不开网络库,所以今天开始学一个新的网络库,陈老师的muduo库 我参考的书籍就是陈老师自己关于muduo而编著 ...
- python3爬虫-下载网易云音乐,评论
# -*- coding: utf-8 -*- ''' 16位随机字符的字符串 参数一 获取歌曲下载地址 "{"ids":"[1361348080]" ...
- Linux下onvif客户端获取ipc摄像头 GetStreamUri:rtsp地址(h264、h265)
GetStreamUri:rtsp地址 鉴权:但是在使用这个接口之前是需要鉴权的.ONVIF协议规定,部分接口需要鉴权,部分接口不需要鉴权,在调用需要鉴权的接口时不使用鉴权,会导致接口调用失败.实现鉴 ...
- C语言学习笔记—code:blocks工具debug调试异常
C语言开发工具:code:bolocks17.12版本踩坑记录: 一.下载codeblocks后,安装完成,创建第一个项目在构建mian主函数时构建报错: Goto "Settings-&g ...
- MYSQL注入天书之盲注讲解
Background-2 盲注的讲解 何为盲注?盲注就是在sql注入过程中,sql语句执行的选择后,选择的数据不能回显到前端页面.此时,我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注.从ba ...