两点生成曲线_两点曲线运动轨迹-程序员宅基地

技术标签: 经历体会  

引言:

看了标题的人可能会有这样的反应:两点不是能确定无限条曲线吗,这不是扯淡吗。。其实现在的需求是这样的:在一个游戏里,我们需要根据起点和落点生成一条看上去合理的曲线运动轨迹。在我的想象中,它至少应该是往近处抛弧度小,往远处抛弧度大的这样一个表现。于是我设计了如下曲线生成方案,给游戏客户端那边去用。


算法如下:

1.通过起点终点,算出两点距离。用这个距离根据配置换算出一个圆心角a
2.用起点,终点,圆心角a确定一个圆o,取o与通过中点((起点+终点)/2)的竖线的上方的交点,作为参考点
3.用起点,终点,参考点生成曲线(矩阵,拉格朗日插值,高斯消元都行)
4.算法示意图
算法示意图


算法解析:

首先两点是无法确定曲线的,这时候需要引入第三个点,这个第三个点的表现直接影响到曲线的轨迹表现,所以我在设计的时候将输入的起点终点放到一个圆上,然后第三个点在两点构成的弧上取,这样我可以通过控制圆的大小来间接控制曲线的弧度。
然后圆的大小怎么控制呢,两点距离固定了,我们可以控制两点和圆心连线构成的圆心角大小来控制。所以我设计的转换方式是:

max_distance = 100.0
angle = [30, 160]
def getAngle(distance):
    return (1 - distance / max_distance) * (angle[1] - angle[0]) + angle[0]

给定配置一个最远距离和圆心角范围,距离越远,圆心角越小,这样出来的参考点就离起点终点连线的线段越远。最终表现出来曲线更陡峭,而且这个程度也能通过最远距离和圆心角范围手动调参。
接下来,为什么我要取过中点的直线和圆的交点作为参考点呢。这是因为为了防止出现曲线往一定倾斜角度歪(事后想想是多余的,因为后面我用拉格朗日插值求抛物线方程,既然能求出来,那肯定不会出现歪的,毕竟这是函数的定义,一个x对应一个y)
接下来,我们有三个点了,我们就能选择拟合的函数模型了,我最初其实是选择了抛物线的,考虑问题都以抛物线来考虑。但是在写blog的时候才发现一些逻辑上的BUG,这个放后面总结。最简洁的姿势肯定是用矩阵求y=a*x^2+b*x+c里的abc,其次是用拉格朗日插值求(写起来相对复杂,运算量也相对大一点点,但是不需要矩阵运算支持,只需要基础的四则运算,移植性强),再者就是直接推出a,b,c关于三个点的式子。综合考虑下来,我选择的是拉格朗日插值法。

具体代码:

为了快速验证我的想法,我用py一边查API一边把我的想法实现了出来,代码如下:

# coding=utf-8#
import matplotlib as mpl
from mpl_toolkits.mplot3d import Axes3D
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_24328101/article/details/79133366

智能推荐

Linux基础入门_linux license agreement-程序员宅基地

文章浏览阅读251次。Linux基础入门及安装虚拟机、操作系统_linux license agreement

uniapp - 实现日期选择器(年月日)组件,兼容 H5、App、小程序,提供组件源码可直接复制运行!_uni-app封装日期时间选择器-程序员宅基地

文章浏览阅读4.8k次,点赞3次,收藏3次。uniapp日期选择器,uniapp兼容h5小程序app的年月日选择器功能组件,uniapp日期选择组件插件源码,uniapp日期选择弹框示例代码,uniapp年月日的日期选择器组件,uniapp日期选择器(年月日),Uniapp实现了日期选择器,uniapp实现日期选择效果,uni-app 自定义选择日期,uniapp实现日期的选择,uni-app中组件picker的日期选择器,uniapp里怎么做日期选择功能,uniapp如何实现选择日期的弹框,uniapp不引组件库怎么实现日期选择,uniapp日期组_uni-app封装日期时间选择器

ACE2005语料库文件格式及内容解析_ace05-程序员宅基地

文章浏览阅读1.6k次。前提ACE2005语料库是语言数据联盟(LDC)发布的由实体,关系和事件注释组成的各种类型的数据,包括英语,阿拉伯语和中文培训数据,目标是开发自动内容提取技术,支持以文本形式自动处理人类语言。ACE语料解决了五个子任务的识别:entities、values、temporal expressions、relations and events。这些任务要求系统处理文档中的语言数据,然后为每个文档输出有关其中提到或讨论的实体,值,时间表达式,关系和事件的信息。ACE语料库的获取链接:https://cata_ace05

yolov3训练自己的数据_windows yolov3训练自己的数据-程序员宅基地

文章浏览阅读878次,点赞3次,收藏4次。谈谈如何实现用yolov3训练自己的数据前言:早就听说yolov3算法识别率高,“快如闪电,可称目标检测之光”,最近在研究yolov3算法,动手训练了自己的数据集,其间出现很多问题,所以写下这篇博客记录一下。一.编译源码并运行demo运行demo的话,我主要是采用YunYang1994的代码,github上的代码链接为:https://github.com/YunYang1994/tens..._windows yolov3训练自己的数据

