8.1引言

圆是椭圆的一种,只不过是长短轴半径相等而已。在AGG中,必须给定椭圆的长短半轴的半径,才能够绘制椭圆。将横坐标半径称为rx,纵坐标半径称为ry。并且可以指定绘制的方向,是顺时针,还是逆时针。提供了一个参数,可以实现内接多边形的渲染。

8.2 函数定义

类定义文件:include/agg_ellipse.h

类的构造函数:       ellipse(double x, double y, double rx, double ry,

unsigned num_steps=0, boolcw=false)

参数说明:x是圆心的X坐标,y是圆心的Y坐标,rx是圆形的X半径,ry是圆形的Y半径,当rx不等于ry的时候,渲染出来的实际上是一个椭圆,具体可调整参数根据第三和第四个参数可以了解到圆形可以是一个扁平的圆形,不一定就是一个规规矩矩的圆形。如果指定num_steps值,构建的是一个圆内接多边形。cw是顺时针,还是逆时针渲染。

8.3 例子回放

1)渲染实心圆

说明:在渲染的过程中,跳过agg::conv_stroke显示扩展线(也就是边界,下面有实例说明),绘制的是一个实心圆。

代码如下:

agg::ellipse ell(200,200,50,100);

ras.add_path(ell);

agg::render_scanlines_aa_solid(ras,sl,renb,agg::rgba8(255,0,0));

ras.reset();

2)渲染空心圆

agg::ellipse ell(200,200,50,100);

typedef agg::conv_stroke< agg::ellipse >ell_stroke;

ell_stroke stroke(ell);

ras.add_path(stroke);

agg::render_scanlines_aa_solid(ras,sl,renb,agg::rgba8(255,0,0));

ras.reset();

3)渲染虚线的空心圆

agg::ellipseell(200,200,50,100);

typedef agg::conv_dash<agg::ellipse> ell_cd_type;

ell_cd_type cdccell(ell);

cdccell.add_dash(5,5);

typedef agg::conv_stroke<ell_cd_type> ell_cc_cs_type;

ell_cc_cs_type csccell(cdccell);

ras.add_path(csccell);

rensl.color(agg::rgba8(255,0,0));

agg::render_scanlines(ras,sl,rensl);

ras.reset();

通过构建agg::conv_dash模板,然后创建给agg::conv_stroke实现了虚线的描绘。

4)仿射变换

主要是进行旋转,平移,缩放,圆心进行了偏移,如果需要回到当初的位置,平移肯定是必须的,这一点和agg::conv_contour扩展轮廓线不同。

代码如下:

agg::ellipse ell(200,200,50,100);

//坐标转换

agg::trans_affine mtx;

mtx.scale(0.5,1); //x轴缩小到原来的一半

mtx.rotate(agg::deg2rad(30));//旋转30度

mtx.translate(200,200);//X,Y坐标分别平移100

typedef agg::conv_transform<agg::ellipse> ell_ct_type;

ell_ct_type ctell(ell,mtx); //矩阵变换

typedef agg::conv_dash<ell_ct_type> ell_cd_type;

ell_cd_type cdccell(ctell);

cdccell.add_dash(5,5);

typedef agg::conv_stroke<ell_cd_type> ell_cc_cs_type;

ell_cc_cs_type csccell(cdccell);

摘自:http://www.cnblogs.com/CoolJie/archive/2011/04/27/2030122.html

5)渲染圆内接多边形

说明:指定构造器的第五个参数为12,构建十二边形

代码如下:

agg::ellipse ell(300,300,130,130,12);

agg::conv_stroke<agg::ellipse> stroke(ell);

ras.add_path(stroke);

agg::render_scanlines_aa_solid(ras,sl,renb,agg::rgba8(255,0,0));

8.4 approximation_scale的困惑

说明:很多的类都有该函数,但是具体的该函数的实际意义并不了解!!

例子 inline void ellipse::approximation_scale(double scale):

agg::ellipse ell(300,300,240,240);

ell.approximation_scale(0.0001);//直线

ell.approximation_scale(0.001);//矩形

ell.approximation_scale(0.005);//正七边形

ell.approximation_scale(0.0025);//正五边形

agg::conv_stroke<agg::ellipse>stroke2(ell);

agg::render_scanlines_aa_solid(ras,sl,renb,agg::rgba8(255,0,0));

ras.reset();

转载于:https://blog.51cto.com/fengyuzaitu/1961281

