其中有一项是72 节点数 和40 节点值(很多项)不知道是干什么用的,我只读取控制点后用样条曲线的画法画出发现与AUTOCAD中完全不一致,有哪位大师做这方面的研究,还望不吝赐教(最好能提供c#画法)!dxf中spline的组码说明
==================================================================
70
 样条曲线标志(按位编码):1 = 闭合样条曲线2 = 周期性样条曲线4 = 有理样条曲线8 = 平面16 = 线性(同时还设置平面位) 
 
71
 样条曲线的阶数
 
72
 节点数
 
73
 控制点数
 
74
 拟合点数(如果有)
 
42
 节点公差(默认值 = 0.0000001)
 
43
 控制点公差(默认值 = 0.0000001)
 
44
 拟合公差(默认值 = 0.0000000001)
 
12
 起点切向 — 可以省略(在 WCS 中)DXF:X 值;APP:三维点
 
22, 32
 DXF:起点切向的 Y 值和 Z 值 — 可以省略(在 WCS 中)
 
13
 端点切向 — 可以省略(在 WCS 中)DXF:X 值;APP:三维点
 
23, 33
 DXF:终点切向的 Y 值和 Z 值 — 可以省略(在 WCS 中)
 
40
 节点值(每个节点一个条目)
 
41
 权值(如果不为 1);对于多组对,如果均不为 1,则出现。
 
10
 控制点(在 WCS 中);每个控制点一个条目DXF:X 值;APP:三维点
 
20, 30
 DXF:控制点的 Y 值和 Z 值(在 WCS 中);每个控制点一个条目
 =========================================================
一个dxf文件中的spline的例子
  0
SPLINE
  5
8C2A
330
18
100
AcDbEntity
  8
CLINE
100
AcDbSpline
210
0.0
220
0.0
230
1.0
 70
     8
 71
     3
 72
     9
 73
     5
 74
     0
 42
0.0000000001
 43
0.0000000001
 40
0.0
 40
0.0
 40
0.0
 40
0.0
 40
28.31022754194611
 40
72.80194275596149
 40
72.80194275596149
 40
72.80194275596149
 40
72.80194275596149
 10
401.6090993559208
 20
385.2950340051373
 30
0.0
 10
415.5912372664533
 20
388.4618097172142
 30
0.0
 10
435.4319286571558
 20
397.2950340051373
 30
0.0
 10
445.6090993559207
 20
417.2950340051371
 30
0.0
 10
449.6090993559207
 20
423.5607206357474
 30
0.0

解决方案 »

  1.   

    CAD有自己的画法C#用现成的方法可能搞不定
      

  2.   

    AUTODESK有自己独特的画法?我从网上找了一个nurbs的简单算法试了一下,接近原曲线但与原曲线不同,以下是代码
        public override void Draw(Graphics g, float scale)
        {
            Pen pen = new Pen(contourColor, lineWidth);
            pen.DashStyle = penStyle;
            try
            {
                for (int i = 0; i <= _points.GetUpperBound(0) - 3; i++)
                {
                    double temp = Math.Sqrt(Math.Pow(_points[i + 2].X - _points[i + 1].X, 2F) + Math.Pow(_points[i + 2].Y - _points[i + 1].Y, 2F));
                    int interpol = System.Convert.ToInt32(temp);
                    bsp(_points[i], _points[i + 1], _points[i + 2], _points[i + 3], interpol);
                     //the lines are drawn
                    for (int j = 0; j <= interpol - 2; j++)
                    {
                        g.DrawLine(pen, (float)splinex[j], (float)spliney[j], (float)splinex[j + 1], (float)spliney[j + 1]);
                    }
                }
            }
            catch (Exception e)
            {
                System.Diagnostics.Debug.WriteLine("Polygon:" + e.Message);
            }
            finally
            {
                g.Transform = oldMatrix;
                pen.Dispose();
            }
        }    // calculating the values using the algorithm 
        private void bsp(PointF p1, PointF p2, PointF p3, PointF p4, int divisions)
        {
            double[] a = new double[5];
            double[] b = new double[5];
            a[0] = (-p1.X + 3 * p2.X - 3 * p3.X + p4.X) / 6.0;
            a[1] = (3 * p1.X - 6 * p2.X + 3 * p3.X) / 6.0;
            a[2] = (-3 * p1.X + 3 * p3.X) / 6.0;
            a[3] = (p1.X + 4 * p2.X + p3.X) / 6.0;
            b[0] = (-p1.Y + 3 * p2.Y - 3 * p3.Y + p4.Y) / 6.0;
            b[1] = (3 * p1.Y - 6 * p2.Y + 3 * p3.Y) / 6.0;
            b[2] = (-3 * p1.Y + 3 * p3.Y) / 6.0;
            b[3] = (p1.Y + 4 * p2.Y + p3.Y) / 6.0;        splinex[0] = a[3];
            spliney[0] = b[3];        for (int i = 1; i <= divisions - 1; i++)
            {
                float t = System.Convert.ToSingle(i) / System.Convert.ToSingle(divisions);
                splinex[i] = (a[2] + t * (a[1] + t * a[0])) * t + a[3];
                spliney[i] = (b[2] + t * (b[1] + t * b[0])) * t + b[3];
            }
        }            
      

  3.   

    这里有个源程序用到了节点数和节点值,只不过是C++的程序,有哪位达人能给翻译成C#让在下测试一下?
    http://www.zaoxue.com/article/tech-56890.htm
      

  4.   

    仔细查了些资料,DXF中的spline可能是nurbs曲线,哪位大哥有nurbs曲线的c#代码?
      

  5.   

    你的不是nurbs曲线只是B-spline.