#include <math.h>
#include <gl/glut.h>
#include <iostream>
using namespace std; struct Point2
{
double x;
double y; Point2(int px, int py) { x = px; y = py; }
}; Point2 P0(, );
Point2 P1(, );
Point2 derP0(, );
Point2 derP1(, ); bool mouseLeftDown = false;
bool mouseRightDown = false; /*计算Hermite曲线*/
void Hermit(int n)
{
float f1, f2, f3, f4; double deltaT = 1.0 / n; glBegin(GL_LINE_STRIP);
for (int i = ; i <= n; i++) { double T = i * deltaT; f1 = 2.0*pow(T, ) - 3.0*pow(T, ) + 1.0;
f2 = -2.0*pow(T, ) + 3.0*pow(T, );
f3 = pow(T, ) - 2.0*pow(T, ) + T;
f4 = pow(T, ) - pow(T, ); glVertex2f(f1*P0.x + f2*P1.x + f3*derP0.x + f4*derP1.x,
f1*P0.y + f2*P1.y + f3*derP0.y + f4*derP1.y);
}
glEnd();
} /*用鼠标进行绘制,完成后可改变控制点,拖动即可*/
void display() {
glClear(GL_COLOR_BUFFER_BIT); glLineWidth(1.5);
glColor3f(1.0, 0.0, 0.0);
glBegin(GL_LINES);
glVertex2f(P0.x, P0.y);
glVertex2f(P0.x + derP0.x / , P0.y + derP0.y / );
glVertex2f(P1.x, P1.y);
glVertex2f(P1.x - derP1.x / , P1.y - derP1.y / );
glEnd(); glColor3f(0.0, 0.0, 1.0);
glPointSize(10.0f); glBegin(GL_POINTS);
glVertex2f(P0.x, P0.y);
glVertex2f(P0.x + derP0.x / , P0.y + derP0.y / );
glVertex2f(P1.x, P1.y);
glVertex2f(P1.x - derP1.x / , P1.y - derP1.y / );
glEnd(); Hermit(); glFlush();
glutSwapBuffers();
} void init()
{
glClearColor(1.0, 1.0, 1.0, 0.0);
glShadeModel(GL_FLAT);
} void myReshape(int w, int h)
{
glViewport(, , (GLsizei)w, (GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, (GLsizei)w, (GLsizei)h, 0.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
} void mouse(int button, int state, int x, int y)
{
if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
{
mouseLeftDown = true;
} if (button == GLUT_LEFT_BUTTON && state == GLUT_UP)
{
mouseLeftDown = false;
} if (button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN)
{
mouseRightDown = true;
} if (button == GLUT_RIGHT_BUTTON && state == GLUT_UP)
{
mouseRightDown = false;
}
} double distance(int x1, int y1, int x2, int y2)
{
return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
} void motion(int x, int y)
{
if (mouseLeftDown)
{
if (distance(P0.x + derP0.x / , P0.y + derP0.y / , x, y) < )
{
derP0.x = (x - P0.x) * ;
derP0.y = (y - P0.y) * ;
} if (distance(P1.x - derP1.x / , P1.y - derP1.y / , x, y) < )
{
derP1.x = (P1.x - x) * ;
derP1.y = (P1.y - y) * ;
}
} glutPostRedisplay();
} int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize(, );
glutInitWindowPosition(, );
glutCreateWindow("hello");
init(); glutDisplayFunc(display);
glutReshapeFunc(myReshape);
glutMouseFunc(mouse);
glutMotionFunc(motion); glutMainLoop();
return ;
}

两点三次Hermiter插值C++代码的更多相关文章

  1. SSE图像算法优化系列十八:三次卷积插值的进一步SSE优化。

    本文是在学习https://blog.csdn.net/housisong/article/details/1452249一文的基础上对算法的理解和重新整理,再次非常感谢原文作者的深入分析以及分享. ...

  2. ASP 三十二条精华代码 (1)

    ASP 三十二条精华代码 (1) 2009-08-10 09:53:03  www.hackbase.com  来源:互联网 1. oncontextmenu="window.event.r ...

  3. 分段三次Hermite插值及其与三次样条的比较

    分段三次 Hermite 插值多项式 (PCHIP) 语法 p = pchip(x,y,xq) pp = pchip(x,y)   说明 p = pchip(x,y,xq) 返回与 xq 中的查询点对 ...

  4. 数值计算方法实验之按照按三弯矩方程及追赶法的三次样条插值 (MATLAB 代码)

    一.实验目的 在已知f(x),x∈[a,b]的表达式,但函数值不便计算,或不知f(x),x∈[a,b]而又需要给出其在[a,b]上的值时,按插值原则f(xi)= yi(i= 0,1…….,n)求出简单 ...

  5. 拉格朗日插值Python代码实现

    1. 数学原理 对某个多项式函数有已知的k+1个点,假设任意两个不同的都互不相同,那么应用拉格朗日插值公式所得到的拉格朗日插值多项式为: 其中每个lj(x)为拉格朗日基本多项式(或称插值基函数),其表 ...

  6. 0038 Java学习笔记-多线程-传统线程间通信、Condition、阻塞队列、《疯狂Java讲义 第三版》进程间通信示例代码存在的一个问题

    调用同步锁的wait().notify().notifyAll()进行线程通信 看这个经典的存取款问题,要求两个线程存款,两个线程取款,账户里有余额的时候只能取款,没余额的时候只能存款,存取款金额相同 ...

  7. 剑指offer—第三章高质量的代码(按顺序打印从1到n位十进制数)

    题目:输入一个数字n,按照顺序打印出1到最大n位十进制数,比如输入3,则打印出1,2,3直到最大的3位数999为止. 本题陷阱:没有考虑到大数的问题. 本题解题思路:将要打印的数字,看成字符串,不足位 ...

  8. Visual Studio 调试技巧 (三) -- 调试第三方组件代码

    上次我们提到,没有源代码而且没有调试符号,我们也可以 Debug.有人可能会问,我什么时候需要在这种情况下调试吗?! 是的.比方说,我们用了某些第三方的组件,这些组件里面难免也会有 Bug.就算是微软 ...

  9. C# 三种打印方式含代码

    一:C#代码直接打印pdf文件(打印质保书pdf文件) 引用: 代码注释很详细了. private void btn_pdf_Click(object sender, RoutedEventArgs ...

随机推荐

  1. 【python小记】python操作excel文件

    题记: 最近因为工作需要,学习了python,瞬间对这个轻松快捷的语给吸引了,以前只知道js脚本是写网页的,没有想到python这个脚本语言的应用范围可以这么广泛,现在做一些简单或稍微复杂的操作,基本 ...

  2. LeetCode 541. 反转字符串 II(Reverse String II)

    541. 反转字符串 II 541. Reverse String II

  3. AOP+Redis锁防止表单重复提交

    确保分布式锁同时满足以下四个条件 1.互斥性.在任意时刻,只有一个客户端能持有锁 2.不会发生死锁.即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁 3.具有容错性.只要 ...

  4. Apache Kafka用例

    1.目标 在我们上一篇Kafka教程中,我们讨论了Kafka Pros and Cons.今天,在这篇Kafka文章中,我们将讨论Apache Kafka用例和Kafka应用程序.Kafka是新数据堆 ...

  5. c++基础(五)——关联容器

    1.关联容器 关联容器中的元素时按照关键字来保存和访问的,与之相对的,顺序容器中的元素时按它们在容器中的位置来顺序保存和访问的.两个主要关联容器是 map 和 set.标准库提供了8个关联容器,这8个 ...

  6. Numpy学习笔记(上篇)

    目录 Numpy学习笔记(上篇) 一.Jupyter Notebook的基本使用 二.Jpuyter Notebook的魔法命令 1.%run 2.%timeit & %%timeit 3.% ...

  7. if的条件表达式

    常用的: [ -a FILE ] 如果 FILE 存在则为真. [ -d FILE ] 如果 FILE 存在且是一个目录则返回为真. [ -e FILE ] 如果 指定的文件或目录存在时返回为真. [ ...

  8. 全栈项目|小书架|服务器开发-NodeJS 中使用 Sequelize 操作 MySQL数据库

    安装 官网:https://sequelize.org/v5/manual/getting-started.html 安装sequelize及数据库连接驱动 npm install --save se ...

  9. WebApi PUT与DELETE类型访问报错

    * 方法一 在项目的Web.Config文件加入 <modules> <remove name="WebDAVModule" /> </modules ...

  10. String字符串常用方法

    1.  charAt(int index)-->返回 char指定索引处的值(注意索引从0开始) String str1="abc"; char c=str1.charAt( ...