我有某生产工艺的温度曲线的关键点数据,如何画一条通过这些关键点的光滑曲线呢?不用delphi本身自带的PolyBezier功能。这种画线方式曲线不通过这些关键点。多谢各位指教了。

解决方案 »

  1.   

    用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
      

  2.   

    谢谢 ly_liuyang(Liu Yang) 的指教。 YangYun() ,学过的东西不用也就相当于没学啊,你是觉得你比较聪明吧。