简单几何图形绘制总结

Windows 2D 绘图 (GDI, GDI+, Direct2D) Windows 2D 绘图GDIGDI 函数GDI+GDI 和 GDI+ 的区别GDI+ 新特性Direct2D视觉效果demo GDI GDI 是 Graphics Device Interface 的缩写,含义是图形设备接口,它的主要任务是负责系统与绘图程序之间的信息交换,处理所有 Windows 程序的图形输出。 在 Windows 操作系统下,绝大多数具备图形界面的应用程序都离不开 GDI... 阅读详情

D2D图形分类

Direct2D支持多种类型的几何图形,包括
Simple Geometry(简单几何图形)

  • 矩形
  • 圆角矩形
  • 椭圆

Path Geometry(路径图形)
Composite Geometry(复合图形)

  • Geometry Group(图形组)
  • Transformed Geometry(变换的图形)

各种图形对应的D2D接口如下,所有接口都继承自ID2D1Geometry。

  • 矩形-ID2D1RectangleGeometry
  • 圆角矩形-ID2D1RoundedRectangleGeometry
  • 椭圆-ID2D1EllipseGeometry
  • 路径图形-ID2D1PathGeometry
  • 图形组-ID2D1GeometryGroup
  • 经过变换的图形-ID2D1TransformedGeometry

今天我们先来看一下简单几何图形,其他类型的图形将在后续章节中介绍,上面的简单图形有三种,其实还有一种,就是直线,所以D2D目前支持的简单图形有如下四种。

  • Line - 直线
  • Rectangle - 矩形
  • Rounded Rectangle - 圆角矩形
  • Ellipse - 椭圆

下面逐个介绍每种图形的绘制方法,绘制某种图形是通过Render target对象调用相应的绘图函数来完成的,所以下面的代码都假定Render target对象已经创建好了。

直线

绘制直线使用函数DrawLine,先看一下函数定义,前两个参数分别是直线的起点和终点,第三个参数是画刷。第四个参数是线的宽度,最后一个参数是线的样式,比如实线,虚线或是其他风格的线,你可以使用D2D提供的样式,也可以自己定义样式。由于最后两个参数有默认值,所以我们通常只提供前三个参数即可。最后两个参数在下面的绘图函数中都有出现。

复制代码
virtual void DrawLine(
    D2D1_POINT_2F point0,
    D2D1_POINT_2F point1,
    [in] ID2D1Brush *brush,
    FLOAT strokeWidth = 1.0f,
    [in, optional] ID2D1StrokeStyle *strokeStyle = NULL
) = 0;
复制代码

下面的代码绘制一条黑色直线,起点是(100, 100),终点是(500, 500)。

pRenderTarget->DrawLine(
    D2D1::Point2F(
100.f, 100.f),
    D2D1::Point2F(
500.f, 500.f),
pBlackBrush);

矩形

矩形使用如下的结构体表示。

struct D2D_RECT_F {
    FLOAT left;
    FLOAT top;
    FLOAT right;
    FLOAT bottom;
};

绘制矩形使用函数DrawRectangle,定义如下。第一个参数是D2D1_RECT_F结构,表示待绘制的矩形,第二个参数是使用的画刷,第三个参数是一个大于或等于 0.0f 的值,它指定矩形笔画的宽度。笔画位于矩形轮廓正中。,最后一个参数是要绘制的笔画的样式,或 NULL 以绘制实线笔画。

