下面我想讨论的是Arc函数,它绘制椭圆曲线。然而,如果不先讨论一下Ellipse函数,那么Arc函数将难以理解;而如果不先讨论Rectangle函数,那么Ellipse函数又将难以理解;而如果讨论Ellipse和Rectangle函数,那么我又会讨论RoundRect、Chord和Pie函数。

问题在于,Rectangle、Ellipse、RoundRect、Chord和Pie函数严格来说不是画线函数。没错,这些函数是在画线,但它们同时又填入画刷填入一个封闭区域。这个画刷内定为白色,因此当您第一次使用这些函数时,您可能不会注意到它们不只是画线。严格地说,这些函数属于后面「填入区域」的小节,不过,我还是在这里讨论它们。

上面提到的函数有一个共同特性,即它们都是依据一个矩形边界框来绘图的。您定义一个包含该对象的框,即「边界框(bounding box)」;Windows就在这个框内画出该物件。

这些函数中最简单的就是画一个矩形:

Rectangle (hdc, xLeft, yTop, xRight, yBottom) ;

点(xLeft, yTop)是矩形的左上角,(xRight, yBottom)是矩形的右下角。用函数Rectangle画出的图形如图5-6所示,矩形的边总是平行于显示器的水平和垂直边。

以前写过图形程序的程序写作者熟悉图素偏差的问题。有些图形系统画出的图形包含右坐标和底坐标,而有些则只画到(而不包含)右坐标和底坐标。Windows采用后一种方法,不过有一种更简单的方法来思考这个问题。

考虑下面的函数呼叫:

Rectangle (hdc, 1, 1, 5, 4) ;

上面我们提到,Windows在边界框内画图。可以将显示器想象成一个网格,其中,每个图素都在一个网格单元内。边界框画在网格上,然后在边界框内画矩形,下面说明了图形画出来时的样子:

我以前提到过,Rectangle严格地说不是画线函数,GDI也填入封闭区域。然而,因为内定用白色填入区域,因此GDI填入区域并不明显。

您知道了如何画矩形,也就知道了如何画椭圆,因为它们使用的参数都是相同的:

Ellipse (hdc, xLeft, yTop, xRight, yBottom) ;

用Ellipse函数画出的图形如图5-7所示(加上了虚线构成的边界框)。

画圆角矩形的函数使用与函数Rectangle及Ellipse函数相同的边界框,还包含另外两个参数:

RoundRect (hdc, xLeft, yTop, xRight, yBottom,

xCornerEllipse, yCornerEllipse) ;

用这个函数画出的图形如5-8所示。

Windows使用一个小椭圆来画圆角,这个椭圆的宽为xCornerEllipse,高为yCornerEllipse。可以想象这个小椭圆分为了四个部分,一个象限一个,每个刚好用在矩形的一个角上。xCornerEllipse和yCornerEllipse的值越大,角就越明显。如果xCornerEllipse等于xLeft与xRight的差,且yCornerEllipse等于yTop与yBottom的差,那么RoundRect函数将画出一个椭圆。

在绘制图5-8所示的圆角矩形时,用了下面的公式来计算角上椭圆的尺寸。

xCornerEllipse = (xRight - xLeft) / 4 ;

yCornerEllipse = (yBottom- yTop) / 4 ;

这是一种简单的方法,但是结果看起来有点不对劲,因为角的弯曲部分在矩形长的一边要大些。要矫正这一问题,您可以让xCornerEllipse与yCornerEllipse的值相等。

Arc、Chord和Pie函数都只要相同的参数:

Arc(hdc, xLeft, yTop, xRight, yBottom, xStart, yStart, xEnd, yEnd) ;

Chord (hdc, xLeft, yTop, xRight, yBottom, xStart, yStart, xEnd, yEnd) ;

Pie(hdc, xLeft, yTop, xRight, yBottom, xStart, yStart, xEnd, yEnd) ;

用Arc函数画出的线如图5-9所示;用Chord和Pie函数画出的线分别如图5-10和5-11所示。Windows用一条假想的线将(xStart, yStart)与椭圆的中心连接,从该线与边界框的交点开始,Windows按反时针方向,沿着椭圆画一条弧。Windows还用另一条假想的线将(xEnd,yEnd)与椭圆的中心连接,在该线与边界框的交点处,Windows停止画弧。

对于Arc函数,这样就结束了。因为弧只是一条椭圆形的线而已,而不是一个填入区域。对于Chord函数,Windows连接弧线的端点。而对于Pie函数,Windows将弧的两个端点与椭圆的中心相连接。弦与扇形图的内部以目前画刷填入。

