椭圆数学知识

首先椭圆一开始是有一个公式的

S=π(圆周率)×a×b(其中a,b分别是椭圆的半长轴,半短轴的长).或S=π(圆周率)×A×B/4(其中A,B分别是椭圆的长轴,短轴的长).

c1c2clone可以依据关于圆的有关公式,类比出关于椭圆公式.

这个公式是面积公式的,周长公式没有精确计算的公式,该公式就是百度来的借鉴一下。

椭圆那就有一个长半轴和短半轴根据椭圆第一定义,用a表示椭圆长半轴的长,b表示椭圆短半轴的长,且a>b>0。

椭圆周长公式:L=2πb+4(a-b)

椭圆周长定理:椭圆的周长等于该椭圆短半轴长为半径的圆周长(2πb)加上四倍的该椭圆长半轴长(a)与短半轴长(b)的差。

椭圆的参数方程: x=acosθ , y=bsinθ  (θ为参数)

这里主要是用了椭圆的一个“参数方程”,还有很多就不一一介绍了百度很多都有的。。。。。。。。。。。。。。等等

a是椭圆的长半轴,b是椭圆的短半轴。 o是角度,范围是[0, 2π]。(注:自己画的画好还请见谅)

------------头文件设定------------

#ifndef __SP__OvalAction__  
#define __SP__OvalAction__

/*
   x=acosθ , y=bsinθ  (θ为参数)
*/

#include "cocos2d.h"  
定义一个结构来包含确定椭圆的参数 
typedef struct OvalConfig {
//中心坐标
cocos2d::Vec2 centerPos;
//长半径
float a;
//短半径
float b;
//是否逆时针运动
bool moveClockDir;
//层级设置
std::pair<int, int> zOrder;
}LOvalConfig;

//椭圆的运动
class MoveOvalBy : public cocos2d::ActionInterval {
public:
MoveOvalBy();
~MoveOvalBy();
//动作持续时间 和 椭圆控制参数 初始化动作
bool initWithDuration(float dt, const OvalConfig& c);
virtual MoveOvalBy* clone() const override;
virtual MoveOvalBy* reverse() const override;
virtual void update(float dt);//运用Update函数来进行不断的坐标设定
virtual void startWithTarget(cocos2d::Node *target) override;
public:
//动作持续时间 和 椭圆控制参数 初始化动作
static MoveOvalBy* create(float dt, const OvalConfig& c);

protected:
OvalConfig _config;
//x = a * cos(t)  t = [0, 2π] 
//当期那返回一个X坐标,,,,运用的是一个参数方程
inline float getPosXAtOval(float dt) {
if (_config.moveClockDir) {
return _config.a * cos(4 * MATH_PIOVER2 * dt);
}
return _config.a * cos(4 * MATH_PIOVER2 * (1 - dt));
}
//y = b * sin(t)  t = [0, 2π] 
//当期那返回一个Y坐标,,,,运用的是一个参数方程
inline float getPosYAtOval(float dt) {
if (_config.moveClockDir) {
return _config.b * sin(4 * MATH_PIOVER2 * dt);
}
return _config.b * sin(4 * MATH_PIOVER2 * (1 - dt));
}

};

#endif

---------------------------Cpp文件---------------------

#include "OvalActionInterval.h"

USING_NS_CC;

MoveOvalBy::MoveOvalBy()
{

}

MoveOvalBy::~MoveOvalBy()
{

}
//利用定义的椭圆的参数初始化椭圆
MoveOvalBy *MoveOvalBy::create(float dt, const OvalConfig &c)
{
auto moveOvalBy = new MoveOvalBy();
if (moveOvalBy && moveOvalBy->initWithDuration(dt, c))
{
moveOvalBy->autorelease();
return moveOvalBy;
}

return nullptr;
}

bool MoveOvalBy::initWithDuration(float dt, const OvalConfig &c)
{
if (ActionInterval::initWithDuration(dt))
{
_config = c;
return true;
}

return false;
}

void MoveOvalBy::update(float dt)
{
//用之前的坐标计算函数计算坐标
//由于需要画计算出的椭圆做值是以原点为中心的,所以需要加上我们设定的中心点坐标

if (_target)
{
float x = getPosXAtOval(dt);
float y = getPosYAtOval(dt);
_target->setPosition(_config.centerPos + Vec2(x, y));

if (dt <= 0.5)
{
_target->setZOrder(_config.zOrder.first);
}
else
{
_target->setZOrder(_config.zOrder.second);
}
}
}

MoveOvalBy *MoveOvalBy::clone() const
{
auto moveOvalBy = new MoveOvalBy();
if (moveOvalBy && moveOvalBy->initWithDuration(_duration, _config))
{
moveOvalBy->autorelease();
return moveOvalBy;
}

return nullptr;
}

MoveOvalBy *MoveOvalBy::reverse() const
{
OvalConfig newConfig;
newConfig.a = _config.a;
newConfig.b = _config.b;
newConfig.centerPos = _config.centerPos;
newConfig.moveClockDir = !_config.moveClockDir;
newConfig.zOrder = _config.zOrder;
return MoveOvalBy::create(_duration, newConfig);
}

void MoveOvalBy::startWithTarget(Node *target)
{
ActionInterval::startWithTarget(target);
}

---------------------------------------------------------------------运用

//调用方式
auto visibleSize = Director::getInstance()->getVisibleSize();
auto s1 = Sprite::create("CloseSelected.png");
addChild(s1);
s1->setPosition(Vec2(visibleSize.width / 2, visibleSize.height / 2));
auto s2 = Sprite::create("CloseNormal.png");
addChild(s2);

OvalConfig c;
c.a = 100;
c.b = 60;
c.centerPos = s1->getPosition();

