关于贝赛尔曲线的问题,请各位高手指教 主要的问题是我用鼠标在Image上描点,然后用贝赛尔曲线连接,但是有两个问题,第一个是最后形成的贝赛尔曲线,没有把有些点串起来,曲线是在这些点的范围内,如何让该曲线全部经过所描的点。第二个问题是,曲线好像还不怎么平滑,如何能让曲线更平滑。哪位高手能解决,能给些例子吗? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 请参见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. 后面一段是WIN32绘制窗口的代码,你可以不去管它 我想下个DELPHI5.有谁能提供下载地址吗 IDUDPSERVER控件换端口后为什么还是只能收到原端口的信息 如何自定义键盘布局 怎么让我的程序成为屏幕中的一个线程? stringgrid提問! 各位大哥、大姐,救命啊!!!(100分) 简单的insert问题 如何运行源代码 大家给个建议:500元以内买什么型号的傻瓜相机好些??? 非计算机专业的同仁,特别是化学专业的,请教了!!(UP给分) DELPHI cmd 命令求助 一个图像处理的算法问题,请教大家?
代码是老外的,我原封给送上,希望能有点帮助,其中用到了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.