Bezier 样条曲线

Bezier 样条曲线使用四个点来定义:两个端点(起点和终点)和两个控点(用于使其不同程度地弯曲)。

绘制 Bezier 样条曲线

使用 PolyBezier 函数和 PolyBezierTo 函数可以绘制 Bezier 样条曲线:

BOOL PolyBezier(
HDC hdc, // 设备环境句柄
CONST POINT* lppt, // 端点和控制点(顺序是开始点、第一控点、第二控点、终点)
DWORD cPoints // 端点和控点的总数量
);
BOOL PolyBezierTo(
HDC hdc, // 设备环境句柄
CONST POINT *lppt, // 端点和控制点(顺序是第一控点、第二控点、终点)
DWORD cCount // 端点和控点的总数量
);

注:PolyBezierTo 函数把当前位置当做开始点,所以只需要给定其他三个点,函数返回时,当前位置将被设置为终点。

BEZIER 示例程序

#include <windows.h>

void DrawBezier(HDC hdc, POINT apt[]) {
PolyBezier(hdc, apt, ); MoveToEx(hdc, apt[].x, apt[].y, NULL);
LineTo(hdc, apt[].x, apt[].y); MoveToEx(hdc, apt[].x, apt[].y, NULL);
LineTo(hdc, apt[].x, apt[].y);
} LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc;
PAINTSTRUCT ps;
static int cxClient, cyClient;
static POINT apt[]; switch (message) {
case WM_SIZE: cxClient = LOWORD(lParam);
cyClient = HIWORD(lParam); apt[].x = cxClient / ;
apt[].y = cyClient / ; apt[].x = cxClient * / ;
apt[].y = cyClient / ; apt[].x = cxClient * / ;
apt[].y = cyClient * / ; apt[].x = cxClient * / ;
apt[].y = cyClient / ; return ; case WM_LBUTTONDOWN:
case WM_RBUTTONDOWN:
case WM_MOUSEMOVE:
if (wParam & MK_LBUTTON || wParam & MK_RBUTTON) {
hdc = GetDC(hwnd); SelectObject(hdc, GetStockObject(BLACK_PEN));
DrawBezier(hdc, apt); if (wParam & MK_LBUTTON) {
apt[].x = LOWORD(lParam);
apt[].y = HIWORD(lParam);
} if (wParam & MK_RBUTTON) {
apt[].x = LOWORD(lParam);
apt[].y = HIWORD(lParam);
} SelectObject(hdc, GetStockObject(WHITE_PEN));
DrawBezier(hdc, apt); ReleaseDC(hwnd, hdc);
} return ; case WM_PAINT:
InvalidateRect(hwnd, NULL, TRUE);
hdc = BeginPaint(hwnd, &ps); SelectObject(hdc, GetStockObject(WHITE_PEN));
DrawBezier(hdc, apt); EndPaint(hwnd, &ps);
return ; case WM_DESTROY:
PostQuitMessage();
return ;
} return DefWindowProc(hwnd, message, wParam, lParam);
} int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { LPCTSTR lpszClassName = TEXT("BezierDemo");
LPCTSTR lpszWindowName = TEXT("Bezier Demo");
WNDCLASS wndclass;
HWND hwnd;
MSG msg; wndclass.cbClsExtra = ;
wndclass.cbWndExtra = ;
wndclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hInstance = hInstance;
wndclass.lpfnWndProc = WndProc;
wndclass.lpszClassName = lpszClassName;
wndclass.lpszMenuName = lpszWindowName;
wndclass.style = CS_HREDRAW | CS_VREDRAW; if (!RegisterClass(&wndclass)) {
MessageBox(NULL, TEXT("This program requires Windows NT!"), lpszWindowName, MB_ICONERROR);
return ;
} hwnd = CreateWindow(
lpszClassName,
lpszWindowName,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL
); ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd); while (GetMessage(&msg, NULL, , )) {
TranslateMessage(&msg);
DispatchMessage(&msg);
} return msg.wParam;
}