AGG第十一课 agg::ellipse 渲染椭圆和多边形相关推荐

  1. AGG第二十课 agg::ellipse 方法approximation_scale()

    献给:任何一种方案都是一种折中的选择,任何一种替代方案都可能会实现同样的效果.而这完全取决于你是如何思考定位的.请教是学,自学是学,只不过可以站在巨人的肩膀上,你可以看的更加清楚或许走的更远. 摘自: ...

  2. opencv 学习第三课 画线段 圆 椭圆 矩形 多边形 插入文字 代码注释版 保证你每一行都能读懂

    import numpy as np import cv2 as cv # 创建一张大小为512×512,通道数为3的黑色的图片 img = np.zeros((512,512,3), np.uint ...

  3. AGG第三十一课 pattern_perspective样式透明

    摘自:http://article.gmane.org/gmane.comp.graphics.agg/2911/ > I've read the pattern_perspective.cpp ...

  4. AGG第四课 局限性

    1前言 AGG渲染抗锯齿图像的边界,似乎永远是模糊边界,经研究,是由于使用亚像素精度反走样,边界会有半个像素的模糊.导致多个图像重叠的边界出现颜色一样的问题.正如,作者所言,不要以为采用AGG,就能够 ...

  5. AGG第十八课 agg::trans_affine仿射变换

    1 affine仿射变换概念 在几何上定义为两个向量空间之间的一个仿射变换或者仿射映射(来自拉丁语,affinis,"和...相关")由一个线性变换接上一个平移组成. 2  agg ...

  6. C#之windows桌面软件第十一课:电脑ADC值显示(上位机)(多通道显示)

    C#之windows桌面软件第十一课:电脑ADC值显示(上位机)(多通道显示) using System; using System.Collections.Generic; using System ...

  7. Coursera公开课笔记: 斯坦福大学机器学习第十一课“机器学习系统设计(Machine learning system design)”

    Coursera公开课笔记: 斯坦福大学机器学习第十一课"机器学习系统设计(Machine learning system design)" 斯坦福大学机器学习斯坦福大学机器学习第 ...

  8. NeHe OpenGL教程 第三十六课:从渲染到纹理

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  9. C#——Ellipse(椭圆)类[继承Circle(圆)类][实现IComparable接口、IComparerrT接口]DEMO

    问题描述 定义一个Circle类,其功能有: 1)两个double类型属性X和Y,可读写圆心坐标 2)一个double类型属性Radius,可读写圆的半径 3)一个构造方法,以指定的x,y,radiu ...

最新文章

  1. iostat相关参数说明——await:平均每次设备I/O操作的等待时间 (毫秒),如果%util接近 100%,说明产生的I/O请求太多...
  2. Python 安装zbar-py时出现 无法打开包括文件: “unistd.h” no such file or directory
  3. 汇编--INT 10H功能
  4. oracle查询字段有list,java读取oracle表字段信息存到列表(LIST)中
  5. [并查集][排序][dfs][启发式合并] JZOJ P3635 Peaks
  6. tensorflow越跑越慢_tensorflow sess.run()越来越慢的原因分析及其解决方法
  7. 提交数据库访问性能一些简单措施
  8. Milkyway database简析
  9. 使用axios 报 name.toUpperCase is not a function
  10. 编码:隐匿在计算机软硬件背后的语言(3)--二进制加法器
  11. CPU负载均衡之loadavg计算
  12. 电池供电设备增加高精度库仑计
  13. wps 2019智能填充
  14. java分布式事务框架_Java分布式事务,及解决方案
  15. 什么是域名,域名的购买流程是什么
  16. 项目上线发布流程简介(不同公司流程规范不一样,仅供参考)
  17. 【HTML+CSS+JS】模仿QQ登录界面
  18. 喵哈哈村的魔法考试 Round #6 (Div.3) 题解
  19. 工作绩效数据、工作绩效信息、工作绩效报告
  20. 不写一行代码,让Excel轻松制作动态图表​

热门文章

  1. 解决sdk manager 下载API失败的问题
  2. 基本lnmp平台的搭建(源码编译)
  3. 今天看到的如何做个坏男人的招数
  4. 为何python攀上数据科学巅峰?调查显示Python超越R
  5. 谷歌大幅削减其应用商店服务费
  6. 用 Linux 的 watch 命令观察命令和任务
  7. 几行代码就搞定高端大气的云系统架构图
  8. 简单介绍C语言使用四种方法初始化结构体
  9. linux下编译onvif框架,Onvif第六课 Linux编译gsoap
  10. Flask-Email实现发送大量的电子邮件(可以限制发送的邮件数)