背景

背景:为锻炼代同学,老师给了她一个反向工程微信“跳一跳”小游戏的任务,希望做一个一样的出来。跳一跳中,有方块,有小人,小人站在方块上。

这个游戏的玩法是,用手指按住手机屏幕,松开手指小人飞出。随着屏幕按压时间的增加,跳跃距离也会增加。希望得到小人跳跃的曲线。

观察到游戏中的抛物线并不对称,猜测它是在三维空间建模投影到一个平面上的。看《交互式计算机图形学》(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.4082
t + 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平面上特定抛物线的正等测投影解析解的一种求法的更多相关文章

  1. 三维点集拟合:平面拟合、RANSAC、ICP算法

    ACM算法分类:http://www.kuqin.com/algorithm/20080229/4071.html 一: 拟合一个平面:使用SVD分解,代码里面去找吧 空间平面方程的一般表达式为: A ...

  2. Delphi接口的底层实现(接口在内存中仍然有其布局,它依附在对象的内存空间中,有汇编解释)——接口的内存结构图,简单清楚,深刻 good

    引言 接口是面向对象程序语言中一个很重要的元素,它被描述为一组服务的集合,对于客户端来说,我们关心的只是提供的服务,而不必关心服务是如何实现的:对于服务端的类来说,如果它想实现某种服务,实现与该服务相 ...

  3. 浅析Linux用户空间中的Mmap

    一.MMap基础概念 mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系.实现这样的映射关系后,进程就可以采 ...

  4. Oracle导入dmp备份文件到不同的表空间中

    原文链接:http://www.2cto.com/database/201211/171081.html 将DMP导入到不同的表空间中 1,用imp导出数据    cmd进入orcle安装目录bin下 ...

  5. POJ C程序设计进阶 编程题#4:寻找平面上的极大点

    编程题#4:寻找平面上的极大点 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描 ...

  6. COJN 0485 800503寻找平面上的极大点

    800503寻找平面上的极大点 难度级别:C: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 在一个平面上,如果有两个点(x,y),(a,b) ...

  7. uva10245-The Closest Pair Problem(平面上的点分治)

    解析:平面上的点分治,先递归得到左右子区间的最小值d,再处理改区间,肯定不会考虑哪些距离已经大于d的点对,对y坐标归并排序,然后从小到大开始枚举更新d,对于某个点,x轴方向只用考虑[x-d,x+d]( ...

  8. 平面上的地图搜索--Java学习笔记(四)

    版权声明: 本文由Faye_Zuo发布于http://www.cnblogs.com/zuofeiyi/, 本文可以被全部的转载或者部分使用,但请注明出处. 这一个月以来,都在学习平面上的地图搜索,主 ...

  9. 平面上给定n条线段,找出一个点,使这个点到这n条线段的距离和最小。

    题目:平面上给定n条线段,找出一个点,使这个点到这n条线段的距离和最小. 源码如下: #include <iostream> #include <string.h> #incl ...

随机推荐

  1. 权限管理系统---django版本

    权限管理:在简单的系统中,以往都是将每个权限赋予给用户,每个用户访问某个功能,通过查询db来判断用户是否有权限.但是如下情景不能够解决: 1.随着系统的复杂,权限较为复杂的时候,权限条目也多,系统角色 ...

  2. orcale字段

    ---数据类型 /* 1  数字 number [小数,整数] number(5,3)表示总共5个数字,小数点后3个,最大值99.999 number(5) 表示整数  最大值99999 2  字符 ...

  3. python logging模块日志回滚TimedRotatingFileHandler

    # coding=utf-8 import logging import time import os import logging.handlers import re def logger(app ...

  4. Python学习笔记系列——函数

    今年下半年的计划主要是Python和Mysql了,公司不方便看书和视频,就照着廖雪峰的Python网站开始看了.以下纯为个人笔记记录,若是想系统学习的小伙伴还是看这里的好一些,毕竟系统.https:/ ...

  5. atom / vscode (配置c++环境流程)

    最初主要是被这个炫酷的插件吸引了,这么打代码太特么有激情了 还有跳舞的初音姐姐哦!! 现附上一篇文章,这篇文章步骤讲得很详细了 http://blog.csdn.net/qq_36731677/art ...

  6. CentOS 7 在最小化安装之后进行安装Apache服务,httpd-2.4.34

    此博文是CentOS 7 在最小化安装之后进行安装Apache服务的操作步骤,httpd版本为httpd-2.4.34. 一.基本服务环境搭建 安装apache需要的基本环境:apr apr-util ...

  7. 创建表空间时ora-01119和ora-27040的处理

    创建时出错: SQL> create tablespace gaotbs logging datafile '/u01/app/datafiles/gaodata1.dbf'           ...

  8. python+soket实现 TCP 协议的客户/服务端中文(自动回复)聊天程序

    [吐槽] 网上的代码害死人,看着都写的言之凿凿,可运行就是有问题. 有些爱好代码.喜欢收藏代码的朋友,看到别人的代码就粘贴复制过来.可是起码你也试试运行看啊大哥 [正文] 昨日修改运行了UDP协议的C ...

  9. 4- 算法练习leetcode.com

    0.五大经典算法 动态规划算法----爬楼梯 分治算法-- 贪心算法---零钱问题 回溯算法---迷宫问题 --深度优先 分支限界法 ----广度优先 1.找出下标范围 1.二分法 li = [1,2 ...

  10. AngularJS中Directive指令系列 - bindToController属性的使用

    默认false.这个属性用来绑定scope的属性直接赋给controller.可以为true或者和scope相同格式的对象. 此外使用此属性,要设置controller的别名,通常通过"co ...