c.moveClockDir = false;
c.zOrder.first = -1;
c.zOrder.second = 1;
s2->runAction(RepeatForever::create(MoveOvalBy::create(1.0f, c)));

----------------

代码也是借鉴几位前辈的,如果多有冒犯还请见谅,第一次写。

写这个也主要是面试的时候被问到的一个这么个问题,谨记!!!!!

cocos2dx3.0关于实现椭圆运动相关推荐

  1. 在Windows环境下编译cocos2d-x-3.0

    1. 安装配置开发环境 1.1 安装JDK 1) 下载并安装jdk-7u7-windows-i586.exe     2) 设置[JAVA_HOME]为"C:\Program Files\J ...

  2. Cocos2d-x3.0游戏实例《不要救我》第一章——前言

    我们可以学习? 这是一个非常easy游戏.但更多的东西用(对于初学者).至少,对于它的一个例子,有点多. 笨木头花心贡献.啥?花心?不呢.是用心~ 转载请注明,原文地址:http://www.benm ...

  3. Cocos2d-x3.0游戏实例《不要救我》第十篇(结束)——使用Json配置数据类型的怪物...

    如今我们有2种类型的怪物,并且创建的时候是写死在代码里的,这是要作死的节奏~ 所以.必须可配置.不然会累死人的. 笨木头花心贡献,啥?花心?不呢,是用心~ 转载请注明,原文地址: http://www ...

  4. 利用 Cocos2dx-3.0 新物理特性模拟弹珠迷宫

    本文转自:http://segmentfault.com/a/1190000000393216 前言 看到这张图,不知道你会不会想到些什么?儿时的玩物,满满的童年的味道.那时候没有太多玩具,这些小玩意 ...

  5. 如何使用cocos2dx3.0制作基于tilemap的游戏:第二部分

    引言 程序截图: 这篇教程是<如何使用cocos2dx3.0制作基于tilemap的游戏>的第二部分.在上一个教程中,我们创建了一个简单的基于tiled地图的游戏,里面有一个忍者在沙漠里寻 ...

  6. cocos2dx-3.0 环境安装

    这里我只是简单写下如何在wondows下运行例程. 环境要求: windows cocos-2dx-3.0(http://www.cocos2d-x.org/download) Visual Stdu ...

  7. Cocos2d-x3.0游戏实例《别救我》目录导航(共10篇,已完结)

    这个5.1假期还真不错,有个小惊喜,那就是,我某个游戏今天的下载量爆表了,突破历史最高点~! 于是,我决定写一个新的游戏实例教程,以示庆祝~ 啊才怪啊~!这教程5.1之前就在写了,我还因此暂停了差不多 ...

  8. 在cocos2d-x3.0里面如何使用物理引擎:弹球

    前言 程序截图: 这个教程的目的就是让你们熟悉在cocos2d-x3.0里面如何使用新版的物理引擎,所采用的例子就是制作一个简单的应用,里面有一个篮球,你可以通过旋转你的手机来改变重力的方向,同时篮球 ...

  9. Cocos2d-x3.0游戏实例之《别救我》第八篇——TiledMap实现关卡编辑器

    好吧,我真心全然搞不懂.我如今仅仅只是是写了3个类而已.怎么就已经到第八篇了?我感觉我说话已经够简单明了毫不唠叨了,真是奇怪.(小若:我噗.噗噗.) 好吧,既然如今主角已经能出现而且进行操作了.那,也 ...

  10. Cocos2d-x3.0游戏实例之《别救我》第十篇(完结)——用Json配置各类型怪物数据

    现在我们有2种类型的怪物,而且创建的时候是写死在代码里的,这是要作死的节奏~ 所以,必须可配置,不然会累死人的. 笨木头花心贡献,啥?花心?不呢,是用心~ 转载请注明,原文地址: http://www ...

最新文章

  1. 【Qt】QImage使用总结
  2. 基于fedora23的karora23初始版本安装crt信赖libpng升级glibc造成系统无法进入...
  3. 写个测试程序测试下,单片机使用浮点型数效率有多低
  4. linux 之RAID详解
  5. tomcat虚拟目录和虚拟主机等相关配置
  6. 6410 实现 linux 串口驱动详解
  7. javascript 对象的设计模式
  8. 2016年3-8,哦,好日子
  9. 补充“为什么Scrum不行”
  10. Linux软件包管理之源码包、脚本安装包
  11. 5.3 Seq2seq与 Attention的结合:原理与计算过程
  12. 初次使用dcm4che-tool-findscu做查询
  13. 图解大数据 | 大数据分析挖掘-Spark初步
  14. 15个数据可视化的绝妙案例
  15. EBS中的销售员SQL
  16. mc无可用java_新人求助,MC无法打开,内存java均无问题
  17. 算法训练 4-2找公倍数
  18. 多个excel工作簿、工作表合并
  19. android画布裁剪圆角,Android 视图圆角化处理方案
  20. 国内最全的Android市场,最全Android软件商店

热门文章

  1. 安卓原生系统_有效解决跳过原生安卓系统开机验证问题的方法,赶快上车
  2. 修改Android手机的分辨率和屏幕密度
  3. PHP获取当前完整网址加HTTP/HTTPS
  4. ESP32学习10:TcpClient
  5. 模型笔记1---3d max 导入obj模型设置
  6. CentOS加入Windows域
  7. 山东大学软件学院《数据仓库与数据挖掘》复习知识点
  8. 装系统缺少硬盘驱动_缺少操作系统-向我学习,请在今年备份您的硬盘!
  9. java 异或_Java异或详解
  10. java 抓取搜狗微信_大虾们,求帮助……用httpclient 进行获取微信搜狗公众号文章问题...