曲线拟合问题(共300分)(100分)

  • 主题发起人 主题发起人 吴优
  • 开始时间 开始时间

吴优

Unregistered / Unconfirmed
GUEST, unregistred user!
AutoCAD中对PolyLine执行PEdit->Fit命令后,每段直线被拟合为2段Arc,谁知道算法?
 
其实这不是曲线的拟和;
在Delphi里,你可以利用Canvas.PolyBezier来实现这一功能。
注意PolyBezier中,点的数目是3*N+1个!
 
AutoCAD中对PolyLine进行Fit后可不是Bezier曲线啊,是用2段Arc来圆滑原线段的,
我想知道具体的算法
 
这应该不需要什么算法吧?
一段线段,你取中点,形成2段,每段作为圆的直径或者是圆上的任意2点的连线,
不就可以做出2段圆弧么?
 
卷兄你没明白我的意思,你用AutoCAD试试就知道了
 
这位朋友详细说说呀,我这里可没有AUTOCAD;
不过我认为不需要什么太高深的算法。
 
下面是一个绝对值偏差最小的拟合过程,也许对您会有所提示。
procedure MEDFIT(X, Y:array of real; NDATA:integer; var A, B, ABDEV:real);
Label 1,2,3;
var
J:integer;
SX,SY,SXY,SXX,DEL,AA,BB,CHISQ,SIGB,B1,F1,B2,F2,ZZ,F:real;
begin
SX:=0;
SY:=0;
SXY:=0;
SXX:=0;
For J:=1 To NDATA do
begin
XT[J]:=X[J];
YT[J]:=Y[J];
SX:=SX + X[J];
SY:=SY + Y[J];
SXY:=SXY + X[J] * Y[J];
SXX:=SXX + Sqr(X[J]);
end;
NDATAT:=NDATA;
DEL:=NDATA * SXX - Sqr(SX);
AA:=(SXX * SY - SX * SXY) / DEL;
BB:=(NDATA * SXY - SX * SY) / DEL;
CHISQ:=0;
For J:=1 To NDATA do
CHISQ:=CHISQ + Sqr(Y[J] - (AA + BB * X[J]));
SIGB:=Sqrt(CHISQ / DEL);
B1:=BB;
F1:=ROFUNC(B1);
If f1 >= 0 then
ZZ:=1
Else
ZZ:=-1;
B2:=BB + Abs(3 * SIGB) * ZZ;
F2:=ROFUNC(B2);
1: If F1 * F2 > 0 Then
begin
BB:=2 * B2 - B1;
B1:=B2;
F1:=F2;
B2:=BB;
F2:=ROFUNC(B2);
GoTo 1;
end;
SIGB:=0.01 * SIGB;
2: If Abs(B2 - B1) > SIGB Then
begin
BB:=0.5 * (B1 + B2);
If (BB = B1) Or (BB = B2) Then GoTo 3;
F:=ROFUNC(BB);
If F * F1 >= 0 Then
begin
F1:=F;
B1:=BB;
end
Else
begin
F2:=F;
B2:=BB;
end;
GoTo 2;
end;
3: A:=AA;
B:=BB;
ABDEV:=ABDEVT / NDATA;
end;
 
to 卷起千堆雪tyn
就是将一系列离散点用光滑曲线相连,我在以前的问题中搜寻了一下,没找到满意的
答案,在AutoCAD中每两个相邻点是用两条圆弧相连的,这比一般的算法的过渡点要少得多
了,就是不知道具体的算法。

to Teny
看不懂,能加些说明或贴出详细代码吗?
 
你试着搜索“三次样条(曲线)”有现成源代码的。
 
那一定是要两段圆弧的交点处的切线方向一致。根据过两点的圆的方程求切线,用循环解两个圆的方程求切线相同的两个圆方程,
当然具体算的时候,要用到一定的计算方法如逼近法:当误差小于一定值时就认为它们相同了。

另外你是如何知道它是圆弧而不是椭圆弧,或其他曲线。好象一般这样的情况(过数据点的)都用三次样条插值来做曲线的。

Bezier一般不过数据点,但卷起千堆雪tyn好象有帖子提过一种过数据点的算法。
 
其实这是B样条曲线的拟和问题;
Bezier曲线与B样条曲线的差别就是:Bezier曲线的实际轨迹不经过控制点,而B样条曲线
经过控制点。当然,你可以通过反求控制点的方法,使Bezier曲线也经过控制点。
具体的方法在“计算机图形学”---清华大学出版社。

你的问题就是B样条曲线的插值、拟和,看看图形学的东东吧。
其实将给定的点作为控制点,利用Bezier曲线也可以实现。
 
在AutoCAD中既不是Bezier曲线也不是样条曲线,只是简单的圆弧光滑曲线,
哪位用过AutoCAD的朋友能告诉我答案呢???
 
请看AutoCAD帮助“拟合曲线, 用于二维多段线”,我指的就是这个意思
里面指的切线方向是怎么算的呢?
 
倒!为什么要这样钻牛角尖!卷兄已经说得很明白了,AutoCAD中的就是B样条曲线!
 
AutoCAD里面的曲线生成用多种选择, 有二次曲线, 也有三次曲线, 有插值曲线也有样条曲线

给你个地址你去看看吧, 那理由曲线平滑算法的Delphi例程:
http://www.efg2.com/Lab/Graphics/Jean-YvesQueinecBezierCurves.htm
 
楼上的谢了!!!!!!!!!!感动!!!!!!!!!!!!!!!
 
如果是由曲线生成圆弧,基本原理三点弧算法
这个效果可以这样来做。
取出所有点,以圆弧 连接点为分界,分成两组,生成弧
 
<<计算方法>>里有公式将一系列离散点用光滑曲线相连
 
首先在线段交点处,两个圆弧的切线重合。
其次对直线拟合出的两段圆弧的交点处理切线也重合。
所有连接的圆弧的切线重合。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
681
import
I
后退
顶部