首页 > 其他分享 >【OpenGL】自己实现B-Spline曲线

【OpenGL】自己实现B-Spline曲线

时间:2022-10-17 18:01:50浏览次数:40  
标签:knots 曲线 OpenGL int float Spline bspline else order


【OpenGL】自己实现B-Spline曲线

1.绘制目标

自己实现B-Spline曲线。

2.核心代码

/TO DO///
///基于CdM公式计算B-Spline混合函数///

float bspline(float* knots, int i, int order, float u) {
// 特殊情形:一阶B-splines
if (order == 1) {
if (i == 0)
{
if (u >= knots[i] && u <= knots[i + 1])
{
return 1.0;
}
else
{
return 0.0;
}
}
else if (i >= 1)
{
if (u > knots[i] && u <= knots[i + 1])
{
return 1.0;
}
else
{
return 0.0;
}
}
}
// 一般情形
else {
// 用于存储CdM公式右边和式的第一项和第二项的值
float b1(0.f), b2(0.f);

// 计算CdM公式右边和式的第一项
if (knots[i + order - 1] - knots[i] == 0)
{
if (u - knots[i] == 0)
{
b1 = bspline(knots, i, order - 1, u);
}
else
{
b1 = 0;
}
}
else
{
float x = u - knots[i];
float y = knots[i + order - 1] - knots[i];
b1 = x / y * bspline(knots, i, order - 1, u);
}

// 计算CdM公式右边和式的第二项
if (knots[i + order] - knots[i + 1] == 0)
{
if (knots[i + order] - u == 0)
{
b2 = bspline(knots, i + 1, order - 1, u);
}
else
{
b2 = 0;
}
}
else
{
float x = knots[i + order] - u;
float y = knots[i + order] - knots[i + 1];
b2 = x / y * bspline(knots, i + 1, order - 1, u);
}

return b1 + b2;
}
}
/TO DO///
绘制B-Spline曲线//

void drawBSplineCurve(float* knots, float* controlPoints, int numControlPoints, int order, int numSamples)
{
float a = knots[order - 1];
float num = (knots[numControlPoints] - knots[order - 1]) / numSamples;
glColor3f(0.0f, 0.0f, 1.0f);
glBegin(GL_LINE_STRIP);
for (float j = a; j <= knots[numControlPoints]; j += num)
{
float x = 0, y = 0, z = 0;
for (int i = 0; i < numControlPoints; i++)
{
x = x + controlPoints[i * POINT_DIMS] * bspline(knots, i, order, j);
y = y + controlPoints[i * POINT_DIMS + 1] * bspline(knots, i, order, j);
z = z + controlPoints[i * POINT_DIMS + 2] * bspline(knots, i, order, j);
}
glVertex3f(x, y, z);
}
glEnd();
}

///
/// TO DO ///
///创建OpenGL GLU NURBS 对象并设置采样方法和采样阈值/

NURBS_OBJ = gluNewNurbsRenderer();
gluNurbsProperty(NURBS_OBJ, GLU_SAMPLING_METHOD, GLU_PATH_LENGTH);
gluNurbsProperty(NURBS_OBJ, GLU_SAMPLING_TOLERANCE, 10.0);

/
/// 使用自己实现的函数绘制B-Spline曲线//

drawBSplineCurve(KNOT_ARRAY, CONTROL_POINTS_ARRAY, NUM_POINTS, BSPLINE_ORDER, 200);

3.运行结果

【OpenGL】自己实现B-Spline曲线_i++


【OpenGL】自己实现B-Spline曲线_图形学_02


【OpenGL】自己实现B-Spline曲线_图形学_03


【OpenGL】自己实现B-Spline曲线_图形学_04


【OpenGL】自己实现B-Spline曲线_i++_05


【OpenGL】自己实现B-Spline曲线_图形学_06


【OpenGL】自己实现B-Spline曲线_i++_07


【OpenGL】自己实现B-Spline曲线_i++_08


标签:knots,曲线,OpenGL,int,float,Spline,bspline,else,order
From: https://blog.51cto.com/u_15739363/5763800

相关文章

  • OpenGL 利用 Alpha 透明度进行测试
    公众号回复:OpenGL,领取学习资源大礼包在前面的博客文章中有提到​​OpenGL裁剪测试及注意点​​,并且裁剪测试只能裁剪一个矩形区域,相当于就是把整个内容都绘制上去了,但是透......
  • 科赫曲线
    https://baike.baidu.com/item/科赫曲线/7090673?fr=aladdin 科赫曲线是一种像雪花的几何曲线,所以又称为雪花曲线,它是deRham曲线的特例。科赫曲线是出现在海里格·冯......
  • 曲线曲面基础
    曲线曲面基础隐式和参数标志对于一个圆心位于远点的单位圆周,可以由方程https://latex.codecogs.com/svg.image?\inline&space;f(x,y)=x{2}&plus;y{2}-1=0......
  • OpenGL之ShadowMap
    流程:先创建一个RenderTexture,然后用灯光的视口渲染。然后切换到正常相机,进行渲染,使用RenderTexture中的深度或者颜色纹理,然后还原当前顶点在灯光中的深度,两者对比,比缓存中......
  • 两种技能增长曲线阅读思考
    两种技能增长曲线阅读思考引言两种技能增长曲线并不是新东西,把这个标题放到网上搜索你会发现一大堆类似的文章,每个人对于技能增长曲线有不同的思考,本文仅仅是对此做了简单梳......
  • OpenGL 学习系列---基本形状的绘制
    在之前的一篇博客中,讲述了​​OpenGL基础绘制流程​​ 及相关的代码,其中关于OpenGL程序编译部分都是可以在其他项目中接着复用的,接下来会讲到如何去绘制其他的基本图元......
  • ​OpenGL 学习系列---坐标系统
    在前面​​绘制基本图形​​中,遇到了很明显的问题,圆形不像圆形,正多边形不像正多边形?就像下面图形一样:不规则的形状好好的正五边形却东倒西歪的,这就是因为我们前面的绘制都是......
  • OpenGL 之 GPUImage 源码分析
    GPUImage是iOS上一个基于OpenGL进行图像处理的开源框架,后来有人借鉴它的想法实现了一个Android版本的GPUImage,本文也主要对Android版本的GPUImage进行分析。概......
  • 视频|分类模型评估:精确率、召回率、ROC曲线、AUC与R语言生存分析时间依赖性ROC实现
    全文链接:http://tecdat.cn/?p=20650 原文出处:拓端数据部落公众号 视频|分类模型评估:精确率、召回率、ROC曲线、AUC与R语言生存分析时间依赖性ROC实现分类模型评估......
  • CAD求曲线参数所在位置的一价导数,这就是切向方向(网页版)
    主要用到函数说明:IMxDrawCurve::GetFirstDeriv求曲线参数所在位置的一价导数,这就是切向方向,具体说明如下:参数说明[in]DOUBLEdParam曲线参数[out]IMxDrawVector3d**pFir......