背景

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

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

观察到游戏中的抛物线并不对称,猜测它是在三维空间建模投影到一个平面上的。看《交互式计算机图形学》(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. oracle 基本知识点

    //创建临时表空间create temporary tablespace test_temp tempfile 'E:\oracle\product\10.2.0\oradata\testserver ...

  2. cpu 基础知识

    认识cpu(中央处理器简称处理器)也叫CPU,Central Processing Unit线程是安排CPU执行的最小单位 四核八线程内涵: 每个单位时间内,一个CPU只能处理一个线程(操作系统:th ...

  3. Linux下如何查看分区文件系统类型

    1,fdisk -l fdisk -l 只能列出硬盘的分区表.容量大小以及分区类型,但看不到文件系统类型. 2,df -h df 命令是用来查看文件系统磁盘空间使用量的.但df 命令只会列出已挂载的文 ...

  4. Oracle 创建函数

    Oracle创建函数的方法如下: CREATE OR REPLACE FUNCTION FunctionName ( --传入参数 para NCHAR ) RETURN NUMBER IS --函数 ...

  5. Delphi - SPcomm 控件使用

    Com口函数 自动获取Com口,函数列表 procedure EnumComPorts(Ports: TStrings); //自动获取com口函数 var KeyHandle: HKEY; ErrC ...

  6. rails框架配置

    rails框架默认有三个模式development(开发),production(上线),test(测试) Development config.cache_classes = false 每次请求都 ...

  7. lua通用数据类型

    TValue结构 TValue这个结构体是Lua的通用结构体,,Lua中的所有的数据都可以使用这个结构体来表示.很容易想到,在面向对象中,这个结构体是一个基类,派生出来的都是其他的子类. TValue ...

  8. SVG Animation

    原文:http://tutorials.jenkov.com/svg/index.html http://tutorials.jenkov.com/svg/svg-animation.html SVG ...

  9. 很详细的SpringBoot整合UEditor教程

    很详细的SpringBoot整合UEditor教程 2017年04月10日 20:27:21 小宝2333 阅读数:21529    版权声明:本文为博主原创文章,未经博主允许不得转载. https: ...

  10. asp.net core发布到docker报Microsoft.ApplicationInsights.AspNetCore miss的错误

    dotnet core 2.1的asp.net core在docker下部署的时候发生下面的错误. Error: An assembly specified in the application de ...