spline曲线使用
spline曲线绘制
导入头文件 CELLMath.hpp
1.初始化spline对象 定义几个关键点 根据时间t插值 获得点集合
2.进行绘制
#include <math.h>
#include "CELLMath.hpp"
#include "OpenGLWindow.h"
#include <vector>using namespace CELL;class SamplerSpline :public OpenGLWindow
{public:std::vector<float3> _array;tspline<float> _spline;SamplerSpline(){_spline.addPoint(float3(10,10,0));_spline.addPoint(float3(20,100,0));_spline.addPoint(float3(100,80,0));_spline.addPoint(float3(200,100,0));_spline.addPoint(float3(300,10,0));_spline.addPoint(float3(400,150,0));for(float t=0;t<1.0f;t+=0.01f){float3 pos = _spline.interpolate(t);_array.push_back(pos);}}virtual void render(){#define M_PI (3.14159265358979323846)//! 指定以下的操作针对投影矩阵glMatrixMode(GL_PROJECTION);//! 将投影举证清空成单位矩阵glLoadIdentity();glOrtho(0,_width,_height,0,-100,100);glEnableClientState(GL_VERTEX_ARRAY);glVertexPointer(3,GL_FLOAT,sizeof(float3),&_array[0]);glDrawArrays(GL_LINE_STRIP,0,_array.size()); }
};int __stdcall WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{SamplerSpline instance;instance.main(800,600);return 0;
}
spline曲线编辑
1.画出关键点
2.重写鼠标监听事件 处理点击之后 对曲线的重新计算
#include <windows.h>
#include <tchar.h>
#include <math.h>
#include "CELLMath.hpp"
#include "OpenGLWindow.h"
#include <vector>using namespace CELL;class SamplerSplineEditor :public OpenGLWindow
{public:std::vector<float3> _array;std::vector<float3> _keys;tspline<float> _spline;bool _isButtonDown;size_t _selectIndex;POINT _mouseOld;SamplerSplineEditor(){_isButtonDown = false;_selectIndex = -1;_spline.addPoint(float3(10,10,0));_spline.addPoint(float3(20,100,0));_spline.addPoint(float3(100,80,0));_spline.addPoint(float3(200,100,0));_spline.addPoint(float3(300,10,0));_spline.addPoint(float3(400,150,0));for(float t=0;t<1.0f;t+=0.01f){float3 pos = _spline.interpolate(t);_array.push_back(pos);}for(int i=0;i<_spline.getNumPoints();++i){_keys.push_back(_spline.getPoint(i));}}virtual void render(){#define M_PI (3.14159265358979323846)//! 指定以下的操作针对投影矩阵glMatrixMode(GL_PROJECTION);//! 将投影举证清空成单位矩阵glLoadIdentity();glOrtho(0,_width,_height,0,-100,100);glEnableClientState(GL_VERTEX_ARRAY);glVertexPointer(3,GL_FLOAT,sizeof(float3),&_array[0]);glDrawArrays(GL_LINE_STRIP,0,_array.size()); glPointSize(8);glVertexPointer(3,GL_FLOAT,sizeof(float3),&_keys[0]);glDrawArrays(GL_POINTS,0,_keys.size());}virtual LRESULT events(HWND hWnd,UINT msgId, WPARAM wParam, LPARAM lParam){switch(msgId){case WM_CLOSE:case WM_DESTROY:{PostQuitMessage(0);}break;case WM_LBUTTONDOWN:{_isButtonDown = true;_selectIndex = -1;POINT pt = {LOWORD(lParam),HIWORD(lParam)};_mouseOld = pt;for (size_t i = 0 ;i< _keys.size() ; ++ i){RECT rt;rt.left = _keys[i].x - 4;rt.right = _keys[i].x + 4;rt.top = _keys[i].y - 4;rt.bottom = _keys[i].y + 4;if (PtInRect(&rt,pt)){_selectIndex = i;break;}}}break;case WM_LBUTTONUP:{_isButtonDown = false;_selectIndex = -1;}break;case WM_MOUSEMOVE:{if (_isButtonDown && _selectIndex != -1){POINT pt = {LOWORD(lParam),HIWORD(lParam)};POINT off = { pt.x - _mouseOld.x,pt.y - _mouseOld.y};_mouseOld = pt;_keys[_selectIndex].x += off.x;_keys[_selectIndex].y += off.y;_spline.getPoint(_selectIndex).x += off.x;_spline.getPoint(_selectIndex).y += off.y;_spline.recalcTangents();_array.clear();for (float t = 0 ; t < 1.0f; t += 0.01f){float3 pos = _spline.interpolate(t);_array.push_back(pos);}}}break;default:return DefWindowProc(hWnd, msgId, wParam, lParam);}return 0;}
};int __stdcall WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{SamplerSplineEditor instance;instance.main(800,600);return 0;
}
spline曲线使用相关推荐
- Unity利用Curvy Spline插件生成曲线,并使物体沿生成的曲线运动
插件下载: 网络资源 Assets Store 我用的是Curvy Splines - 7.1.4.导入后场景中会出现如下界面. 创建曲线 https://blog.csdn.net/cordova/ ...
- aitken插值方法的c++代码_无人驾驶路径规划技术-三次样条插值曲线及Python代码实现...
自动驾驶运动规划(Motion Planning)是无人驾驶汽车的核心模块之一,它的主要任务之一就是如何生成舒适的.碰撞避免的行驶路径和舒适的运动速度.生成行驶路径最经典方法之一就是是Sampling ...
- Spline导数及曲率计算
0 前言 曲率的公式为: 因此求曲率的重点在于获得拟合曲线的一阶导数和二阶导数. 1 实例1 根据参考资料[5]的提示,可以使用csape()对离散点进行Spline插值,然后使用fnder()对得到 ...
- 滑动轨迹 曲线 python_无人驾驶路径规划技术-三次样条插值曲线及Python代码实现...
自动驾驶运动规划(Motion Planning)是无人驾驶汽车的核心模块之一,它的主要任务之一就是如何生成舒适的.碰撞避免的行驶路径和舒适的运动速度.生成行驶路径最经典方法之一就是是Sampling ...
- 【Python基础】科学计算库Scipy简易入门
0.导语 Scipy是一个用于数学.科学.工程领域的常用软件包,可以处理插值.积分.优化.图像处理.常微分方程数值解的求解.信号处理等问题.它用于有效计算Numpy矩阵,使Numpy和Scipy协同工 ...
- Apollo进阶课程㉔丨Apollo 规划技术详解——Motion Planning Environment
原文链接:进阶课程㉔丨Apollo 规划技术详解--Motion Planning Environment 自动驾驶汽车核心技术包括环境感知.行为决策.运动规划与控制等方面.其中,行为决策系统.运动规 ...
- 是Excel的图,不!是R的图
原文章来源链接:https://brucezhaor.github.io/blog/2016/06/13/excel2ggplot/ 原文章作者:BruceZhaoR(RStats, interest ...
- scilab和matlab的区别,matlab 与scilab的比较.doc
matlab 与scilab的比较 matlab 使用老出错,决定试试scilab. 几个例子来学习 scilab例1: 画等值线的命令//定义一个向量x=[ 1 2 3 ; 1 3 5 ; 8 2 ...
- 【CAD.Net】第四课:添加实体类和符号表到图纸
下面列出所有的常用的CAD实体类 < 类名 类型 Entity 实体 Line 直线 : Solid 体 Circle 圆 Arc 圆弧 Ellipse 椭圆 Polyline 多段线 LWPo ...
- 3DSMAX中英文对照大全(从A-Z分类)
A Absolute Mode Transform Type-in绝对坐标方式变换输入 Absolute/Relative Snap Toggle Mode绝对/相对捕捉开关模式 ACIS Optio ...
最新文章
- mysql 和 mongo db 语法对比
- html实现带有数字的列表,纯CSS实现雨滴形状的数字序号列表
- 10.4.4 使用ctypes调用kernel32.dll中的函数
- 简单说说:JavaSE、JavaEE、JavaME这三大体系
- 门户网站运营的几个方法
- python字典有什么用_Python中的字典介绍
- 华为云发布 EI 城市智能体
- [Java] 蓝桥杯 BASIC-1 基础练习 闰年判断
- 【MySQL】MySQL 5.7 sys Schema
- 【原创】MySQL 模拟PostgreSQL generate_series 表函数
- c语言中用了double语句,求助 C语言 中 double语句用法
- Activiti7 表介绍
- PHP+Javascript实现拖动滑块完成拼图验证码
- 怎样使用计算机定时关机,win10怎么定时关机?
- matlab神经网络工具箱的使用
- Windows命令行解决8080端口被占用
- [转载] 晓说——第1期:揭秘游戏规则奥斯卡走下“神坛“
- 通俗理解拉普拉斯算子(Laplace)
- GVM 内存结构 垃圾回收
- 服务器安全检测和防御技术