void DrawRectangle(
    [
refconst D2D1_RECT_F &rect,
    [
in] ID2D1Brush *brush,
    FLOAT strokeWidth 
=1.0f,
    [
in, optional] ID2D1StrokeStyle *strokeStyle = NULL
);

下面的代码绘制一个矩形,该矩形的左上角坐标是(100, 100),右下角坐标是(500, 500)。

pRenderTarget->DrawRectangle(
    D2D1::RectF(
100.f, 100.f, 500.f, 500.f),
    pBlackBrush
);

圆角矩形

D2D支持圆角矩形,先看看什么是圆角矩形。

可见圆角矩形就是常规矩形的改版,将尖角用圆弧代替即可。所以一个圆角矩形可以由一个普通矩形加上两个半径构造而成,这两个半径分别表示椭圆的X轴和Y轴,而这个椭圆则用来取代矩形的尖角。圆角矩形的定义如下:第一个参数是一个常规矩形,上面已经介绍过,后两个参数分别是椭圆的X轴半径和Y轴半径。

D2D1_ROUNDED_RECT RoundedRect(
    __in 
const D2D1_RECT_F &rect,
    FLOAT radiusX,
    FLOAT radiusY
);

绘制圆角矩形的函数定义如下,第一个参数是一个圆角矩形,后面的参数不再赘述。

void DrawRoundedRectangle(
    [
refconst D2D1_ROUNDED_RECT &roundedRect,
    [
in] ID2D1Brush *brush,
    FLOAT strokeWidth 
=1.0f,
    [
in, optional] ID2D1StrokeStyle *strokeStyle = NULL
);

下面的代码绘制一个圆角矩形,其左上角坐标是(100, 100),右下角坐标是(500, 500)。圆角的X轴半径是30,Y轴半径是50。

D2D1_ROUNDED_RECT roundedRect = D2D1::RoundedRect(
    D2D1::RectF(
100.f, 100.f, 500.f, 500.f),
    30.0f,
    50.0f
);
pRenderTarget
->DrawRoundedRectangle(roundedRect, pBlackBrush, 1.0f) ;

椭圆

椭圆由如下所示的结构体定义,第一个参数是椭圆的中心,后两个参数分别是X轴半径和Y轴半径。

struct D2D1_ELLIPSE {
    D2D1_POINT_2F point;
    FLOAT radiusX;
    FLOAT radiusY;
};

绘制椭圆的函数定义如下

void DrawEllipse(
    [
refconst D2D1_ELLIPSE &ellipse,
    [
in] ID2D1Brush *brush,
    FLOAT strokeWidth 
=1.0f,
    [
in, optional] ID2D1StrokeStyle *strokeStyle = NULL
);

下面的代码绘制一个椭圆,中心在(100, 100),长轴半径100,短轴半径50。

D2D1_ELLIPSE ellipse = D2D1::Ellipse(D2D1::Point2F(100.0f100.0f), 100.0f50.0f) ;
pRenderTarget
->DrawEllipse(ellipse, pBlackBrush) ;

三角形

D2D没有提供绘制三角形的函数,不过我们可以使用DrawLine函数自己实现一个,代码很简单,对于给定的三个顶点,在每两个顶点之间调用上面的DrawLine函数即可。

复制代码
void DrawTriangle(D2D1_POINT_2F p0, D2D1_POINT_2F p1, D2D1_POINT_2F p2,
    ID2D1HwndRenderTarget
* pRenderTarget, 
    ID2D1Brush
* brush,
    FLOAT strokeWidth 
=1.0f,
    ID2D1StrokeStyle 
*strokeStyle = NULL)
{
    pRenderTarget
->DrawLine(p0, p1, brush);
    pRenderTarget
->DrawLine(p1, p2, brush) ;
    pRenderTarget
->DrawLine(p2, p0, brush) ;
}
复制代码

D2D同样没有提供绘制圆的函数,因为圆是特殊的椭圆,可以通过绘制椭圆的函数来实现,只要使X轴半径和Y轴半径相等即可。

复制代码
void DrawCircle(D2D1_POINT_2F center, FLOAT radius,
    ID2D1HwndRenderTarget
* pRenderTarget,
    ID2D1Brush
* brush,
    FLOAT strokeWidth 
=1.0f,
    ID2D1StrokeStyle 
*strokeStyle = NULL
)
{
    D2D1_ELLIPSE ellipse 
= D2D1::Ellipse(center, radius, radius) ;
    pRenderTarget
->DrawEllipse(ellipse, brush) ;
}

线条的宽度

每个DrawXXX函数都有一个参数strokeWidth,代表的是线条的宽度,这个函数有个默认值1.0,所以通常情况下我们无需指定这个参数,但如果想让线条宽一些,那么可以设置成10.0,100.0等等,那么这个宽度是如何增长的呢?会影响图形的大小么?

通过实际绘图发现,这个宽度是向外增长的,也就是说线条的宽度不会影响图形的填充区域,比如一个10 x 10的矩形,当线条宽度是1.0时,它的填充面积是100,当线条宽度是10时,它的填充面积还是100。请看下图,黑色是线条颜色,黄色是填充色,可见无论线条多宽,黄色区域的面积始终不变。所以strokeWidth并不影响图形的填充区域。


SQL也疯狂:MySQL绘制简单几何图形(2013-04-12) 前言 用SQL SELECT 语句而非存储过程来基本几何图形,以加深对 SELECT 语句的理解。因为 SELECT 语句隐含了一个或多个循环,看上去只是一个语句,其实包含了一个完整的程序所包含的顺序、分支、循环,因此不必用存储过程就能实现一般的程序的功能 准备数据 需要有一个表有 100 行以上的数据,数据是什么没关系,因为下面的语句已经避开使用数据库记录中的数据了。如果没有现成 阅读详情

相关推荐

opencv3 for python 之 创建图片绘制简单几何图形

opencv3 for python 之 创建图片绘制简单几何图形

jacke121的专栏 6707

用gdi/gdi+/D2D三种方式以直线的方式圆-易语言

的圆不是正圆, 不知道是我计算有误, 还是这个方法不能出一个正圆 没啥技术难度, 学学D2D, 拿来试试手

Direct2D编程实践:18个示例精通指南

本文还有配套的精品资源,点击获取 简介:Direct2D是一种高效的2D图形渲染API,支持硬件加速,广泛应用于Windows平台。本压缩包包含18个实用示例,覆盖Direct2D的各个方面,包括基础概念、核心组件、关键功能和高级应用。通过学习这些示例,开发者能深入理解Direct2D API的使用,掌握其在实际开发中的应用,包括绘制操作、文本渲染、图像处理及动效果,从而...

weixin_30021053的博客 2621

Direct2D绘制多种风格的线条

使用Direct2D高效(比GDI,GDI+快几倍)绘制多种风格的线条,作者使用VS2012编译,压缩包内仅包含一个cpp文件,所以方便转换到其他VisualStudio版本.zip

Direct2D 介绍

最近做了一个项目,需要使用Windows的2D渲染技术,对GDI、Direct2D、Direct3D、opengl等图像渲染库做了一个比较,发现使用Direct2D是最优的。因为它既没有Direct3D和Opengl使用的复杂度,又具有硬件加速功能(GDI没有硬件加速功能)。所以最终决定使用Direct2D来作为本项目的图形渲染库,但是在使用Direct2D的时候发现了一个问题,就是网上关于Direct2D的学习资料太少了(在百度上搜索了一下,发现一本书籍也没有),唯一的学习资料就是MSDN。为了能让更多的

萧戈的专栏 3465

OpenGL第二讲——绘制简单几何图形

OpenGL绘制点、直线和多边形

weixin_47524903的博客 958

Android之Graphics 简单绘制几何图形

Android之Graphics 简单绘制几何图形 如果对javaSE 里面2D图形编程有点了解的人 ,估计搞android几何绘图不是什么难事,主用用到API中canvas(布)Paint类 主要用此类来进行绘(只讲简单的图形绘制,后期会用模仿做一个图工具类似于腾讯QQ涂鸦)以下是Canvas常用方法  具体更详细部分可参考API canvas  Canvas():

sanjiaozhen的专栏 568

2.绘制简单几何图形

一、点、直线和多边形   数学上的点,只有位置,没有大小。但在计算机中,无论计算精度如何提高,始终不能表示一个无穷小的点。另一方面,无论图形输出设备如何精确,   始终不能输出一个无穷小的点。一般情况下,OpenGL中的点将被成单个的像素,虽然它可能足够小,但并不会是无穷小。   同一像素上,OpenGL可以绘制许多坐标只有稍微不同的点,但该像素的具体颜色将取决于OpenGL的实...

diandao9056的博客 260

OpenCv绘制简单几何图形

opencv常用绘制方法前言1.直线lineline的函数原型如下使用方法2.箭头arrowedLinearrowedLine的函数原型如下使用方法3.矩形rectangle、rectangle的函数原型如下使用方法4.圆circlecircle的函数原型如下使用方法5.椭圆ellipseellipse的函数原型如下使用方法6.多边形polylinespolylines的函数原型如下使用方法7.文字putTextputText的函数原型如下使用方法8.不常见功能绘制标记drawMarkerdrawMarke

u012505629的博客 993

OpenGL入门学习[二] 绘制简单几何图形

OpenGL入门学习[二] 本次课程所要讲的是绘制简单几何图形,在实际绘制之前,让我们先熟悉一些概念。 一、点、直线和多边形 我们知道数学(具体的说,是几何学)中有点、直线和多边形的概念,但这些概念在计算机中会有所不同。 数学上的点,只有位置,没有大小。但在计算机中,无论计算精度如何提高,始终不能表示一个无穷小的点。另一方面,无论图形输出设备(例如,显示器)如何精确,始终不能输出

yanziguilai的专栏 2004

用canvas绘制简单几何图形

canvas的基本操作,简单几何图形,没有废话,一看就会

qq_57220516的博客 797

Direct2D学习教程(一)(原)

㈠ 关于Direct2D Direct2D是一个硬件加速的,提供立即模式的二维图形API。它提供了二维的几何体,位图,文本的高性能,高质量的渲染。十分方便的是,Direct2D与GDI,GDI+和D3D都是可以交互的。一项技术总是有其受众面,看看微软本身怎么说的: 大型企业级本机应用程序开发人员。 创建供下游开发人员使用的控件工具包和库的开发人员。 需要对二维图形...

weixin_30732487的博客 907

Direct2D 第6篇 绘制多种风格的线条

Direct2D 第6篇 绘制多种风格的线条 原文:Direct2D 第6篇 绘制多种风格的线条 上图是使用Direct2D绘制的线条,Direct2D在效率上比GDI/GDI+要快几倍,GDI/GD...

weixin_30856725的博客 373

002:CWnd类中采用D2D绘制,并测试帧率

在001中,D2D绘制的代码直接放在了对话框类中,实际使用过程中,通常是继承CWnd来实现显示窗口,因此本例子实现在CWnd子类中采用D2D进行绘制,并测试FPS,后续会与GDI和GDI+的绘制帧率进行对比。

伍心的专栏 952

Direct2D教程(二)来看D2D世界中的Hello,World

引子 任何一门语言的第一个教程几乎都是Hello,world。我们也不例外,但是这里不是教大家打印Hello,world,而是编写一个简单的D2D绘制程序,让大家对Direct2D的程序结构及编程方法有一个基本的认识。下面我们来看如何一步一步绘制一个矩形。 基本概念 在开始之前,还是先介绍一些基本的概念,有助于大家理解程序,这些概念包括,Brush(刷),Render target(渲染目...

weixin_33889245的博客 430

Direct2D 快速入门

Direct2D是一个用于创建2D图形的本地代码、即时模式API。本文演示了如何通过一个典型的Win32应用程序使用Direct2D绘制图像到窗口上。 本文包含以下部分: 一个简单的矩形 步骤1:包含Direct2D头文件 步骤2:创建一个ID2D1Factory接口对象 步骤3:创建一个ID2D1HwndRenderTarget接口对象 步骤4:创建一个刷对象 步骤5:绘制矩形 步骤6:释放资源 创建一个简单的Direct2D应用程序 一个简单的矩形 要使用GDI绘制矩形,您需要

萧戈的专栏 2949
上一篇: D2D第一个程序详解
下一篇: D2D之五——Path Geometry
yoki君
博客等级 码龄10年 1粉丝 5原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值