主要的问题是我用鼠标在Image上描点,然后用贝赛尔曲线连接,但是有两个问题,第一个是最后形成的贝赛尔曲线,没有把有些点串起来,曲线是在这些点的范围内,如何让该曲线全部经过所描的点。第二个问题是,曲线好像还不怎么平滑,如何能让曲线更平滑。哪位高手能解决,能给些例子吗?

解决方案 »

  1.   

    请参见GDIPlus Pascal Objects. 我贴一段Bezier代码(我自己的CAD系统各种元素全部都是采用GDIPlus来绘制的,效果特佳。特别喜欢反锯齿效果,平滑得不得了)
    代码是老外的,我原封给送上,希望能有点帮助,其中用到了2个单元GDIPAPI,GDIPOBJuses
      Windows,
      Messages,
      SysUtils,
      GDIPAPI,
      GDIPOBJ;
    Procedure OnPaint(DC: HDC);
    var
      graphics : TGPGraphics;
      p1, c1, c2, p2: TGPPoint;
      Pen: TGPPen;
    begin
      graphics := TGPGraphics.Create(DC);
      p1 := MakePoint(10 , 100); // start point
      c1 := MakePoint(100, 10 ); // first control point
      c2 := MakePoint(150, 150); // second control point
      p2 := MakePoint(200, 100); // end point
      pen:= TGPPen.Create(MakeColor(255, 0, 0, 255));
      graphics.DrawBezier(pen, p1, c1, c2, p2);
      Pen.Free;
      graphics.Free;
    end;
    function WndProc(Wnd : HWND; message : UINT; wParam : Integer; lParam: Integer) : Integer; stdcall;
    var
      Handle: HDC;
      ps: PAINTSTRUCT;
    begin
      case message of
        WM_PAINT:
          begin
            Handle := BeginPaint(Wnd, ps);
            OnPaint(Handle);
            EndPaint(Wnd, ps);
            result := 0;
          end;    WM_DESTROY:
          begin
            PostQuitMessage(0);
            result := 0;
          end;   else
          result := DefWindowProc(Wnd, message, wParam, lParam);
       end;
    end;var
      hWnd     : THandle;
      Msg      : TMsg;
      wndClass : TWndClass;
    begin
       wndClass.style          := CS_HREDRAW or CS_VREDRAW;
       wndClass.lpfnWndProc    := @WndProc;
       wndClass.cbClsExtra     := 0;
       wndClass.cbWndExtra     := 0;
       wndClass.hInstance      := hInstance;
       wndClass.hIcon          := LoadIcon(0, IDI_APPLICATION);
       wndClass.hCursor        := LoadCursor(0, IDC_ARROW);
       wndClass.hbrBackground  := HBRUSH(GetStockObject(WHITE_BRUSH));
       wndClass.lpszMenuName   := nil;
       wndClass.lpszClassName  := 'GettingStarted';   RegisterClass(wndClass);   hWnd := CreateWindow(
          'GettingStarted',       // window class name
          'Drawing B閦ier Splines',       // window caption
          WS_OVERLAPPEDWINDOW,    // window style
          Integer(CW_USEDEFAULT), // initial x position
          Integer(CW_USEDEFAULT), // initial y position
          Integer(CW_USEDEFAULT), // initial x size
          Integer(CW_USEDEFAULT), // initial y size
          0,                      // parent window handle
          0,                      // window menu handle
          hInstance,              // program instance handle
          nil);                   // creation parameters   ShowWindow(hWnd, SW_SHOW);
       UpdateWindow(hWnd);   while(GetMessage(msg, 0, 0, 0)) do
       begin
          TranslateMessage(msg);
          DispatchMessage(msg);
       end;
    end.
      

  2.   

    后面一段是WIN32绘制窗口的代码,你可以不去管它