您可能不太明白在Arc、Chord和Pie函数中开始和结束位置的用法,为什么不简单地在椭圆的周在线指定开始和结束点呢?是的,您可以这么做,但是您将不得不算出这些点。Windows的方法在不要求这种精确性的条件下,却完成了相同的工作。

程序5-3 LINEDEMO画一个矩形、一个椭圆、一个圆角矩形和两条线段,不过不是按这一顺序。程序表明了定义封闭区域的函数实际上对这些区域进行了填入,因为在椭圆后面的线被遮住了,结果如图5-12中所示。

程序5-3 LINEDEMO

LINEDEMO.C

/*---------------------------------------------------------

LINEDEMO.C -- Line-Drawing Demonstration Program

(c) Charles Petzold, 1998

----------------------------------------------------------*/

#include

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,

PSTR szCmdLine, int iCmdShow)

{

static TCHAR szAppName[] = TEXT ("LineDemo") ;

HWND hwnd ;

MSG msg ;

WNDCLASS wndclass ;

wndclass.style = CS_HREDRAW | CS_VREDRAW ;

wndclass.lpfnWndProc= WndProc ;

wndclass.cbClsExtra = 0 ;

wndclass.cbWndExtra = 0 ;

wndclass.hInstance = hInstance ;

wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;

wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;

wndclass.hbrBackground= (HBRUSH) GetStockObject (WHITE_BRUSH) ;

wndclass.lpszMenuName= NULL ;

wndclass.lpszClassName= szAppName ;

if (!RegisterClass (&wndclass))

{

MessageBox (NULL, TEXT ("Program requires Windows NT!"),

szAppName, MB_ICONERROR) ;

return 0 ;

}

hwnd = CreateWindow (szAppName, TEXT ("Line Demonstration"),

WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT, CW_USEDEFAULT,

CW_USEDEFAULT, CW_USEDEFAULT,

NULL, NULL, hInstance, NULL) ;

ShowWindow (hwnd, iCmdShow) ;

UpdateWindow (hwnd) ;

while (GetMessage (&msg, NULL, 0, 0))

{

TranslateMessage (&msg) ;

DispatchMessage (&msg) ;

}

return msg.wParam ;

}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

{

static int cxClient, cyClient ;

HDC hdc ;

PAINTSTRUCT ps ;

switch (message)

{

case WM_SIZE:

cxClient = LOWORD (lParam) ;

cyClient = HIWORD (lParam) ;

return 0 ;

case WM_PAINT:

hdc = BeginPaint (hwnd, &ps) ;

Rectangle (hdc, cxClient / 8, cyClient / 8,

7 * cxClient / 8, 7 * cyClient / 8) ;

MoveToEx (hdc, 0, 0, NULL) ;

LineTo (hdc, cxClient, cyClient) ;

MoveToEx (hdc, 0, cyClient, NULL) ;

LineTo (hdc, cxClient, 0) ;

Ellipse (hdc, cxClient / 8, cyClient / 8,

7 * cxClient / 8, 7 * cyClient / 8) ;

RoundRect (hdc, cxClient / 4, cyClient / 4,

3 * cxClient / 4, 3 * cyClient / 4,

cxClient / 4, cyClient / 4) ;

EndPaint (hwnd, &ps) ;

return 0 ;

case WM_DESTROY:

PostQuitMessage (0) ;

return 0 ;

}

return DefWindowProc (hwnd, message, wParam, lParam) ;

}

