在AutoCAD中生成贝塞尔曲线

摘要:
贝塞尔曲线的定义贝塞尔曲线由法国雷诺公司的设计师皮埃尔·贝泽尔设计。其具体定义如下:Pi称为曲线的控制向量,它们所形成的连续多段线称为曲线控制多边形;T∈ [0,1],即t从0到1连续变化时产生的曲线称为贝塞尔曲线。

贝赛尔曲线的定义 

贝塞尔曲线(Bézier curve)是由法国雷诺公司的设计师Pierre Bézier设计。它的具体定义如下:

    

在AutoCAD中生成贝塞尔曲线第1张

       

      其中Pi(i=0,1,2,...n)称作曲线的控制向量,他们组成的连续多段线叫做曲线的控制多边形; t ∈[0,1],即 t 从0连续变化到1时所生成的曲线就叫做贝赛尔曲线。而函数:

    在AutoCAD中生成贝塞尔曲线第2张

  叫做贝塞尔基函数(Bézier basis functions),也叫做伯恩斯坦多项式(Bernstein polynomials)它的定义如下:

在AutoCAD中生成贝塞尔曲线第3张


其中n!=1*2*3*...*n 即n的阶乘函数。

参考:http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/spline/Bezier/bezier-construct.html

Bezier曲线的生成算法
 

在 http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/spline/Bezier/de-casteljau.html  介绍了一个生成Bezier曲线上点的算法:

在AutoCAD中生成贝塞尔曲线第4张

在AutoCAD中生成贝塞尔曲线第5张

实现的代码

 

以下是在AutoCAD 2011 x64 中实现的代码,其他版本大同小异(vba实现):

Sub bezier()
    Dim i As Long, j As Long, m As Long, n As Long
    Dim Coor As Variant, BezierPs() As Double, p(2) As Double
    Dim t As Double, s As Double, DeltaT As Double
    Dim SelecPoly As AcadSelectionSet
    Dim pointObj As AcadPoint, BezierL As AcadPolyline
    Dim pointID(10000000) As Double
    
    'delete all selection sets
    i = 0
    Do While ThisDrawing.SelectionSets.Count > 0
        ThisDrawing.SelectionSets.Item(i).Delete
        i = i + 1
    Loop

 'select a polyline in your drawing
    Set SelecPoly = ThisDrawing.SelectionSets.Add("ControlPoly")
    SelecPoly.SelectOnScreen
                                        
    'draw vertices of the Bezier Curve
    DeltaT = 0.001
    i = j = m = 0
    n = UBound(SelecPoly.Item(0).Coordinates) - 1
    Do While t <= 1 + DeltaT
        s = 1 - t
        Coor = SelecPoly.Item(0).Coordinates
        For i = 1 To n / 2
            For j = 0 To n - 2 * i Step 2
                Coor(j) = s * Coor(j) + t * Coor(j + 2)
                Coor(j + 1) = s * Coor(j + 1) + t * Coor(j + 3)
            Next
        Next
        p(0) = Coor(0): p(1) = Coor(1): p(2) = 0
        Set pointObj = ThisDrawing.ModelSpace.AddPoint(p)
        pointObj.Visible = True
        pointID(m) = pointObj.ObjectID32 'store the objectIDs of points
        m = m + 1
        t = t + DeltaT
    Loop
    
    'draw polyline to approximate Bezier Curve
    ReDim BezierPs(3 * m - 1)
    j = 0
    For i = 0 To 3 * m - 3 Step 3
        Set pointObj = ThisDrawing.ObjectIdToObject32(pointID(j))
        BezierPs(i) = pointObj.Coordinates(0)
        BezierPs(i + 1) = pointObj.Coordinates(1)
        BezierPs(i + 2) = pointObj.Coordinates(2)
        j = j + 1
    Next
    Set BezierL = ThisDrawing.ModelSpace.AddPolyline(BezierPs)
    
    'delete points
    For i = 0 To m - 1
        Set pointObj = ThisDrawing.ObjectIdToObject32(pointID(i))
        pointObj.Delete
    Next
End Sub

下面是生成的曲线效果图:

    

在AutoCAD中生成贝塞尔曲线第6张

免责声明:文章转载自《在AutoCAD中生成贝塞尔曲线》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇LaravelS[WPF](小结4)TreeView的数据分层模板下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

AutoCAD VBA单行文字转换为多行文字

AutoCAD VBA单行文字转换为多行文字,多行文字便于编辑,代码如下。 Public Sub TextToMtext() On Error Resume Next Dim ptInsert As Variant Dim txtStr As String Dim height As Double Dim width As Double Dim SSet...

AutoCAD自动加载DLL文件的方法

让CAD打开以后自动加载DLL文件的步骤如下:      1.找到你CAD目录的安装目录的启动支持文件,例如:C:\Program Files\AutoCAD 2006\Support\acad2006.lsp      2.打开acad2006.lsp文件 ,在最后输入(command "netload" "E:\\PowerSupplyManager\...

穿过已知点画平滑曲线(3次贝塞尔曲线)

tyle="margin:20px 0px 0px; font-size:14px; line-height:26px; font-family:Arial; color:rgb(51,51,51)"> 为了把一串点连成光滑的曲线,先研究贝塞尔曲线,又搞B样条插值。。。。都没有成功(数学没那么强)。 后来在 “[翻译] AGG 之贝塞尔插值”http...

AutoCAD批量导出点坐标

需求背景: 需要批量导出DWG文件中的散点树的位置信息,以Excel文件格式存储。 实现方法: 在AutoCAD2012打开dwg文件,点击“插入”选项卡中的“提取数据”工具(或输入DATAEXTRACTION命令): 选择“创建新数据提取” 选择需要导出的对象 设置导出参数 选择输出Excel文件保存路径 导出结果: 总结: 该工具...

用C#.Net实现AutoCAD块属性提取

 ____这是我以前写过的一篇文章,也是SmartSoft中用到的,作为SmartSoft专题的一部分转贴到这里,与大家共享。此类实现AutoCAD块属性提取功能,在VS.Net2003(2005)+AutoCAD2004(2007)下调试通过。   using System;using AutoCAD=Autodesk.AutoCAD.Interop...

C# 实现预览dwg文件完整源代码(无需autocad环境)

using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.IO; namespace WindowsApplica...