用B Style曲线吧 但Delphi没有提供的 可是PolyStyle是可以转换为B Style的具体的看相关的书本吧这个是参看代码procedure TCADBStyle.Paint; var i:integer; BP: array[0..3] of TPoint; procedure DrawBStyle(StartPos:integer); var TX, TY: integer; begin TX:=(ControlPointList.Items[StartPos+0].CX-Left+ControlPointList.Items[StartPos+2].CX-Left) div 2; TY:=(ControlPointList.Items[StartPos+0].CY-Top+ControlPointList.Items[StartPos+2].CY-Top) div 2; BP[0].X:=ControlPointList.Items[StartPos+1].CX-Left+(TX-(ControlPointList.Items[StartPos+1].CX-Left)) div 3; BP[0].Y:=ControlPointList.Items[StartPos+1].CY-Top+(TY-(ControlPointList.Items[StartPos+1].CY-Top)) div 3; BP[1].X:=ControlPointList.Items[StartPos+1].CX-Left+(ControlPointList.Items[StartPos+2].CX-Left-(ControlPointList.Items[StartPos+1].CX-Left)) div 3; BP[1].Y:=ControlPointList.Items[StartPos+1].CY-Top+(ControlPointList.Items[StartPos+2].CY-Top-(ControlPointList.Items[StartPos+1].CY-Top)) div 3; BP[2].X:=ControlPointList.Items[StartPos+1].CX-Left+(ControlPointList.Items[StartPos+2].CX-Left-(ControlPointList.Items[StartPos+1].CX-Left))*2 div 3; BP[2].Y:=ControlPointList.Items[StartPos+1].CY-Top+(ControlPointList.Items[StartPos+2].CY-Top-(ControlPointList.Items[StartPos+1].CY-Top))*2 div 3; TX:=(ControlPointList.Items[StartPos+1].CX-Left+ControlPointList.Items[StartPos+3].CX-Left) div 2; TY:=(ControlPointList.Items[StartPos+1].CY-Top+ControlPointList.Items[StartPos+3].CY-Top) div 2; BP[3].X:=ControlPointList.Items[StartPos+2].CX-Left+(TX-(ControlPointList.Items[StartPos+2].CX-Left)) div 3; BP[3].Y:=ControlPointList.Items[StartPos+2].CY-Top+(TY-(ControlPointList.Items[StartPos+2].CY-Top)) div 3; end; begin Inherited; if ControlPointList.Count<4 then Exit; with Canvas do begin Lock; Brush.Style := bsClear; SetPenMode(CADStatus); for i:=0 to ControlPointList.Count-4 do begin DrawBStyle(i); PolyBezier(BP); end; if CADStatus in [cadDistort, cadDeleteControlPoint, cadRotate, cadSelected] then begin MoveTo(ControlPointList.Items[0].CX-Left, ControlPointList.Items[0].CY-Top); Pen.Color := clRed; Pen.Style := psDot; for i:=1 to ControlPointList.Count-1 do LineTo(ControlPointList.Items[i].CX-Left, ControlPointList.Items[i].CY-Top); end; end; for i:=0 to ControlPointList.Count-4 do begin DrawBStyle(i); CADBitmap.Canvas.PolyBezier(BP); end; end;还是自己研究吧,我就只能说这么多的http://lysoft.7u7.net
但Delphi没有提供的
可是PolyStyle是可以转换为B Style的具体的看相关的书本吧这个是参看代码procedure TCADBStyle.Paint;
var i:integer; BP: array[0..3] of TPoint;
procedure DrawBStyle(StartPos:integer);
var TX, TY: integer;
begin
TX:=(ControlPointList.Items[StartPos+0].CX-Left+ControlPointList.Items[StartPos+2].CX-Left) div 2;
TY:=(ControlPointList.Items[StartPos+0].CY-Top+ControlPointList.Items[StartPos+2].CY-Top) div 2;
BP[0].X:=ControlPointList.Items[StartPos+1].CX-Left+(TX-(ControlPointList.Items[StartPos+1].CX-Left)) div 3;
BP[0].Y:=ControlPointList.Items[StartPos+1].CY-Top+(TY-(ControlPointList.Items[StartPos+1].CY-Top)) div 3;
BP[1].X:=ControlPointList.Items[StartPos+1].CX-Left+(ControlPointList.Items[StartPos+2].CX-Left-(ControlPointList.Items[StartPos+1].CX-Left)) div 3;
BP[1].Y:=ControlPointList.Items[StartPos+1].CY-Top+(ControlPointList.Items[StartPos+2].CY-Top-(ControlPointList.Items[StartPos+1].CY-Top)) div 3;
BP[2].X:=ControlPointList.Items[StartPos+1].CX-Left+(ControlPointList.Items[StartPos+2].CX-Left-(ControlPointList.Items[StartPos+1].CX-Left))*2 div 3;
BP[2].Y:=ControlPointList.Items[StartPos+1].CY-Top+(ControlPointList.Items[StartPos+2].CY-Top-(ControlPointList.Items[StartPos+1].CY-Top))*2 div 3;
TX:=(ControlPointList.Items[StartPos+1].CX-Left+ControlPointList.Items[StartPos+3].CX-Left) div 2;
TY:=(ControlPointList.Items[StartPos+1].CY-Top+ControlPointList.Items[StartPos+3].CY-Top) div 2;
BP[3].X:=ControlPointList.Items[StartPos+2].CX-Left+(TX-(ControlPointList.Items[StartPos+2].CX-Left)) div 3;
BP[3].Y:=ControlPointList.Items[StartPos+2].CY-Top+(TY-(ControlPointList.Items[StartPos+2].CY-Top)) div 3;
end;
begin
Inherited;
if ControlPointList.Count<4 then Exit;
with Canvas do
begin
Lock;
Brush.Style := bsClear;
SetPenMode(CADStatus);
for i:=0 to ControlPointList.Count-4 do
begin
DrawBStyle(i);
PolyBezier(BP);
end;
if CADStatus in [cadDistort, cadDeleteControlPoint, cadRotate, cadSelected] then
begin
MoveTo(ControlPointList.Items[0].CX-Left, ControlPointList.Items[0].CY-Top);
Pen.Color := clRed;
Pen.Style := psDot;
for i:=1 to ControlPointList.Count-1 do
LineTo(ControlPointList.Items[i].CX-Left, ControlPointList.Items[i].CY-Top);
end;
end;
for i:=0 to ControlPointList.Count-4 do
begin
DrawBStyle(i);
CADBitmap.Canvas.PolyBezier(BP);
end;
end;还是自己研究吧,我就只能说这么多的http://lysoft.7u7.net