人工智能AI系列 - 问答系统_ai人工智能问答-程序员宅基地

文章浏览阅读1w次,点赞3次,收藏18次。目录:http://aias.top/问答系统问答系统(Question Answering System, QA)是信息检索系统的一种高级形式,它能用准确、简洁的自然语言回答用户用自然语言提出的问题。其研究兴起的主要原因是人们对快速、准确地获取信息的需求。问答系统是人工智能和自然语言处理领域中一个倍受关注并具有广泛发展前景的研究方向。文本搜索引擎本例子基于文本搜索引擎,支持上传csv文件,使用句向量模型提取特征,并基于milvus向量引擎进行后续检索。主要特性底层使用特征向_ai人工智能问答

Ubuntu16.04中caffe-ssd(GPU版)训练自己的数据并测试模型-程序员宅基地

文章浏览阅读2.8k次。注意:首先你安装了ssd,并测试了VOC数据。一、labelImg的安装目标检测中,原始图片的标注过程是非常重要的,它的作用是在原始图像中标注目标物体位置并对每张图片生成相应的xml文件表示目标标准框的位置。labelImg 是一种能够标注多类别并能直接生成xml文件的标注工具。1、下载LabelImg下载地址:https://github.com/tzutalin/labelImg下载...

随便推点

IDEA 当前项目jdk版本查看_idea查看项目jdk版本-程序员宅基地

文章浏览阅读8.2k次,点赞3次,收藏2次。File->Project Structure->project->SDKmaven打包JDKFile->Settings->runner->jreFile->Settings->Importing->jdk_idea查看项目jdk版本

Chrome等浏览器下出现net::ERR_BLOCKED_BY_CLIENT的解决办法-程序员宅基地

文章浏览阅读1.1w次,点赞4次,收藏2次。1.在开发过程中,打开网页的调试检查页面,有时候我们会看到 net::ERR_BLOCKED_BY_CLIENT这样的错误。2.这种情况是因为我们在浏览器扩展中安装了广告过滤插件,关闭广告过滤插件即可。3.关闭后结果..._net::err_blocked_by_client

ubuntu20.04——hdaudioC0D2: unable to bind the codec-程序员宅基地

文章浏览阅读1.1w次,点赞3次,收藏48次。问题不久前尝试双系统,win10+ubuntu20.04,安装比较顺利,能够正常进入系统。但是,当我更新了显卡驱动后(专有 nvidia-drivers-390),重启就无法进入系统的图形界面,一直卡在下面这个页面。如下图:解决之后,选择ubunru 高级选项,选择低版本的内核启动,却可以进入图形界面。但是,这样让我很不爽。。。最后,我找到某位大佬说进入/etc/default/grub编辑:可以使用低版本的内核启动图形界面进入编辑,也可以 Ctr+Alt+F2 进入命令行编辑;# 原_unable to bind the codec

关于 PHP 8.1 的 Fiber RFC_php8.1-http-程序员宅基地

文章浏览阅读2.5k次,点赞6次,收藏7次。最新的 PHP 8.1 增加了一个 Fiber 的提案,最近讨论的比较多。有不少好事者拿来说事儿,说是 “Fiber 进入内核之后,Swoole 的使用者就大幅减少“实际上 Fiber 扩展进入内核后,由于它是一个非常底层的 API ,并不是直接可以使用的技术,不会对 Swoole 产生影响。真正和 Swoole 竞争的是应该是 Amphp 、ReactPHP 。Fiber 反而对 Swoole 是有好处的,PHP 内核开发者维护了协程切换的全局状态列表,Swoole PHPCoroutine 这部分的代_php8.1-http

ElasticSearch-2_duplicate field 'cluster.initial_master_nodes-程序员宅基地

文章浏览阅读1.1k次。ElasticSearch环境1.集群Cluster一个 Elasticsearch 集群有一个唯一的名字标识,这个名字默认就是”elasticsearch”。这个名字是重要的,因为一个节点只能通过指定某个集群的名字,来加入这个集群。2.节点Node集群中包含很多服务器,一个节点就是其中的一个服务器。作为集群的一部分,它存储数据,参与集群的索引和搜索功能。一个节点也是由一个名字来标识的,默认情况下,这个名字是一个随机的漫威漫画角色的名字,这个名字会在启动的时候赋予节点。这个名字对于管理工_duplicate field 'cluster.initial_master_nodes

SDUTACM 数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历_山东理工大学acm基于邻接矩阵的广度优先搜索遍历-程序员宅基地

文章浏览阅读539次。题目描述给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索(BFS)遍历,输出从某个顶点出发的遍历序列。(同一个结点的同层邻接点,节点编号小的优先遍历)输入输入第一行为整数n(0对于每组数据,第一行是三个整数k,m,t(0<k<100,0<m<(k-1)*k/2,0< t<k),表示有m条边,k个顶点,t为遍历的起始顶点。下面的m行,每行是空格隔开的两个整数u,v,表示一_山东理工大学acm基于邻接矩阵的广度优先搜索遍历