《计算机图形学实验与课程设计.pdf》由会员分享,可在线阅读,更多相关《计算机图形学实验与课程设计.pdf(83页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 计 算 机 图 形 学 实 验 与 课 程 设 计 张 素 智 编 著 郑 州 轻 工 业 学 院 计 算 机 与 通 信 工 程 学 院 2004年 12月 1 日目 录 刖 5实 验 1 Visual C+图 形 程 序 设 计.4一、实 验 目 的.4二、实 验 任 务.4三、基 础 知 识 和 实 验 步 骤.43.1 Visual C+6.0应 用 程 序 开 发 方 法.43.1.1 Visual C+的 集 成 开 发 环 境.43.1.2 应 用 程 序 工 程 的 建 立 方 法.53.1.3 输 入 源 程 序 进 行 程 序 设 计.83.2 图 形 设 备 接 口 和
2、 图 形 程 序 设 计.103.2.1 图 形 设 备 接 口 简 介.103.2.2 绘 制 基 本 图 形.1 13.2.3 画 笔 与 画 刷.153.2.4 文 本 显 示.193.3 鼠 标 编 程.203.3.1 鼠 标 消 息 处 理.203.3.2 捕 捉 鼠 标.213.3.3 鼠 标 编 程 综 合 小 例.213.4 菜 单 程 序 设 计.263.4.1 菜 单 编 辑 器.273.4.2 菜 单 消 息 响 应.293.4.3 综 合 示 例.29四、实 验 总 结.32实 验 二 基 本 图 形(元)生 成 技 术(一).33、实 验 目 的.33二、实 验 任
3、务.33三、基 本 知 识 和 实 验 步 骤.33任 务 一:实 现 DDA画 线 程 序.33任 务 二、放 大 10倍 后,算 法 演 示 程 序.34任 务 三、加 入 鼠 标 功 能,实 现 交 互 式 画 直 线.36四、实 验 结 果 和 分 析.38五、实 验 总 结.38实 验 三 基 本 图 形(元)生 成 技 术(二).39一、实 验 目 的.39二、实 验 任 务.39三、实 验 内 容.39任 务 一:中 点 画 圆 法 的 扫 描 转 换 算 法.39任 务 二:添 加 鼠 标 程 序,实 现 交 互 式 画 圆.41任 务 三:编 写 中 点 画 椭 圆 法 的
4、扫 描 转 换 程 序.43任 务 四:添 加 鼠 标 程 序,实 现 交 互 式 画 椭 圆.45四、实 验 结 果、分 析 和 总 结.46实 验 四 基 本 图 形 处 理 技 术(一).错 误!未 定 义 书 签。一、实 验 目 的.48二、实 验 任 务.48三、实 验 步 骤.48四、实 验 结 果、分 析 和 总 结.51实 验 五 基 本 图 形 处 理 技 术(二).52一、实 验 目 的.52二、实 验 任 务.52三、实 验 步 骤.52任 务 一:编 码 裁 剪 算 法 的 程 序 设 计.52任 务 二:用 鼠 标 实 现 交 互 式 裁 剪 效 果.55四、实 验
5、结 果 和 总 结.58实 验 六 交 互 式 技 术 和 用 户 接 口.59一、实 验 目 的.59二、实 验 任 务.59三、实 验 内 容 和 实 验 步 骤.59任 务 一:菜 单 程 序 设 计.59任 务 二:AutoCAD交 互 式 绘 图 简 介.63四、实 验 总 结.68实 验 七 曲 线 与 曲 面.69一、实 验 目 的.69二、实 验 任 务.69三、实 验 内 容 和 实 验 步 骤.69任 务 一:抛 物 线 程 序 设 计.69任 务 二:H e rm ite曲 线 程 序 设 计.70任 务 三:B e z ie r曲 线 的 算 法 实 现.71任 务 四
6、:三 次 B样 条 曲 线 的 算 法 实 现.76实 验 八 二 维 儿 何 变 换.78一、实 验 目 的.78二、实 验 任 务.78三、实 验 内 容 和 实 验 步 骤.78任 务 一:根 据 数 学 模 型,编 写 几 何 变 换 程 序.78任 务 二:利 用 鼠 标 实 现 交 互 式 移 动 图 形.81四、实 验 分 析 和 总 结.83实 验 1 Visual C+图 形 程 序 设 计 一、实 验 目 的 Visual C+是 在 Microsoft C 的 基 础 上 发 展 而 来 的,随 着 计 算 机 软、硬 件 技 术 的 快 速 发 展,如 今 Visual
7、 C+已 成 为 集 编 辑、编 译、运 行、调 试 于 一 体 功 能 强 大 的 集 成 编 程 环 境。本 章 以 Visual C+6.0为 对 象,主 要 介 绍 Visual C+集 成 编 成 环 境 的 使 用、图 形 设 备 接 口 和 常 用 图 形 程 序 设 计、鼠 标 编 程 以 及 菜 单 设 计 等 基 础,目 的 是 通 过 对 Visual C+的 学 习,掌 握 VisualC+图 形 程 序 设 计 的 方 法,为 计 算 机 图 形 学 原 理 部 分 的 算 法 实 现 提 供 程 序 工 具 和 方 法。二、实 验 任 务 1.学 习 Visual
8、C+图 形 程 序 设 计 的 方 法;2.掌 握 Visual C+集 成 编 成 环 境 的 使 用、图 形 设 备 接 口 和 常 用 图 形 程 序 设 计、鼠 标 编 程、橡 皮 筋 交 互 技 术、画 刷 与 画 笔 以 及 菜 单 设 计 等;三、基 础 知 识 和 实 验 步 骤 3.1 Visual C+6.0应 用 程 序 开 发 方 法 介 绍 Visual C+6.0集 成 开 发 环 境,以 一 个 简 单 的 实 例 介 绍 利 用 Visual C+应 用 程 序 工 程 建 立 方 法 和 程 序 设 计 框 架。3.1.1 Visual C+的 集 成 开 发
9、 环 境 从 开 始 菜 单 中 启 动 Visual C+6.0,进 入 开 发 集 成 环 境。打 开 一 个 项 目 后,可 以 看 到 VisualC+6.0的 开 发 环 境 由 标 题 栏、工 具 栏、工 作 区 窗 口、源 代 码 编 辑 窗 口、输 出 窗 口 和 状 态 栏 组 成,见 图 3.1所 示。标 题 栏 用 于 显 示 应 用 程 序 名 和 所 打 开 的 文 件 名,标 题 栏 的 颜 色 可 以 表 明 对 应 窗 口 是 否 被 激 活。菜 单 栏 包 括 文 件、编 辑、显 示、插 入、工 程、编 译、工 具、窗 口 和 帮 助 九 项 主 菜 单,包
10、含 了 从 源 代 码 的 编 辑、界 面 设 计、程 序 调 试 和 编 译 运 行 在 内 的 所 有 功 能。工 具 栏 列 出 了 常 用 的 菜 单 命 令 功 能 和 对 象 方 法。工 具 栏 的 下 面 是 两 个 窗 口,一 个 是 工 作 区 窗 口,用 于 列 出 工 程 中 的 各 种 对 象,一 个 是 源 代 码 编 辑 窗 口,用 于 各 个 对 象 的 程 序 设 计。输 出 窗 口 显 示 项 目 建 立 过 程 中 所 产 生 的 各 种 信 息。屏 幕 底 端 是 状 态 栏,它 给 出 当 前 操 作 或 所 选 择 命 令 的 提 示 信 息。菜 单
11、栏 工 作 区 状 态 栏 源 代 码.编 辑 窗 标 题 栏 图 3.1 Visual C+6.0集 成 开 发 环 境 3.1.2 应 用 程 序 工 程 的 建 立 方 法 Visual C+提 供 了 一 种 称 为 App W izard的 工 具,利 用 该 工 具,用 户 可 以 方 便 地 按 照 自 己 的 需 要 创 建 符 合 需 要 的 应 用 程 序 框 架。在 这 个 基 础 上,用 户 可 以 进 一 步 将 自 己 编 写 的 程 序 加 入 到 这 个 框 架 中,实 现 用 户 程 序 的 功 能。下 面 介 绍 建 立 V cA pp应 用 程 序 框 架
12、 的 方 法,其 它 应 用 程 序 的 方 法 都 与 此 类 似。第 一 步:启 动 Visual C+,选 择 工 程 方 法 从 开 始 菜 单 中 选 择 Visual C+,进 入 Visual C+集 成 环 境。从 文 件 菜 单 中 选 择 新 建(New)命 令,弹 出 图 3-2对 话 框。切 换 到 工 程(P ro je c ts)标 签,项 目 类 型 选 择 MFCAppW izard(exe),输 入 工 程 的 名 字(如 V c A p p),选 择 项 目 放 置 的 位 置,然 后 单 击“确 定”按 钮。xs_cea:P 平 村;W l 4|的 图 3
13、-2 Visual C+的 N ew对 话 框第 二 步:设 置 应 用 程 序 的 特 性。这 些 设 置 包 括 六 个 问 题,每 个 问 题 都 有 不 同 的 选 项 供 选 择。一 个 问 题 选 择 完 后,通 过“下 一 步(N e x t)选 择 下 一 个 问 题,直 到 六 个 问 题 选 择 完 毕。还 可 以 通 过“上 一 步(Back)返 回 上 一 个 问 题 重 新 选 择。下 面 继 续 上 面 的 例 子,在 单 击“确 定”按 钮 后,弹 出 第 一 个 问 题 窗 口,如 图 3-3所 示。第 一 个 问 题 是 建 立 什 么 类 型 的 应 用 程
14、 序,有 三 个 选 项:单 个 文 档(Single document),多 重 文 档(Multiple docum ent)和 基 本 对 话(Dialog based)。单 个 文 档 应 用 程 序 主 窗 口 中 只 有 一 个 窗 口,多 重 文 档 可 以 在 主 窗 口 中 开 多 个 子 窗 口,基 本 对 话 主 窗 口 是 一 个 对 话 框。例 中 选 择 单 个 文 档,单 击“确 定”,进 入 下 一 个 问 题,如 图 3-4所 示。第 二 个 问 题 是 数 据 库 的 支 持,是 否 用 O D B C存 取 数 据 库,有 四 个 选 项:不 包 括 数
15、据 库 的 支 持(None)、仅 包 含 O D BC头 文 件(Header files only)、指 定 一 个 数 据 库 但 没 有 文 件 支 持 和 指 定 一 个 数 据 库 但 需 要 文 件 支 持。当 选 择 了 后 两 项,则 需 要 用 户 选 择 一 个 已 经 建 立 的 数 据 库。例 中 不 需 要 数 据 库 支 持,选 择 第 一 个 选 项“否”,进 入 第 三 个 问 题,如 图 3-5所 示。图 3-3 第 一 个 问 题:选 择 应 用 程 序 的 类 型 图 3H 第 二 个 问 题:选 择 是 否 要 用 ODBC支 持第 三 个 问 题 是
16、 对 ActiveX的 支 持。有 五 个 选 项:(1)没 有 对 ActiveX的 支 持;(2)ActiveX容 器,它 可 以 包 含 链 接 和 嵌 入 对 象。容 器 不 能 为 其 它 的 ActiveX程 序 提 供 支 持,它 只 能 维 护 嵌 入 对 象:(3)微 型 服 务 器(Mini-server),应 用 程 序 不 能 独 立 运 行,只 能 被 调 用 为 其 它 程 序 建 立 ActiveX对 象。(4)完 整 服 务 器(Full-server),它 能 够 独 立 运 行,并 能 够 为 其 它 应 用 程 序 建 立 ActiveX对 象。(5)容
17、器 和 服 务 器,一 个 应 用 程 序 可 以 同 时 是 容 器 和 服 务 器。在 例 子 中,选 择 第 一 个 选 项,没 有 对 A ctiveX的 支 持,单 击“下 一 个(Next)进 入 下 一 个 问 题。图 3-5 第 三 个 问 题:选 择 是 否 对 ActiveX的 支 持 第 四 个 问 题 是 应 用 程 序 的 特 性 和 高 级 选 项,如 图 3-6所 示。图 3-6 应 用 程 序 的 特 性 和 高 级 选 项 例 中 全 部 采 用 默 认 选 项,进 入 下 一 个 问 题。第 五 个 问 题 是 项 目 的 风 格、原 文 件 注 释 和 M
18、 FC库 类 型,如 图 3-7所 示。在 例 子 中 全 部 采 用 默 认 选 项,进 入 第 六 个 问 题。第 六 个 问 题 是 确 定 类 名 和 文 件 名,如 图 3-8所 示。基 于 第 一 个 问 题 到 第 五 个 问 题 的 回 答,AppW izard会 把 将 要 建 立 的 新 类 的 名 称 通 知 用 户。AppW izard将 为 应 用 程 序 建 立 四 个 新 类,CVcAppApp是 应 用 程 序 类,它 是 CWinApp的 派 生 类。CMainFrame是 个 拥 有 应 用 程 序 主 窗 口 的 类。CVcAppDoc和 CVcAppVi
19、ew是 该 应 用 程 序 的 文 档 和 视 图 类。这 些 名 字 用 户 可 以 改 变。最 后 单 击“完 成(Finish),显 示 所 建 项 目 的 信 息,单 击“确 定”后,项 目 建 立 完 成。图 3-7 项 目 的 风 格、原 文 件 注 释 和 M FC库 类 型 图 3-8 通 知 M FC产 生 的 类 名 称 3.1.3 输 入 源 程 序 进 行 程 序 设 计 应 用 程 序 项 目 工 程 建 立 以 后,就 为 应 用 程 序 的 开 发 建 立 了 一 个 框 架,这 是 不 输 入 任 何程 序 代 码,对 该 项 目 程 序 进 行 编 译 和 运
20、 行,可 以 生 成 一 个 完 整 的 窗 口 程 序。用 户 根 据 项 目 工 程 中 的 不 同 类,输 入 自 己 设 计 的 程 序 代 码,完 成 用 户 的 程 序 设 计。例 如,从 VcApp Classes中 找 至 CVcAppView的 OnDraw()函 数,如 图 3-9所 示。双 击 OnDraw()函 数,这 时 系 统 会 打 开 VcAppView.cpp文 件,而 且 光 标 正 置 于 OnDraw()函 数 中,在 其 中 输 入 下 列 语 句:pDc-TextOut(30,30,”同 学 们 好,欢 迎 使 用 VC+编 程!):编 译 并 运
21、行 该 程 序,运 行 结 果 如 图 3-10所 示。图 3-9 输 入 程 序 源 代 码 图 3-1 0 运 行 结 果3.2 图 形 设 备 接 口 和 图 形 程 序 设 计 3.2.1 图 形 设 备 接 口 简 介 在 W indow s系 统 中,程 序 都 是 通 过 一 个 叫 做 图 形 设 备 接 口(GDI,Graphics DeviceInterface)的 抽 象 接 口 和 硬 件 打 交 道,Windows会 自 动 将 设 备 环 境 表 映 射 到 相 应 的 物 理 设 备,并 且 会 提 供 正 确 的 输 入/输 出 指 令。G D I是 W ind
22、ows系 统 核 心 的 三 种 动 态 链 接 库 之 一,它 管 理 W indows系 统 的 所 有 程 序 的 图 形 输 出。在 W indows系 统 中,G D I向 程 序 员 提 供 了 高 层 次 的 绘 图 函 数,只 要 掌 握 这 些 绘 图 函 数,就 可 以 很 方 便 地 进 行 图 形 程 序 设 计。另-个 概 念 是 设 备 描 述 表(DC,Device Context),D C是 一 个 数 据 结 构,当 程 序 向 GDI设 备 中 绘 图 时,需 要 访 问 该 设 备 的 DC。M FC将 G D I的 D C封 装 在 C+类 中,包 括
23、CD C类 和 C D C派 生 类,这 些 类 中 的 许 多 成 员 都 是 对 本 地 G D I绘 图 函 数 进 行 简 单 封 装 而 形 成 的 内 联 函 数。D C的 作 用 就 是 提 供 程 序 与 物 理 设 备 或 者 虚 拟 设 备 之 间 的 联 系,除 此 之 外,D C还 要 处 理 绘 图 属 性 的 设 置,如 文 本 的 颜 色 等。程 序 员 可 以 通 过 调 用 专 门 的 G D I函 数 修 改 绘 图 属 性,如 SetTextCoIor。函 数。C D C类 是 G D I封 装 在 M F C中 最 大 的 个 类,它 表 示 总 的 D
24、C。表 3.1列 出 了 C D C中 的 一 些 常 用 绘 图 函 数。表 3.1 C D C类 中 常 用 绘 图 函 数 函 数 描 述 使 用 频 率 Arc()椭 圆 弧*BitBlt()把 位 图 从 一 个 D C拷 贝 到 另 一 个 DC*Draw3dRect()绘 制 三 维 矩 形*DrawDragRect()绘 制 用 鼠 标 拖 动 的 矩 形*DrawEdge()绘 制 矩 形 的 边 缘*Drawlcon()绘 制 图 标*Ellipse()绘 制 椭 圆*FillRect()绘 制 用 给 定 的 画 刷 颜 色 填 充 矩 形*FillRgn()绘 制 用
25、给 定 的 画 刷 颜 色 填 充 区 域*FillSolidRedO 绘 制 用 给 定 的 颜 色 填 充 矩 形*FloodFill()用 当 前 的 画 刷 颜 色 填 充 区 域*FrameRect()绘 制 矩 形 边 界*FrameRgn()绘 制 区 域 边 界*GetBKColor()获 取 背 景 颜 色*GetCurrentB itmap()获 取 所 选 位 图 的 指 针*GetCurrentBrush()获 取 所 选 画 刷 的 指 针*GetCurrentFont()获 取 所 选 字 体 的 指 针*GetCurrentPalette()获 取 所 选 调 色
26、 板 的 指 针*GetCurrentPen()获 取 所 选 画 笔 的 指 针*GetCurrentPosition()获 取 画 笔 的 当 前 位 置*GetDeviceCaps()获 取 显 示 设 备 能 力 的 信 息*这 些 函 数 的 语 法 和 使 用 可 以 通 过 M SDN帮 助 查 询。3.2.2节 主 要 介 绍 W indows中 基 本 图 GetMapMode()获 取 当 前 设 置 映 射 模 式*Getpixel()获 取 给 定 像 素 的 RG B颜 色 值*GetPolyFillMode()获 取 多 边 形 填 充 模 式*GetTextCol
27、or()获 取 文 本 颜 色*GetTextExtent()获 取 文 本 的 宽 度 和 高 度*GetTextMetrics()获 取 当 前 文 本 的 信 息*GetWindow()获 取 D C窗 口 的 指 针*GrayStringO 绘 制 灰 色 文 本*LineTo()绘 制 直 线*MoveTo()设 置 当 前 画 笔 位 置*Pie()绘 制 饼 图*Polygon()绘 制 多 边 形*PolyLine()绘 制 一 组 直 线*RealizePalette()将 逻 辑 调 色 板 映 射 到 系 统 调 色 板*Rectangle()绘 制 矩 形*RoundR
28、ect()绘 制 圆 角 矩 形*SelectObjectO 选 择 G D I绘 图 对 象*SelectPalette()选 择 逻 辑 调 色 板*SelectStockObject()选 择 预 定 义 图 形 对 象*SetBkColor()设 置 背 景 颜 色*SetMapMode()设 置 映 射 模 式*SetPixel()把 像 素 设 定 为 给 定 的 颜 色*SetTextColor()设 置 文 本 颜 色*Stretch Blt()把 位 图 从 一 个 D C拷 贝 到 另 一 个 D C,并 根 据 需 要 扩 展 或 压 缩 位 图*TextOut()绘 制
29、 字 符 串 文 本*形,包 括 电、直 线、圆、圆 弧、矩 形、椭 圆、扇 形、折 线 等 程 序 设 计 3.2.2 绘 制 基 本 图 形(1)画 点 SetPixel。函 数 可 以 在 指 定 的 坐 标 位 置 按 指 定 的 颜 色 画 点。函 数 原 型 说 明 如 下:COLORREF CDC:SetPixel(int X,int Y,COLORREF crColor);其 中,(X,Y)为 点 的 坐 标 位 置,crC olor参 数 为 点 的 颜 色 值。如 果 函 数 调 用 成 功,则 函 数 返 回 像 素 的 颜 色 值,否 则 返 回 值 为-1。颜 色 值
30、 通 过 RGB(Red,Green,Blue)来 设 置,其 中 三 个 参 数 取 值 0255。例 如,在 VcAPP项 目 中,在 CVcAppView类 中 的 OnDraw()函 数 中 加 入 下 列 画 点 语 句:绘 制 一 组 彩 色 点 绘 制 一 组 彩 色 点 pDC-TextOut(20,20,point:);pDC-SetPixel(100,20,RGB(255,0,0);pDC-SetPixel(110,20,RGB(0,255,0);pDC-SetPixel(120,20,RGB(0,0,255);pDC-SetPixel(100,20,RGB(255,255
31、,0);pDC-SetPixel(100,20,RGB(255,0,255);pDC-SetPixel(100,20,RGB(0,255,255);pDC-SetPixel(100,20,RGB(0,0,0);pDC-SetPixel(100,20,RGB(255,255,255);运 行 程 序,查 看 运 行 结 果。(2)画 直 线 和 折 线 画 直 线 需 要 LineTo()和 MoveTo。两 个 函 数 的 配 合 使 用。LineTo。函 数 以 当 前 位 置 所 在 的 点 为 直 线 的 起 点,另 指 定 一 个 点 为 直 线 的 终 点,画 出 一 段 直 线。直
32、 线 的 颜 色 通 过 画 笔 的 颜 色 来 设 定,在 后 面 介 绍。LineToO函 数 原 型 说 明 如 下:BOOLCDC:LineTo(int nXEnd,int nYEnd);直 线 的 终 点 位 置 由(nXEnd,n Y E n d)指 定。如 果 函 数 调 用 成 功,那 么 该 点 就 成 为 当 前 位 置,并 返 回 T R U E,否 则 返 回 FALSE。MoveTo()函 数 只 是 将 当 前 位 置 移 动 到 指 定 位 置,它 并 没 有 画 出 直 线,其 函 数 说 明 为:BOOLCDC:MoveTo(int X,int Y);示 例:
33、在 CVcAppView类 中 的 OnDraw()函 数 中 加 入 下 列 画 点 语 句:绘 制 直 线 pDC-TextOut(20,60;Line:u);pDC-MoveTo(20,90);pDC-LineTo(160,90);Polyline。函 数 用 来 回 一 条 折 线,而 PolyPolyline。函 数 则 用 来 画 多 条 折 线,它 们 的 函 数 原 型 说 明 如 卜.:BOOL CDC:Polyline(COUST POINT*lppt,int ePoints);BOOL CDC:PolyPolyline(COUST POINT*Ippt,COUST DWO
34、RD*IpdwPolyPoints,DWORD cCount);在 Polyline。函 数 中,Ippl是 指 向 折 线 顶 点 数 组 的 指 针,而 cPoim s是 折 线 顶 点 数 组 中 的 顶 点 数。例 如,绘 制 一 条 具 有 4 个 顶 点 的 折 线,程 序 如 下:POINT polylinepoint4=70,240,20,190,70,190,20,240);pDC-Polyline(polylinepoint,4);在 PolyPolyline()函 数 中,Ip p t是 指 向 保 存 顶 点 数 组 的 指 针,而 各 条 折 线 的 顶 点 数 则
35、保 存 在 IpdwPolyPoints参 数 所 指 向 的 数 组 中,最 后 的 cCount参 数 指 定 折 线 的 数 目。例 如:POINT polypolylinePt9=95 J 60,120 J 85,1 20,250,145,160,120,185,90,185,150,185,80,210,160,210;DWORD dwPolyPoinls4=3,2,2,2;分 四 段 折 线,分 别 占 用 3,2,2,2 个 顶 点pDC-PolyPolyline(polypolylinePt,dwPolyPoints,4);注:由 于 一 条 折 线 至 少 需 要 2 个 顶
36、 点,因 此 dwPolyPoints数 组 中 的 数 不 应 该 小 于 2。(3)画 弧 线 和 曲 线 通 过 Arc()函 数 画 弧 线 或 整 个 椭 圆。椭 圆 限 定 在 一 个 矩 形 内,称 为 外 接 矩 形。Arc()函 数 的 圆 形 说 明 如 BOOLCDC:Arc(int nLeftRect,int nTopRect,int nRightRect,int nBottomRect,int nXStartArc,int nYStartArc,int nXEndArc,int nYEndArc);其 中,(nLeftRect,nTopRect)是 外 接 矩 形 的
37、 左 上 角 坐 标 值,(nRightRect,nBottomRect)是 外 接 矩 形 的 右 下 角 坐 标 值。而 椭 圆 中 心 与 点(nXStartArc,nY StartA rc)所 构 成 的 射 线 与 椭 圆 的 交 点 成 为 弧 线 的 起 点,椭 圆 中 心 与 点(nXEndArc,nY E ndA rc)所 构 成 的 射 线 与 椭 圆 的 交 点 成 为 弧 线 的 终 点。椭 圆 上 从 始 点 到 终 点 就 形 成 一 条 弧 线。在 W indow s系 统 中,弧 线 从 始 点 到 终 点 的 方 向 是 逆 时 针 方 向,但 可 以 通 过
38、 SetArcDirection。函 数 将 绘 制 弧 线 方 向 设 置 为 顺 时 针 方 向。示 例,用 Arc()绘 制 圆、圆 弧 和 椭 圆,程 序 如 下:for(i=0;iArc(260-5*i,70-5巧,260+5*1,70+5*i,260+5*i,70,260+5巧,70);)for(i=3;iArc(260-10*i,70-I0*i,260+10*i,7O+IO*i,(int)260+10*i*cos(60*3.1415926/180),(int)70+l 0*i*sin(60*3.14 15926/180),(int)260+10*i*cos(60*3.141592
39、6/180),(int)70-l 0*i*sin(60*3.1415926/180);pDC-Arc(260-10*i,70-10*i,260+10*i,70+10*i,(int)260-l 0*i*cos(60*3.1415926/180),(int)70-l 0*i*sin(60*3.1 4 15926/180),(int)260-10*i*cos(60*3.1415926/180),(int)70+10*i*sin(60*3.14 15926/180);)B ezier曲 线 是 最 常 见 的 非 规 则 曲 线 之 一。Bezier曲 线 属 于 三 次 曲 线,需 要 四 个 控
40、制 顶 点 来 确 定 一 条 B e z ier曲 线,其 中 曲 线 通 过 第 一 点 和 最 后 一 点,并 且 第 一 条 边 和 最 后 一 条 边 是 曲 线 在 起 点 和 终 点 处 的 切 线,从 而 确 定 了 曲 线 的 走 向。PolyBezierO函 数 可 以 画 出 一 条 或 多 条 B ezier曲 线,其 函 数 原 型 说 明 如 下:BOOL CDC:PolyBezier(CONST POINT*Ippt,DWORD ePoints);其 中,Ippt参 数 是 曲 线 控 制 顶 点 所 组 成 的 数 组,ePoints参 数 表 示 Ippt数
41、组 中 的 顶 点 数,条 B ezier曲 线 需 要 四 个 控 制 顶 点。如 果 Ippt数 组 用 于 画 多 条 B ezier曲 线,第 二 条 以 后 的 曲 线 只 需 要 三 个 控 制 顶 点,因 为 后 面 的 曲 线 总 是 把 前 一 条 曲 线 的 终 点 作 为 自 己 的 起 点。示 例,给 出 四 个 控 制 顶 点,画 出 一 一 条 Bezier曲 线 和 特 征 多 边 形。绘 缶 i j B e z ier曲 线 POINT polyBezier4=20,310),60,240,120,300),160,330);pDC-Polyline(polyB
42、ezier,4);pDC-PolyBezier(polyBezier,4);(4)画 封 闭 曲 线 Windows中 提 供 了 一 组 画 封 闭 曲 线 的 函 数,包 括 绘 制 矩 形、多 边 性、椭 圆 等,这 些 画 封 闭 曲 线 的 函 数 不 但 可 以 利 用 画 笔 来 画 出 轮 廓 线,同 时 还 可 以 利 用 画 刷 来 填 充 这 些 封 闭 曲 线 所 围 成 的 区 域。Rectangle。函 数 用 来 画 矩 形,其 函 数 原 型 说 明 如 下:BOOLCDC:Rectangle(int nLeftRect,int nTopRect,int nRi
43、ghtRect,int nBottomRect);其 中,参 数 nL eftR ect和 nTopR ect给 出 了 矩 形 左 上 角 的 坐 标,而 nRightRect和 nBottomRect则 给 出 矩 形 的 右 下 角 坐 标。Ellipse。函 数 的 作 用 则 是 画 椭 圆 形。在 Ellipse。函 数 中,椭 圆 是 山 其 外 接 矩 形 来 确 定 的,外 接 矩 形 的 中 心 与 椭 圆 中 心 重 合,矩 形 的 长 与 宽 和 椭 圆 的 长 短 轴 相 等。函 数 说 明 如 下:BOOLCDC:Ellipse(int nLeftRect,int
44、nTopRect,int nRightRect,int nBottomRect);其 中 的 参 数 说 明 与 Rectangle。函 数 相 同。RoundRect。函 数 用 来 画 圆 角 矩 形,其 函 数 的 原 型 说 明 如 下:BOOL CDC:RoundRect(int nLeftRect,int nTopRect,int nRightRect,int nBottomRect,int nWidth,int nHeight);其 中 的 前 四 个 参 数 与 Rectangle。函 数 相 同,nW idth表 示 圆 角 的 宽 度,nHeight表 示 圆 角 的 高
45、度。Polygon。函 数 用 来 画 封 闭 的 任 意 多 边 形,其 函 数 原 型 说 明 如 下:BOOL CDC:Polygon(COUST POINT*lpPoints,int cCount);其 中 的 参 数 说 明 与 Polyline。函 数 相 同。但 两 个 函 数 有 区 别,Polygon。函 数 会 自 动 将 起点 和 终 点 相 连 形 成 封 闭 的 多 边 形,而 Polyline。函 数 则 画 出 多 条 折 线,只 有 当 最 后 一 点 与 起 点 相 同 时 才 画 出 封 闭 的 多 边 形。示 例,绘 制 矩 形、圆 角 矩 形、椭 圆 和
46、 多 边 形,程 序 如 下:绘 制 矩 形、圆 角 矩 形、椭 圆 和 多 边 形 pDC-Rectangle(190,270,250,310);pDC-RoundRect(265,270,330,310,30,20);pDC-Ellipse(260-50,200-30,260+50,200+30);POINT polygonPts3=390,160,430,220,350,210);pDC-Polygon(polygonPts,3);3.2.3 画 笔 与 画 刷(1)画 笔 当 绘 制 图 形 时,线 条 的 属 性,包 括 颜 色、宽 度、样 式 等 都 是 由 画 笔 来 确 定 的
47、。程 序 员 可 以 创 建 画 笔,定 义 画 笔 的 属 性,从 而 画 出 多 彩 的 图 形。创 建 画 笔 包 括 CreatePen。和 CreatePenlndirect。两 个 函 数。M FC将 这 些 函 数 封 装 在 CPen类 中,这 样 画 笔 就 能 够 被 视 为 对 象 进 行 处 理。下 面 介 绍 创 建 画 笔 的 方 法。方 法 一:直 接 构 造 一 个 CPen对 象,并 将 定 义 画 笔 的 参 数 传 给 它,例 如:CPen pen(PS-SOLID,1,RGB(255,0,0);创 建 一 个 宽 度 为 一 个 像 素、实 线 和 红
48、色 的 画 笔。方 法 二:首 先 声 明 一 个 没 有 初 始 化 的 C Pen类 对 象,然 后 再 用 CreatePen()函 数 定 义 画 笔 的 属 性。例 如,CPen Pen;Pen-CreatePen(PS-SOLID,1,RGB(255AO);方 法 三:先 声 明 一 个 C P en类 对 象 和 一 个 描 述 画 笔 结 构 的 LOGPEN类 对 象,并 填 入 画 笔 的 属 性 值,然 后 调 用 CreatePenlndirect。函 数 来 创 建 画 笔。如 下 所 示:CPen Pen;LOGPEN LogPen;LogPen.lopnStyle
49、=PS_SOLID;LogPen.lopnWidth=1;LogPen.lpenColor=RGB(255,0,0);Pen.CreatePenIndirect(&LogPen);如 果 画 笔 被 成 功 创 建,那 么 两 个 函 数 返 回 T R U E,否 则 返 回 FALSE。画 笔 包 括 样 式、宽 度 和 颜 色 三 个 属 性。表 3.2列 出 了 G D I画 笔 的 样 式。表 3.2 G D I画 笔 的 样 式 样 式 说 明 PS_SOLID 创 建 实 线 笔 PS_DASH 创 建 虚 线 笔,只 有 当 画 笔 宽 度 小 于 或 等 于 1时 有 效 P
50、S_DOT 创 建 点 线 笔,只 有 当 画 笔 宽 度 小 于 或 等 于 1时 有 效 PS.DASHDOT 点 划 线 笔,只 有 当 画 笔 宽 度 小 于 或 等 于 1时 有 效 PS_DASHDOTDOT 双 点 划 线 笔,只 有 当 画 笔 宽 度 小 于 或 等 于 1时 有 效 PS.NULL 创 建 NULL笔,不 绘 制 任 何 图 形PSJNSIDEFRAME 创 建 可 以 在 封 闭 框 架 内 部 绘 制 直 线 的 画 笔。画 笔 的 宽 度 用 像 素 个 数 来 确 定。PS_DASH、PS_DOT、PS_D A SH D O T和 PS_DASHDO