GDI Bezier 样条曲线(7)的更多相关文章

  1. maya中的顶点平滑算法(vertex smooth algorithm)

    继上文继续写.有了顶点迭代器之后就可以利用MItMeshVertex类的getConnectedVertices方法来获取相连点并代入平滑算法. 选择什么样的平滑算法呢?本人比较懒,直接打开了计算机图 ...

  2. WPF 3D 获取鼠标在场景的3d坐标

    原文:WPF 3D 获取鼠标在场景的3d坐标 上一篇中我们谈到了WPF 3d做图的一些简单原理,这里我们简单介绍一下怎样获得鼠标在场景中的3d坐标,知道了3d坐标就可以进行很多操作了: 首先介绍一下3 ...

  3. 样条曲线catmull rom转bezier

    b0,..,b3是贝塞尔,c-1, c2是catmull rom控制点 [b0] = 1 [ 0 6 0 0] [c_1] [b1] - [-1 6 1 0] [c0] [b2] 6 [ 0 1 6 ...

  4. 第5章 绘图基础_5.1-5.4 GDI绘图

    5.1 GDI的原理和结构 (1)提供一种特殊机制彻底隔离应用程序与不同输出设备(eg.显示器或打印机),以便支持 与设备无关的图形. 光栅设备(如显示器.激光打印机):图像是由点构成的矩阵 图形输出 ...

  5. GDI+编程说明及小结

    原文地址:http://blog.csdn.net/byxdaz/article/details/5972759 GDI+(Graphics Device Interface Plus图形设备接口加) ...

  6. GDI+编程小结

    GDI+(Graphics Device Interface Plus图形设备接口加)是Windows XP和Windows Server 2003操作系统的子系统,也是.NET框架的重要组成部分,负 ...

  7. 超全面的.NET GDI+图形图像编程教程

    本篇主题内容是.NET GDI+图形图像编程系列的教程,不要被这个滚动条吓到,为了查找方便,我没有分开写,上面加了目录了,而且很多都是源码和图片~ (*^_^*) 本人也为了学习深刻,另一方面也是为了 ...

  8. B样条曲线曲面(附代码)

    1 B样条曲线 1.1 B样条曲线方程 B样条方法具有表示与设计自由型曲线曲面的强大功能,是形状数学描述的主流方法之一,另外B样条方法是目前工业产品几何定义国际标准——有理B样条方法 (NURBS)的 ...

  9. 【Windows编程】系列第五篇:GDI图形绘制

    上两篇我们学习了文本字符输出以及Unicode编写程序,知道如何用常见Win32输出文本字符串,这一篇我们来学习Windows编程中另一个非常重要的部分GDI图形绘图.Windows的GDI函数包含数 ...

随机推荐

  1. 洛谷 P2709 BZOJ 3781 小B的询问

    题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求$\sum_1^Kc_i^2$的值,其中$c_i$表示数字i在[L..R]中的重复次数.小B请 ...

  2. hdu 1384 查分约束

    #include<stdio.h> /* 要善于挖掘隐含条件 dis[v]-dis[u]>=bian[i].w;一个条件(u,v,bian[i].w); dis[i+1]>=d ...

  3. EF--复杂类型

    介绍EF复杂类型的文章 我理解的复杂类型就是简化了编码的操作,实际上在数据库中还是按照约定生成相应的类似"类名_类名"的表结构 public class CompanyAddres ...

  4. [bzoj2748][HAOI2012]音量调节_动态规划_背包dp

    音量调节 bzoj-2748 HAOI-2012 题目大意:有一个初值,给你n个$\delta$值,求最后不超过给定的限制的情况下的改变的最大值.每个$\delta$值可以+也可以-. 注释:$1\l ...

  5. js 跨浏览器获取事件信息模块

    var EventUtil = { addHandler: function(element, type, handler) { if (element.addEventListener) { ele ...

  6. codechef Little Elephant and Bombs题解

    The Little Elephant from the Zoo of Lviv currently is on the military mission. There are N enemy bui ...

  7. 虚拟机window7与主机之间文件复制设置

    一.需要安装VMware Tools 选中虚拟机>虚拟机>安装VMware Tools 一直点击下一步直至完成 二.设置文件共享 选定实体机需要共享给虚拟机的文件夹,并为该共享起一个名称. ...

  8. 【cl】Unable to find executable for: taskkill

    十二月 02, 2015 5:16:56 下午 org.openqa.selenium.os.ProcessUtils killWinProcess警告: Process refused to die ...

  9. 安装多个版本号jdk后java -version不改变的问题解决

    1.问题 比方先安装了jdk7后,再安装jdk6,java -version就是显示java1.6,即使把JAVA_HOME和path改动为java7的路径,java -version依旧还是显示6. ...

  10. hdoj--1598--find the most comfortable road

    find the most comfortable road Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...