精华内容
下载资源
问答
  • vb如何绘制样条曲线

    2014-05-09 18:40:32
    详细的介绍了样条曲线绘制,都有注释,每一步都很清楚。
  • 如何绘制单个贝塞尔样条 https://msdn.microsoft.com/zh-cn/library/88ehxdxb%28v=vs.80%29.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1 如何绘制贝塞尔样条序列 ...
    展开全文
  • 有时在使用CAD中,需要把绘制出来的样条曲线转换成多段线来方便以后的编辑或输出到别的软件、设备。然而要怎么进行操作才能转换出来呢?下面有几种实用的方法供大家参考:第一种方法(特别使用CAD低版本的用户):打开...

    有时在使用CAD中,需要把绘制出来的样条曲线转换成多段线来方便以后的编辑或输出到别的软件、设备。然而要怎么进行操作才能转换出来呢?下面有几种实用的方法供大家参考:

    第一种方法(特别使用CAD低版本的用户):

    打开CAD——打开需要转换的样条曲线图纸——在命令栏输入“WMFOUT”,选出要转换的样条——将选择的对象保存为“图元文件(*.wmf)”格式文件——再在命令栏输入“WMFIN”打开刚刚保存的文件——按照指示输入对应的参数——炸开图形即可得到转换出来的多段线了

    第二种方法(特别使用CAD低版本的用户):

    打开CAD——打开需要转换的图纸——在命令栏输入“flatten”——按提示选择需要转换的样条曲线即可,这个方法使用的前提是确认安装了Express扩展工具

    第三种方法(使用CAD高版本的用户):

    打开CAD——打开需要转换的图纸——选择样条曲线——输入“splinedit”命令——输入“p”参数——回车——输入需要转换的精度——回车,即可

    a7c49a80297864a5ad77fc49a5a995ba.png

    第四种方法:

    打开CAD——打开需要转换的图纸——选择要转换的样条曲线,复制到新的图纸上——在菜单栏点文件“另存为”,保存为“CAD R12/L12 DXF (*.dxf)”格式——再点“文件”中的“打开”,打开刚刚保存的文件即可

    推荐关注:3Done——一款好用又好玩的3D打印设计软件

    展开全文
  • C#的绘图函数中有一个绘制样条曲线的函数DrawCurve,当只传入Pen和Point数组时,采用的是基数样条曲线绘制。如果只是绘制样条曲线,那这个函数已经满足了。但是项目中要求不但要绘制曲线,还要将曲线以方格的形式...

    C#的绘图函数中有一个绘制样条曲线的函数DrawCurve,当只传入Pen和Point数组时,采用的是基数样条曲线绘制。如果只是绘制样条曲线,那这个函数已经满足了。但是项目中要求不但要绘制曲线,还要将曲线以方格的形式模拟来实现。为此,就必须知道样条曲线是如何绘制的,才有办法知道都有哪些点,然后再用格子来模拟。

    起初,使用了很粗暴的方法,即使用DrawCurve在内存中绘制到Image中,然后从Image中取出黑白点,然后形成黑白点的矩阵,进而利用这些矩阵点对应到像素点来绘制方格。做了简单的实现,但效果不理想。原因有几个。

    1.不断使用内存绘制到Image中需要消耗大量的内存。

    2.利用像素点来采集矩阵的点时,难以确定一个采集的范围。

    3.至少需要对像素进行X和Y的双重循环遍历才能达成,这样时间复杂度会随着X、Y的增加而不断加大。

    后面找到了一份模拟实现,经过改造,初步达成了目的。来看看模拟实现的和DrawCurve的拟合效果图,见下图。

    注:图中黑色部分使用DrawCurve来绘制,黑色线中间的白色部分采用的是模拟绘制。从测试的结果来看,符合程度比较理想。下面是实现的代码。

    using System;

    using System.Collections.Generic;

    using System.Drawing;

    using System.Linq;

    using System.Text;

    namespace SplineTest

    {

    ///

    /// 样条曲线。每根样条曲线包含4个控制点

    ///

    public class Spline

    {

    ///

    /// 样点数。在点Pk和Pk+1之间,将会生成若干个样点。所以"u"将会从0.00F增长到0.05F.

    ///

    private static readonly int _samplePointCount = 20;

    ///

    /// 在基数算法中的t

    ///

    private static readonly float _tension = 0.0F;

    #region 属性

    private PointF _startControlPoint;

    ///

    /// "Pk-1"点(起始控制点)

    ///

    public PointF StartControlPoint

    {

    get

    {

    return this._startControlPoint;

    }

    set

    {

    this._startControlPoint = value;

    }

    }

    private PointF _startPoint;

    ///

    /// "Pk"点(起始点)

    ///

    public PointF StartPoint

    {

    get

    {

    return this._startPoint;

    }

    set

    {

    this._startPoint = value;

    }

    }

    private PointF _endPoint;

    ///

    /// "Pk+1"点(结束点)

    ///

    public PointF EndPoint

    {

    get

    {

    return this._endPoint;

    }

    set

    {

    this._endPoint = value;

    }

    }

    private PointF _endControlPoint;

    ///

    /// "Pk+2"点(结束控制点)

    ///

    public PointF EndControlPoint

    {

    get

    {

    return this._endControlPoint;

    }

    set

    {

    this._endControlPoint = value;

    }

    }

    private PointF[] _ctrlPoints;

    ///

    /// 曲线点(控制点及模拟的样点)

    ///

    public PointF[] CtrlPoints

    {

    get

    {

    return this._ctrlPoints;

    }

    }

    private bool _isFirst = false;

    ///

    /// 标识当前样条曲线是否是第一条,如果是m_startControlPoint 和 m_startPoint将会相同。

    /// 因为在Pk和Pk+1之间需要4个点来决定样条曲线,所以我们需要在Pk-1点前手动添加一个点。

    /// 这样我们才能在Pk-1和Pk+1之间绘制样条曲线。

    /// 同样的,最后一根样条曲线的Pk+2点会与它的"Pk+1"点相同,

    /// 这样我们才能在Pk+1和Pk+2之间绘制样条曲线。

    ///

    public bool IsFirst

    {

    get

    {

    return this._isFirst;

    }

    set

    {

    this._isFirst = value;

    }

    }

    #endregion

    public Spline()

    {

    _startControlPoint = new PointF();

    _startPoint = new PointF();

    _endPoint = new PointF();

    _endControlPoint = new PointF();

    _ctrlPoints = new PointF[_samplePointCount + 1];

    for (int i = 0; i < _ctrlPoints.Length; i++)

    {

    _ctrlPoints[i] = new PointF();

    }

    }

    ///

    ///添加关节。将新控制点添加到控制点列表中,并更新前面的样条曲线。

    ///

    /// 前一根样条曲线

    /// 当前点

    public void AddJoint(Spline prevSpline, PointF currentPoint)

    {

    //前一根样条曲线(prevSpline)为null,说明控制点列表中只有一个点,所以4个控制点样同。

    //当第2个及之后的控制点添加到控制点列表中时,那第1根样条曲线的Pk+1和Pk+2点需要更新

    if (null == prevSpline)

    {

    this._startControlPoint = currentPoint;

    this._startPoint = currentPoint;

    this._endPoint = currentPoint;

    this._endControlPoint = currentPoint;

    this._isFirst = true;

    }

    else//前一根样条曲线不为null,所以更新前一根样条曲线的控制点列表,同时更新当前样条曲线的控制点列表。

    {

    //前一根样条曲线是第1根样条曲线,更新它的Pk+1和Pk+2点

    if (true == prevSpline._isFirst)

    {

    this._startControlPoint = prevSpline.StartControlPoint;

    this._startPoint = prevSpline.StartPoint;

    this._endPoint = currentPoint;

    this._endControlPoint = currentPoint;

    GenerateSamplePoint();

    return;

    }

    else///前一根样条曲线不是第1根样条曲线,仅更新它的Pk+2点

    {

    prevSpline.EndControlPoint = currentPoint;

    prevSpline.GenerateSamplePoint();

    //模拟当前样条曲线的样点

    this._startControlPoint = prevSpline._startPoint;

    this._startPoint = prevSpline._endPoint;

    this._endPoint = currentPoint;

    this._endControlPoint = currentPoint;

    GenerateSamplePoint();

    }

    }

    }

    ///

    /// 使用基数算法生成样点

    ///

    public void GenerateSamplePoint()

    {

    PointF startControlPoint = this.StartControlPoint;

    PointF startPoint = this.StartPoint;

    PointF endPoint = this.EndPoint;

    PointF endControlPoint = this.EndControlPoint;

    float step = 1.0F / (float)_samplePointCount;

    float uValue = 0.00F;

    for (int i = 0; i < _samplePointCount; i++)

    {

    PointF pointNew = GenerateSimulatePoint(uValue, startControlPoint, startPoint, endPoint, endControlPoint);

    this.CtrlPoints[i] = pointNew;

    uValue += step;

    }

    this.CtrlPoints[_ctrlPoints.Length - 1] = endPoint;

    }

    ///

    /// 绘制样条曲线

    ///

    ///

    public void Draw(Graphics g, Pen pen)

    {

    for (int i = 0; i < _ctrlPoints.Length - 1; i++)

    {

    PointF lastPoint = _ctrlPoints[i];

    PointF nextPoint = _ctrlPoints[i + 1];

    g.DrawLine(pen, lastPoint, nextPoint);

    }

    }

    #region GenerateSimulatePoint

    ///

    /// 生成曲线模拟点,该点在startPoint和endPoint之间

    ///

    /// 介于0和1之间的变量

    /// 起始点startPoint之前的控制点, 协助确定曲线的外观

    /// 目标曲线的起始点startPoint,当u=0时,返回结果为起始点startPoint

    /// 目标曲线的结束点endPoint, 当u=1时,返回结果为结束点endPoint

    /// 在起结点startPoint之后的控制点, 协助确定曲线的外观

    /// 返回介于startPoint和endPoint的点

    private PointF GenerateSimulatePoint(float u,

    PointF startControlPoint,

    PointF startPoint,

    PointF endPoint,

    PointF endControlPoint)

    {

    float s = (1 - _tension) / 2;

    PointF resultPoint = new PointF();

    resultPoint.X = CalculateAxisCoordinate(startControlPoint.X, startPoint.X, endPoint.X, endControlPoint.X, s, u);

    resultPoint.Y = CalculateAxisCoordinate(startControlPoint.Y, startPoint.Y, endPoint.Y, endControlPoint.Y, s, u);

    return resultPoint;

    }

    ///

    /// 计算轴坐标

    ///

    ///

    ///

    ///

    ///

    ///

    ///

    ///

    private float CalculateAxisCoordinate(float a, float b, float c, float d, float s, float u)

    {

    float result = 0.0F;

    result = a * (2 * s * u * u - s * u * u * u - s * u)

    + b * ((2 - s) * u * u * u + (s - 3) * u * u + 1)

    + c * ((s - 2) * u * u * u + (3 - 2 * s) * u * u + s * u)

    + d * (s * u * u * u - s * u * u);

    return result;

    }

    #endregion

    ///

    /// 获取样条曲线上的点

    ///

    ///

    ///

    ///

    public static List FetchPoints(PointF[] points)

    {

    if (points == null || points.Length <= 0)

    {

    return null;

    }

    List _splines = new List();

    Spline splineNew = null;

    Spline lastNew = null;

    foreach (PointF nowPoint in points)

    {

    if (null == _splines || 0 == _splines.Count)

    {

    splineNew = new Spline();

    splineNew.AddJoint(null, nowPoint);

    _splines.Add(splineNew);

    }

    else

    {

    splineNew = new Spline();

    lastNew = _splines[_splines.Count - 1] as Spline;

    splineNew.AddJoint(lastNew, nowPoint);

    _splines.Add(splineNew);

    };

    }

    List _points = new List();

    foreach (Spline spline in _splines)

    {

    if (spline.IsFirst)

    {

    continue;

    }

    foreach (PointF point in spline.CtrlPoints)

    {

    if (_points.Contains(point))

    {

    continue;

    }

    _points.Add(point);

    }

    }

    return _points;

    }

    }

    ///

    /// Graphics扩展

    ///

    public static class GraphicsExtension

    {

    ///

    /// 绘制样条曲线

    ///

    ///

    ///

    ///

    public static void DrawSpline(this Graphics g, Pen pen, PointF[] points)

    {

    if (g == null)

    {

    return;

    }

    if (pen == null)

    {

    return;

    }

    if (points == null || points.Length <= 0)

    {

    return;

    }

    List _splines = new List();

    Spline splineNew = null;

    Spline lastNew = null;

    foreach (PointF nowPoint in points)

    {

    if (null == _splines || 0 == _splines.Count)

    {

    splineNew = new Spline();

    splineNew.AddJoint(null, nowPoint);

    _splines.Add(splineNew);

    }

    else

    {

    splineNew = new Spline();

    lastNew = _splines[_splines.Count - 1];

    splineNew.AddJoint(lastNew, nowPoint);

    _splines.Add(splineNew);

    }

    }

    Spline spline = null;

    for (int i = 0; i < _splines.Count; i++)

    {

    spline = _splines[i];

    if (spline.IsFirst)

    {

    continue;

    }

    spline.Draw(g, pen);

    }

    }

    }

    }注:

    1.Spline部分最核心的算法是CalculateAxisCoordinate,网上有很多类似的实现,但都不理想,这个是比较理想的一个。

    2.为了便于在Graphics中直接调用,这里对Graphics增加了一个扩展方法DrawSpline,这样就可以像调用DrawCurve一样调用,即g.DrawSpline(pen,points).

    3.在绘制出样条曲线后,还需要能得到其所模拟的点,于是在Spline中增加了一个FetchPoints的方法。

    转载请注明出处http://blog.csdn.net/xxdddail/article/details/47662983。

    展开全文
  • 今天我们学习第五章《AutoCAD ...5.18.2、绘制样条曲线(SPLINE命令)我们还是先来看看如何绘制"样条曲线",然后再来看看它的一些特性。命令:SPL(表示SPLINE)拾取一点作为"样条曲线"的第一个点。移动光标,到需要的地...

    今天我们学习第五章《AutoCAD 2019 绘制几何图形》的第十八节《AutoCAD 2019 你真的了解样条曲线吗?》。

    5.18.1、样条曲线

    创建经过或靠近一组拟合点或由控制框的顶点定义的平滑曲线。

    5.18.2、绘制样条曲线(SPLINE命令)

    我们还是先来看看如何绘制"样条曲线",然后再来看看它的一些特性。

    命令:SPL(表示SPLINE)

    拾取一点作为"样条曲线"的第一个点。

    78fd331fdfe19d5e9ab935dbeb64d8f5.png

    移动光标,到需要的地方,拾取一点作为"样条曲线"的下一个点。

    957a667e61ee17fb5065e7145c4a5ca7.png

    继续移动光标,到需要的地方,拾取一点作为"样条曲线"的另一个点。

    e4a54f9c2c042b8c1f33d913a2a85820.png

    直到最后绘制完成后按回车键,结束"SPLINE"命令。

    e2d319b86ed407ba8c9a899f6d34699a.png

    5.18.3、样条曲线的"拟合点"和"控制点"

    样条曲线使用拟合点控制点进行定义。默认情况下,拟合点与样条曲线重合,而控制点定义控制框。控制框提供了一种便捷的方法,用来设置样条曲线的形状。每种方法都有其优点。

    如下图所示,当我们选中"样条曲线"后,点击下面的"下拉箭头",可以看到缺省使用的是"拟合"模式。

    58482457dc419bb021eeffb956de1432.png

    当我们将光标悬停在某一个"拟合点"上时,会出现三个编辑选项。我们可以点选其中的选项,对"样条曲线"进行编辑。

    4f70c10215a4b0aed9f041d1c7b546a3.png

    我们点选"拉伸拟合点",移动它的位置,这样就可以对曲线进行编辑。

    515b00eb925461a354cddc6856934063.png

    编辑完成后的效果见下图。

    94c0031b2796fb9656121d254ea27ad3.png

    我们再次选中"样条曲线"后,点击下面的"下拉箭头",这一次点选 "控制点"模式。

    99343c125f032d51ad79d3c6720b432e.png

    可以看到会显示出"样条曲线"的"控制点"和以虚线显示的"控制框"。

    9e156733cb921146e600cbe6a13d8b4c.png

    当我们将光标悬停在某一个"控制点"上时,会出现四个编辑选项。我们可以点选其中的选项,同样可以对"样条曲线"进行编辑。

    74f28261719738b8598ec698441ddb64.png

    我们点选"添加顶点",然后移动光标,在需要添加顶点的地方点击,添加一个新的顶点。

    af1c2674783b4e345b7bccca12264c71.png

    添加完成的顶点见下图。然后我们就可以像编辑其它顶点一样编辑它,以达到编辑"样条曲线"的目的。

    733be9a0317f15fe4b7f30bd14a5f648.png

    要显示"控制点"和"控制框",除了上面所说的方法外,还可以直接输入CVSHOW命令来显示"控制点"和"控制框"。

    ea17aa7de09cc1907872dc609af407b8.png
    e3556cbad41e9540b2dad51d41a18e41.png

    同样,我们也可通过输入CVHIDE命令来隐藏"控制点"和"控制框"。

    e682e43b46e398b523346a6fbf98df03.png
    b7948b169f3eaf9f49526b67cbdb6131.png

    我是【推优创意】,专注原创软件教学和软件使用疑难问题解答。关注我,一定不会让您失望。如果您看了我的教程或者回答后还有疑问,可以留言,我们一起共同探讨。

    展开全文
  • 相比于其他的工具,CAD的样条曲线使用频率相对来说较低,但这个命令的使用也是有技巧的,比如必学技能,教你用样条曲线快速绘制等高线地形图!,感兴趣的小伙伴可以学习一下使用样条曲线绘制等高线的方法。今天小编...
  • C#的绘图函数中有一个绘制样条曲线的函数DrawCurve,当只传入Pen和Point数组时,采用的是基数样条曲线绘制。如果只是绘制样条曲线,那这个函数已经满足了。但是项目中要求不但要绘制曲线,还要将曲线以方格的形式...
  • 在cad中如何使用excel画样条曲线AutoCAD本身没有提供函数曲线的绘制功能,不能直接利AutoCAD绘制函数曲线,但借助其他工具也能绘制,常用的方法有3种,第一种,借助其他能绘制函数曲线的CAD软件,如CAXA等软件来绘制...
  • AutoCAD 样条曲线如何结束

    千次阅读 2017-03-19 09:46:00
    如下所示,走了四个点之后曲线绘制结束想要闭合了  鼠标右击选择确认  然后变成下面这个样子,鼠标再右击就可以结束(然后又回从下面伸出来东西,还是右击)总之就是想要结束的时候:右击确认,不断...
  • ;|--------------- vlax-curve-DivideBetweenPair ---------------Returns a approximate point list between two cross-sectioncurves by a dividing parameter, concept of LOFT command-------------------------...
  • 我有一堆坐标,它们是2D平面上固定的均匀三次B样条曲线的控制点。 我想使用Cairo调用绘制曲线(在Python中,使用... 给定控制点的坐标,如何导出相应的贝塞尔曲线的控制点? 有什么有效的算法吗?好的,所以我使用G...
  • 绘制图纸的过程中经常会用到各种CAD快捷键命令,比如当需要对CAD图纸中部分图形进行...修剪的对象包括直线、圆、圆弧、样条曲线等。主要使用方法是执行“修剪”命令以后,按照命令行提示选取一个或一个以上的切...
  •  2 在视图中任意绘制一条平面曲线(用样条曲线绘制)  3 退出草图,在特征选项卡中点击"投影曲线"  4 将草图2(一条平面曲线)投影到圆面上即可。    ...
  • 绘制图纸的过程中,为了方便绘图经常会需要用到CAD命令,但是CAD拉长命令不像移动、复制、修剪、偏移那些命令那么常用,所以有些CAD制图初学入门者不了解CAD拉长命令如何使用,下面小编就给大家分享一下CAD命令之...
  • 我正在尝试模仿Excel的使用平滑的线条...其中有一些很好的示例,说明了如何在此处简单地实现此功能:How to draw cubic spline in matplotlib但是Excel的样条算法也能够仅通过三个点生成平滑曲线(例如x = [0,1,2] y ...
  • 如何使用MATLAB绘制平滑曲线

    万次阅读 2013-07-26 05:56:12
    MATLAB中绘制平滑曲线一般使用最小二乘法或者B样条插值。  最小二乘法实际上是函数拟合,可以得到目标函数(这里为多项式)的系数,对outliers相对不敏感,缺点是需要预先设置目标函数的阶数,且有时不容易找到最优...
  • 本练习将应用以下技术:样条曲线;操作样条曲线;投影曲线特征;扫描步骤一:绘制草图一。如图所示以上视基准面作为草图绘制的基准面,绘制如图所示的草图轮廓。下图圆的直径为73MM。添加几何关系约束圆内三角形的...
  • 我听说过样条曲线和所有其他类型。我是新的iPhone编程,不明白如何编程在我的石英绘图应用程序。一个坚实的例子将非常感谢,我已经花了几个星期的圈子,我永远似乎找不到任何iOS代码这个任务。大多数帖子只是...
  • 想起自己以前为了实现张力样条曲线单独写了一个动态库(= =!),便想试一试看看效果如何 用到的类有Graphics和GraphicsPath,方法有Graphics.DrawPath() 、GraphicsPath.AddCurve()和GraphicsPath....
  • 我们在CAD制图过程中,如何对CAD中的曲线长度进行测量呢?...然后点击右边工具栏的样条曲线工具随手画一个不规则的样条曲线。 2、绘制完成后依次点击导航栏的工具、查询、距离,或者直接在命令栏输入“LI”,然...
  •  这是计算机图形学样条曲线绘制或数学上插值函数的问题。首先,例如一条直线,两点可以定义一条直线,而直线的定义式可以写为:y=kx+b,可用一次函数表示;即一阶的曲线(直线)由两个点定义。同理又例如:二阶的...
  • 3:用样条曲线绘制一条曲线作为扫描截面,修改两端的角度值分别与水平和竖直方向成90度 4:选择扫描出的面,点击“镜像”,选择front面为镜像平面,将曲面镜像到另一边 5:我们切换到线框模式,可以看到在没有合并...
  • ·平面绘图:能以多种方式创建直线、圆、椭圆、圆环多边形(正多边形)、样条曲线等基本图形对象。·绘图辅助工具:提供了正交、对象捕捉、极轴追踪、捕捉追踪等绘图辅助工具。正交功能使用户可以很方便地绘制水平、...
  • Bezier曲线类的构造

    2012-05-19 17:36:44
    Bezier 曲线都被定义为知道如何绘制自己了. 因此, 要定义一条Bezier 曲线并实际地画出它, 只须简单地遵循以下几步即可. 第一步: 定义一条Bezier 曲线 BezCurve bezcurve( n) ; 如果欲使该曲线更光滑, 则可进一步设置...
  • = 在上节课程学习中,我们讲解了AutoCAD的对象模型和配置Visual Studio 2013+...在这个dwg文件中可以绘制线段、多段线、圆、圆弧、样条曲线等增加实体(Entity)图形,也可以修改图形位置,打断、镜像、复制、删
  • 在使用浩辰CAD软件绘制图纸的过程中经常会用到各种CAD命令快捷键,比如当需要对CAD图纸中部分图形进行修剪...修剪的对象包括直线、圆、圆弧、样条曲线等。主要使用方法是执行“修剪”命令以后,按照命令行提示选取...

空空如也

空空如也

1 2 3
收藏数 48
精华内容 19
关键字:

如何绘制样条曲线