求图像边界点坐标c语言,三、Windows图像处理—画点和线(边框函数)相关推荐

  1. c语言坐标画直线函数,三、Windows图像处理—画点和线(直线)

    Windows可以画直线.椭圆线(椭圆圆周上的曲线)和贝塞尔曲线.Windows 98支援的7个画线函数是: LineTo 画直线. Polyline和PolylineTo 画一系列相连的直线. Po ...

  2. 基于c语言的图像边缘检测,基于C语言的医学图像处理的设计

    内容介绍 原文档由会员 莎士比亚 发布 资源包括:正文DOC格式共41页 19611字 摘 要:B超图像作为医学图像的一个部分,具有医学数字图像的某些共性.B超图像处理技术作为医学数字图像处理技术的一 ...

  3. 图像直方图均衡化c语言程序,数字图像处理——直方图均衡化

    1.相关了解 直方图均衡化又称为直方图平坦化.直方图均衡化的基本思想是将原始图像的不均衡的直方图变换为均匀分布的形式.即将输入图像转化为在每一灰度级上都有相同的像素点数(即输出的直方图是平坦的,其分布 ...

  4. c语言中休眠的作用,使用C语言让Windows睡眠/休眠

    使用C语言让Windows睡眠/休眠可以使用SetSystemPowerState函数,但是这个函数需要进程具有SE_SHUTDOWN_NAME(或者_T("SeShutdownPrivil ...

  5. 三点法求点三维坐标实验

    1.实验目的 1)加深对标定原理的理解 2)验证一种单目求三维点坐标的方法 2.实验原理 1) ⎡⎣⎢uv1⎤⎦⎥=⎡⎣⎢1/dx0001/dy0u0v01⎤⎦⎥⎡⎣⎢f000f0001⎤⎦⎥⎡⎣⎢X ...

  6. 测试三角化,利用直接线性变换法求三维点坐标(三维重建task2-1)

    测试三角化,利用直接线性变换法求三维点坐标(三维重建task2-1) 本代码解决的问题:已知相机参数和匹配点,恢复三维点的坐标 这次代码最主要的内容就是:如何把矩阵用代码的形式表示. 然后最终获得:2 ...

  7. R语言ggplot2可视化:使用patchwork包(直接使用加号+)将两个ggplot2可视化结果横向组合、接着再和第三个图像横向组合起来(三幅图各占比例为50%、25%、25%)

    R语言ggplot2可视化:使用patchwork包(直接使用加号+)将两个ggplot2可视化结果横向组合.接着再和第三个图像横向组合起来(三幅图各占比例为50%.25%.25%) 目录

  8. 使用MATLAB求图像的形心、外接矩形顶点坐标并标记

    使用MATLAB求图像的形心.外接矩形顶点坐标并标记 1. 求图像形心使用自带函数regionprops标记 2. 求图像外接矩形顶点坐标并标记 欢迎学习交流! 邮箱: z-@1-6.com 网站: ...

  9. C语言windows.h库的常用函数(三)

    SetCursorPos函数 用途 SetCursorPos函数是windows.h库中用来设置指针位置的函数,使用该函数鼠标指针将会直接跳至指定坐标位置 参数 SetCursorPos函数拥有x和y ...

最新文章

  1. Android短信管家视频播放器代码备份
  2. JavaScript 定义类时如何将方法提取出来
  3. 机器学习:选对时机直线超车
  4. asp.net mvc使用mysql_ASP.NET开发实战——(八)ASP.NET MVC 与数据库之MySQL
  5. c语言程序源代码_程序的编译、链接和执行
  6. 接口自动化测试平台-用例设计的思考
  7. 三跨考研浙江大学计算机,在职三跨浙江大学教育硕士333非全日制考研经验贴
  8. 将长方形木框拉成平行四边形_微课|人教版五年级数学上册6.1平行四边形的面积(P8690)...
  9. 米哈游web前端面试题Js/Vue/浏览器原理等
  10. 大一计算机学实验报告,大学大学计算机实验报告
  11. cshop是什么开发语言_C-SHOP编程是什么
  12. 我在飞机上,飞机在哪里?浅谈飞行模式与GPS定位
  13. 攻防世界 Reverse logmein
  14. 基于Pytorch实现自建数据库的深度神经网络模型案例
  15. [转] iOS 开发者应该知道的 ARM 结构(转自apple4us)
  16. java integer转成负数_Java 十进制和十六制之间的转化(负数的处理)
  17. 在微信小程序中如何下载APP?
  18. linux是实时系统还是分时操作系统
  19. android和rtos相互切换,通用操作系统与实时操作系统(RTOS)比较
  20. android 网络代码是什么意思,Android判断网络状态的代码

热门文章

  1. 技.艺.道:器-python一站式平台Jupyter(丘比特)入门
  2. 4、Hangfire在AspNetCore中的使用(一)
  3. 导入d2lzh_pytorch包会出现的问题以及解决方案
  4. 像素画,治愈系超萌!看了这个,我都心痒了
  5. 孩子不听话家长怎么办
  6. 安卓手机m3u8转为mp4格式100%有效的方法
  7. java 编辑excel文件合并单元格边框显示问题
  8. 一个屌丝程序猿的人生(九十六)
  9. 小伙伴们,线程生命周期、线程池生命周期别再傻傻分不清楚了!!!
  10. siri快捷指令_入门的最佳Siri快捷方式