首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >绘制NURBS曲线?

绘制NURBS曲线?
EN

Stack Overflow用户
提问于 2012-08-07 15:45:35
回答 3查看 6.4K关注 0票数 3

在过去的一周里,我一直面临着这个问题。对于我当前的项目,我需要绘制NURBS曲线,该项目已经使用了OpenNURBS,但我不知道如何使用它。

我的问题是,如何从几个控制点获得曲线点?

我做了相当多的搜索,我看到了这个网站:http://www.nar-associates.com/nurbs/c_code.html

我可以使用代码,但我不知道如何扩展/简化它来使用N个控制点。

(另外,我使用C++,所以我将代码从页面转换为上述语言,针对C++的答案会更好,但我在语言之间转换没有任何问题。)

EN

回答 3

Stack Overflow用户

发布于 2012-08-07 20:19:00

尝试这个库:

http://libnurbs.sourceforge.net/

非均匀有理B样条(NURBS)曲线曲面是计算机图形学中用于表示复杂三维形状的一种非常普遍的数学曲面。

libnurbs的目标是提供一个干净、健壮且功能强大的库,该库能够定义、操作和分析NURBS曲线和曲面。我们将在openNURBS库提供的基础上构建,实现该库中缺少的功能,并根据需要进行更改。openNURBS努力的目标是提高各种openNURBS系统之间的互操作性,因此他们没有动力开发或发布一个功能更全的库(即Rhino,他们的商业平台)-因此需要这个项目。

票数 1
EN

Stack Overflow用户

发布于 2016-05-11 00:54:09

可以使用this免费工具联机绘制NURBS曲线。这是一个基于webGL的应用程序,在Chrome浏览器中运行效果最好。在这里,您可以绘制具有N个控制点的曲线,并查看曲线上与u参数对应的点的值。

票数 1
EN

Stack Overflow用户

发布于 2016-09-29 02:44:24

我是这样做的:

  1. make the curve

a.创建曲线对象(尺寸,有理标志(是否有权重),曲线的阶数+1,有多少控制点)

代码语言:javascript
复制
 ON_NurbsCurve thisCurve(3, false, order, controlPoints.size());

b.将控制点添加到曲线

代码语言:javascript
复制
for(int i = 0; i <controlPoints.size(); ++i)
{
   ON_3dPoint cpPosition = controlPoints[i];
   thisCurve.SetCV(i, cpPosition.x);
}

c.添加结

I.如果你有knot_count = cv_count + degree +1

代码语言:javascript
复制
for (int i = 1; i < knotValues.size() - 1; ++i)
   thisCurve.SetKnot(i - 1, knotValues[i]);

II.如果你有knot_count = cv_count + degree -1

代码语言:javascript
复制
for (int i = 0; i < knotValues.size(); ++i)
   thisCurve.SetKnot(i, knotValues[i]);

  1. 对曲线进行采样

a.检查曲线是否有效

代码语言:javascript
复制
if (thisCurve.IsValid())
{

b.获取曲线的参数范围

代码语言:javascript
复制
double maxU = knotValues.back();
double minU = knotValues.front();

c.插值

代码语言:javascript
复制
double quadrature = 10;
for (unsigned int i = 0; i < quadrature; ++i)
{
  double t = ((maxU - minU) * (i) / (quadrature - 1)) + minU;
  double pointsOut[3];

d.评估这个参数(曲线的参数,取了多少导数,什么维数,要在其中存储值的双精度数组)

代码语言:javascript
复制
  bool successful = thisCurve.Evaluate(t, 0, 3, pointsOut);
  if (successful)
    curvePoints.push_back(ON_3dPoint(pointsOut[0], pointsOut[1], pointsOut[2]));
  else
    std::cout << "evaluation not successful " << std::endl;

e.清理

代码语言:javascript
复制
  delete [] pointsOut;
}

thisCurve.Destroy();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11841391

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档