社区
C语言
帖子详情
求Hermite曲线算法
fatcatman
2004-05-06 09:24:01
求Hermite曲线算法,谢谢
...全文
792
13
打赏
收藏
微信扫一扫
点击复制链接
分享
举报
写回复
13 条
回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
liushuaiboy
2004-05-06
没听过,楼主,这是作甚么地?
打赏
举报
回复
赞
Johnnyxy
2004-05-06
热,顶你,给我分!
打赏
举报
回复
赞
fatcatman
2004-05-06
顶
打赏
举报
回复
赞
fatcatman
2004-05-06
顶
打赏
举报
回复
赞
freefalcon
2004-05-06
因为屏幕坐标系的y轴正方向是向下的
你将y去负值,在考虑加上一个偏移量(比如屏幕的高度)就可以了
打赏
举报
回复
赞
fatcatman
2004-05-06
请问用这void DrawHermiteCurve画出来的图和实际想要的上下是颠倒的啊?这是为什么啊?
打赏
举报
回复
赞
fatcatman
2004-05-06
请问用这个算法画出来的图和实际想要的上下是颠倒的啊?这是为什么啊?
#define Iterative 24 /* 曲线仿真的线数(必须小于32) */
#define Iterative2 (Iterative*Iterative)
#define Iterative3 (Iterative2*Iterative)
void DrawHermiteCurve(int x1,int y1,int x2,int y2,int xr1,int yr1,
int xr2,int yr2)
{
/* ------------------------------------------------------------
作用:画出Hermite曲线
输入:x1,y1,x2,y2 = 曲线端点
xr1,yr1,xr2,yr2 = 曲线两参考向量
作者:邱奕南 Chi'u I-Nan
------------------------------------------------------------ */
int i, oldx, oldy, m1, m2, m3, m4, x, y, k1, k2;
oldx = x1;
oldy = y1;
m1 = Iterative3;
m2 = m3 = m4 = 0;
for (i=0; i<Iterative; i++) /* 用Iterative条直线仿真 */
{
k1 = (i << 1) + 1;
k2 = (k1+i)*i + k1;
m4 += (k2 -= (k1 *= Iterative));
m3 += (k1 = k2 - k1) + Iterative2;
m2 -= (k2 += k1);
m1 += k2;
x = (int) (((long) x1*m1 + (long) x2*m2 + (long) xr1*m3 +
(long) xr2*m4) / Iterative3);
y = (int) (((long) y1*m1 + (long) y2*m2 + (long) yr1*m3 +
(long) yr2*m4) / Iterative3);
DrawLine(oldx,oldy,x,y);
oldx = x;
oldy = y;
}
}
void DrawBezierCurve(int x1,int y1,int x2,int y2,int xr1,int yr1,
int xr2,int yr2)
{
/* ------------------------------------------------------------
作用:画出Bezier曲线
输入:x1,y1,x2,y2 = 曲线端点
xr1,yr1,xr2,yr2 = 曲线两参考点
作者:邱奕南 Chi'u I-Nan
------------------------------------------------------------ */
DrawHermiteCurve(x1,y1,x2,y2,3*(xr1-x1),3*(yr1-y1),3*(x2-xr2),3*(y2-yr2));
}
打赏
举报
回复
赞
junnyfeng
2004-05-06
参考
打赏
举报
回复
赞
fatcatman
2004-05-06
谢谢了,我试一下!
打赏
举报
回复
赞
freefalcon
2004-05-06
多谢楼上,我也收藏一下此资料
打赏
举报
回复
赞
happyasen
2004-05-06
发信人: william@cis_nctu (何陋居主), 信区: programming
标 题: [转载] Hermite 与 Bezier 曲线的绘制
发信站: 交大资科_BBS (May 25 00:32:41 1995)
转信站: cis_nctu
From: Chi'u I-Nan * Area: 90 C 语言
To: All Date: 03 May 95 22:37:26
Subj: Hermite 与 Bezier 曲线的绘制
**********************************************************************
* Hermite与Bezier曲线绘制方法研究 *
* 作者:邱奕南 (Chi'u I-Nan) *
* 版权声明:以下文章内容本人仅同意供BBS 站上流传学习,但必须完整流传 *
* (含版权声明及程序),其余权利一概保留。任何未经本人同意 *
* ,将本文贩卖、刊登、节录、或其它一切侵害本人著作权之行为 *
* 者,皆需负担刑事责任及民事赔偿责任。 *
**********************************************************************
Hermite及Bezier曲线为三度空间曲线的常用表示法,以下我们先说明一
下这两个曲线的定义:
1.Hermite曲线
Hermite曲线为给定两端点及两端点向量所得的三次曲线。令三次曲线:
3 2
x(t) = Ax * t + Bx * t + Cx * t + d
3 2
y(t) = Ay * t + By * t + Cy * t + d
且令给定的两端点为(x1,y1)、(x2,y2),以及两端点向量(xr1,yr1)、(xr2,yr2),
则:
x(0) = x1, y(0) = y1
x(1) = x2, y(1) = y2
x'(0) = xr1, y'(0) = yr1
x'(1) = xr2, y'(1) = yr2
绘出(x(t),y(t)),0<=t<=1,即为Hermite曲线。
2.Bezier曲线
Bezier曲线为给定两端点及另两参考点所得的三次曲线,它可说是Hermite
曲线的另一种表示方式。假设两端点为P1、P2,以及两参考点Pr1、Pr2,则
Bezier曲线换算成Hermite曲线的方式为:
R1 = 3*(Pr1-P1)
R2 = 3*(P2-Pr2)
R1、R2即为Hermite曲线的两端点向量。
由于Bezier曲线和Hermite曲线可以说是相同的,因此以下之说明我们便以
Hermite曲线为主。由Hermite曲线的定义,首先我们必须求出Ax,Bx...等值。
由定义中的条件:
x(0) = x1, x(1) = x2, x'(0) = xr1, x'(1) = xr2
以及
2
x'(t) = 3 * Ax * t + 2 * Bx * t + Cx
可得:
┌ 0 0 0 1 ┐┌ Ax ┐ ┌ x1 ┐
│ 1 1 1 1 ││ Bx │=│ x2 │
│ 0 0 1 0 ││ Cx │ │ xr1 │
└ 3 2 1 0 ┘└ Dx ┘ └ xr2 ┘
解之得:
┌ Ax ┐ ┌ 2 -2 1 1 ┐┌ x1 ┐
│ Bx │=│ -3 3 -2 1 ││ x2 │
│ Cx │ │ 0 0 1 0 ││ xr1 │
└ Dx ┘ └ 1 0 0 0 ┘└ xr2 ┘
因此
x(t) = (2*t^3 - 3*t^2 + 1) * x1 + (-2*t^3 + 3*t^2) * x2 +
(t^3 - 2*t^2 + t) * xr1 + (t^3 - t^2) * xr2
同理
y(t) = (2*t^3 - 3*t^2 + 1) * y1 + (-2*t^3 + 3*t^2) * y2 +
(t^3 - 2*t^2 + t) * yr1 + (t^3 - t^2) * yr2
上述的公式中,由于t的值是介于0与1之间,这对于我们在实际绘图上较不
方便,而且运算速度也比较慢。因此假设我们以n条直线来仿真Hermite曲线,
则我们必须将t值化成整数,使它成为0<=t<=n(注意n条连续直线需有n+1个点)。
令i=n*t代入上述公式,化简后可得:
x(i) = (m1*x1 + m2*x2 + m3*xr1 + m4*xr2) / n^3
y(i) = (m1*y1 + m2*y2 + m3*yr1 + m4*yr2) / n^3
其中
m1 = 2*i^3 - 3*n*i^2 + n^3 , 0 <= i <= n
m2 = -2*i^3 + 3*n*i^2
m3 = i^3 - 2*n*i^2 + n^2*i
m4 = i^3 - n*i^2
如此我们便能很方便地求出仿真直线的各端点。然而上述公式中的乘法仍相当
多,对于m1~m4的计算上至少需5次乘法、2次移位乘法和6次加法(或4次乘法、
3次移位乘法和7次加法),在计算上仍然会浪费相当多时间(PC上的乘法约为
加法的近20倍,移位乘法则和加法相当),因此有必要再予以化简。如何简化
呢?由上述公式可发现,主要的乘法来自于i^3的计算,因此欲将之简化的最简
单的方式便是由前一个m1~m4值来求得后一个m1~m4值,藉此消减掉这个三次
方值的运算:
m1(i+1) = m1(i) + 6*i^2 + 6*i + 2 - 3*n*(2*i+1)
m2(i+1) = m2(i) - 6*i^2 - 6*i - 2 + 3*n*(2*i+1)
m3(i+1) = m3(i) + 3*i^2 + 3*i + 1 - 2*n*(2i+1) + n^2
m4(i+1) = m4(i) + 3*i^2 + 3*i + 1 - n*(2*i+1)
现在便是要化简各式中后面的计算项次。由于这些项次有相当多的重复,故可
将之写成:
m1(i+1) = m1(i) + a
m2(i+1) = m2(i) - a
m3(i+1) = m3(i) + d - c + n^2
m4(i+1) = m4(i) + d
a = 2*b - 3*c
b = 3*i^2 + 3*i + 1
c = n*(2*i+1)
d = b-c
再进一步简化为:
e = 2*i + 1
c = n*e
b = 3*i^2 + 3*i + 1
= (3*i+1)*i + (2*i+1)
= (e+i)*i + e
整理一下成为(依计算顺序):
e = 2*i + 1
b = (e+i)*i + e
c = n*e
d = b-c
m4 = m4 + d
f = d-c
m3 = m3 + f + n^2
a = d + f
m2 = m2 - a
m1 = m1 + a
共计2次乘法、1次移位乘法和11次加法,等于是以两次加法代替了两次乘法,
其速度必然较快。记得m1~m4的初值为:
m1(0) = n^3
m2(0) = m3(0) = m4(0) = 0
接下来我们要探讨一下模拟线数n的问题。倒底取多少模拟线数较为恰当?
采用的仿真线数太少,曲线将不够平滑,但若模拟线数太多,曲线绘制速度又
会太慢。据作者实际的测试,一般取n=20以上曲线便已相当平滑,但对于弯度
太大的曲线,其转折处仍约略可见,不过并不严重。由于在绘制曲线时,大都
以整数来运算(为求速度),因此仿真线数最好不要超出32,以避免运算结果
超出整数运算的值域。以下便是Hermite曲线和Bezier曲线的绘制程式:
#define Iterative 24 /* 曲线仿真的线数(必须小于32) */
#define Iterative2 (Iterative*Iterative)
#define Iterative3 (Iterative2*Iterative)
void DrawHermiteCurve(int x1,int y1,int x2,int y2,int xr1,int yr1,
int xr2,int yr2)
{
/* ------------------------------------------------------------
作用:画出Hermite曲线
输入:x1,y1,x2,y2 = 曲线端点
xr1,yr1,xr2,yr2 = 曲线两参考向量
作者:邱奕南 Chi'u I-Nan
------------------------------------------------------------ */
int i, oldx, oldy, m1, m2, m3, m4, x, y, k1, k2;
oldx = x1;
oldy = y1;
m1 = Iterative3;
m2 = m3 = m4 = 0;
for (i=0; i<Iterative; i++) /* 用Iterative条直线仿真 */
{
k1 = (i << 1) + 1;
k2 = (k1+i)*i + k1;
m4 += (k2 -= (k1 *= Iterative));
m3 += (k1 = k2 - k1) + Iterative2;
m2 -= (k2 += k1);
m1 += k2;
x = (int) (((long) x1*m1 + (long) x2*m2 + (long) xr1*m3 +
(long) xr2*m4) / Iterative3);
y = (int) (((long) y1*m1 + (long) y2*m2 + (long) yr1*m3 +
(long) yr2*m4) / Iterative3);
DrawLine(oldx,oldy,x,y);
oldx = x;
oldy = y;
}
}
void DrawBezierCurve(int x1,int y1,int x2,int y2,int xr1,int yr1,
int xr2,int yr2)
{
/* ------------------------------------------------------------
作用:画出Bezier曲线
输入:x1,y1,x2,y2 = 曲线端点
xr1,yr1,xr2,yr2 = 曲线两参考点
作者:邱奕南 Chi'u I-Nan
------------------------------------------------------------ */
DrawHermiteCurve(x1,y1,x2,y2,3*(xr1-x1),3*(yr1-y1),3*(x2-xr2),3*(y2-yr2));
}
* 青衫诗客 -- 小邱 *
-- Via 中文银版快信 V2.28C
! Origin: 档案货柜, 欢迎您来挖宝, 28800 BPS, 04-230-2080; (90:2010/622)
________________________________________
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
≡ 何陋居 ≡ 中学生以伏案读书为主, 大学生则应起而高瞻远瞩。 Whitehead.
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
打赏
举报
回复
赞
freefalcon
2004-05-06
http://bbs.ee.ntu.edu.tw/boards/Programming/14/7.html
我这里显示有乱码,不过程序还是比较清楚的
1.HermiteΡ絬
HermiteΡ絬倒﹚ㄢ狠翴のㄢ狠翴秖┮眔ΩΡ絬ΩΡ絬
3 2
x(t) = Ax * t + Bx * t + Cx * t + d
3 2
y(t) = Ay * t + By * t + Cy * t + d
倒﹚ㄢ狠翴(x1,y1)(x2,y2)のㄢ狠翴秖(xr1,yr1)(xr2,yr2)
玥
x(0) = x1, y(0) = y1
x(1) = x2, y(1) = y2
x'(0) = xr1, y'(0) = yr1
x'(1) = xr2, y'(1) = yr2
酶(x(t),y(t))0<=t<=1HermiteΡ絬
#define Iterative 24 /* Ρ絬家览絬计(ゲ斗32) */
#define Iterative2 (Iterative*Iterative)
#define Iterative3 (Iterative2*Iterative)
void DrawHermiteCurve(int x1,int y1,int x2,int y2,int xr1,int yr1,
int xr2,int yr2)
{
/* ------------------------------------------------------------
ノ礶HermiteΡ絬
块x1,y1,x2,y2 = Ρ絬狠翴
xr1,yr1,xr2,yr2 = Ρ絬ㄢ把σ秖
玭 Chi'u I-Nan
------------------------------------------------------------ */
int i, oldx, oldy, m1, m2, m3, m4, x, y, k1, k2;
oldx = x1;
oldy = y1;
m1 = Iterative3;
m2 = m3 = m4 = 0;
for (i=0; i<Iterative; i++) /* ノIterative兵絬家览 */
{
k1 = (i << 1) + 1;
k2 = (k1+i)*i + k1;
m4 += (k2 -= (k1 *= Iterative));
m3 += (k1 = k2 - k1) + Iterative2;
m2 -= (k2 += k1);
m1 += k2;
x = (int) (((long) x1*m1 + (long) x2*m2 + (long) xr1*m3 +
(long) xr2*m4) / Iterative3);
y = (int) (((long) y1*m1 + (long) y2*m2 + (long) yr1*m3 +
(long) yr2*m4) / Iterative3);
DrawLine(oldx,oldy,x,y);
oldx = x;
oldy = y;
}
}
打赏
举报
回复
赞
fatcatman
2004-05-06
画曲线的一个算法
打赏
举报
回复
赞
相关推荐
三次
Hermite
样条
曲线
算法
应用c++ MFC实现三次
Hermite
样条
曲线
算法
,配套清华大学出版社的《计算机图形学基础教程》。
三次
Hermite
曲线
算法
下面说,整个
算法
需要注意的地方。 1) 切线的概念 切线不是斜率,可以理解为向量吧。比如p0到p1的切线就是(p1-p0)。可以标准化为单位向量。 2)简单的切线 假如四个控制点p0,p1,p2,p3,那么最简单的计算p1点...
Hermite
曲线
glut 实现的
Hermite
曲线
c++代码
Hermite
样条
曲线
算法
opengl的一个小程序,包含源码和运行结果。
hermite
曲线
,MFC实现
简单的实现了三次
hermite
曲线
,可以点击绘制点进行动态的改变
hermite
曲线
。
Hermite
曲线
生成
算法
Hermite
曲线
生成
算法
参数说明: (x01,y11)是点(x0,x1)的参数导数 (y01,y11)是点(y0,y1)的参数导数 例如:HermitCurve(50,50,200,100,200,100,-200,200,6)
Hermite
曲线
Bresenham直线
在VS 2008上有opencv配置可运行 MFC单文档设计 有多种直线、
曲线
画法,园、椭圆,图形变换,裁剪,填充等
Hermite
曲线
Bresenham直线八分法画圆
内容有:
Hermite
曲线
,四点
Hermite
曲线
,旋转变换,比例变换,平移变换,错切变换,复合变换,对称变换,八分法画圆,画椭圆,扫描线填充,简单种子填充,递归法填充,图案填充,Bresenham法画直线,直线裁剪,...
OpenGL实现
Hermite
算法
绘制三次
曲线
"\n\t使用
Hermite
算法
,用两顶点两控制点绘制三次
曲线
。" ); puts ( "\t左键移动控制点,右键移动型值点" ); glutDisplayFunc(myDisplay); glutReshapeFunc(Reshape); glutMouseFunc(mouse); glutMotionFunc...
Hermite
(埃尔米特)
曲线
公式-易语言
有种东西叫做轨迹方程,这是贝塞尔进阶版 厄米特矩阵,只是对他的矩阵
算法
和轨迹
算法
进行了翻译 依据https://www.cnblogs.com/jqm304775992/p/5044728.html 这个文章进行了 易语言
算法
还原
OpenGL -
Hermite
算法
多点画光滑
曲线
根据上一篇博客(传送门:点击打开链接),我们可以根据两点用
Hermite
算法
绘制三次
曲线
。但是考虑多点问题时,光滑连接就是主要问题了,如果我们能
求
出中间点的切矢,那么就可以两两点绘制了。 所以我们的主要问题...
Hermite
曲线
插值
原文
Hermite
Curve Interpolation
Hermite
Curve Interpolation Hamburg (Germany), the 30th March 1998. Written by Nils Pipenbrinck aka Submissive/Cubic & $eeN Introduction
Hermite
curves are...
hermite
插值matlab代码,
hermite
插值以及两种MATLAB程序
资源描述:给定矢量P0, P1, R0, R1,称满足下列条件的参数三次多项式
曲线
Pt,t∈0,1为
Hermite
曲线
Hx0y0,Hx1y1, H x0m0,H x1m1, 即
Hermite
曲线
两个端点为P0, P1,在两端点的切矢量分别R0, R1。记几何矩阵和基矩阵分别为...
分段插值/
Hermite
插值
分段插值/
Hermite
插值1. 交互控制2. 埃尔米特
曲线
段
曲线
和曲面的方法一般都是基于点的---...一个实用的、有用的
曲线
/曲面设计
算法
应该是交互式的。它应该提供用户控制的参数,以可预测的、直观的方式修改
曲线
的形状。H
Unity
曲线
插值(
Hermite
插值和Catmull_Rom插值)
埃尔米特插值时颇为常用的插值
算法
,其根本也是三次贝塞尔
曲线
,有关贝塞尔
曲线
的知识可以参考这篇文章,有动图,看起来非常直观https://www.cnblogs.com/hnfxs/p/3148483.html下面是三次贝塞尔
曲线
模拟和公式 ...
Hermite
(埃尔米特)插值法
Hermite
(埃尔米特)插值法
Hermite
插值法是解决数学建模中预测类问题的最常用的方法,可以有效的解决“已知数据”数量不够的问题。 但是,直接使用
Hermite
插值得到的多项式次数较高,也存在着“龙格现象(Runge ...
实现自由
曲线
的生成
算法
(2) 编写程序实现
Hermite
,Bezier、B样条
曲线
各一条; (3) 综合利用直线,自由
曲线
的
算法
设计生成一个卡通图形或图案;
hermite
插值法 matlab,分段三次
Hermite
插值Matlab实现
function [m_matrix]=
hermite
(x,y,y0,yn,x_value)%% 输入值分配,x_input,y_input均为数组,y_0,y_n为x_0,x_n分别对应的一阶导数值x_input = x;y_input = y;y_0 = y0;y_n = yn;%%[~,number] = size(x_input); %获取...
三次
hermite
插值多项式例题_
hermite
插值例题
证毕。对于齐次问题,可知节 x 点 例题 ...关键词:龙格现象 分段差值 三次
Hermite
进行插值 1、实验目的 1) 通过对分段三次
Hermite
插值
算法
程序的编写,提高自己编写程序的 能力 2) 体会分段三次 ......(x x1)( ...
人工智能-机器学习-移动通信客户价值的挖掘模型设计.pdf
人工智能-机器学习-移动通信客户价值的挖掘模型设计.pdf
发帖
C语言
加入
微信扫一扫
点击复制链接
6.6w+
社区成员
24.2w+
社区内容
C语言相关问题讨论
社区管理员
申请成为版主
帖子事件
创建了帖子
2004-05-06 09:24
社区公告
暂无公告