其中有一项是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
==================================================================
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
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];
}
}
http://www.zaoxue.com/article/tech-56890.htm