AGG第二十八课 rasterizer的填充规则

AGG提供了很多额外的接口给SVG调用,因此很多的初学者像我,需要先学习SVG,然后了解接口的意义,才能够真正的掌握该接口,例如miter_join的含义。

1知识储备

字面上理解就是填充的规则,不就是图形的填充吗?哪有什么规则可言。对于单一的图形没有问题,如果是渲染圆环,两个环之间的区域填充颜色,该怎么办?这个时候就需要指定一种规则,一种填充的规则。

AGG提供了两种算法来判断该点是否在填充区域内,如果该点在填充区域,然后填充该点。对于一个简单的无交叉的路径,是非常容易判断的。但是,对于一个复杂的路径,比如自交或者一个路径包裹着另一个子路径,内部就不是那么好理解了。

nonzero

字面意思是“非零”。按该规则,要判断一个点是否在图形内,从该点作任意方向的一条射线,然后检测射线与图形路径的交点情况。从0开始计数,路径从左向右穿过射线则计数加1,从右向左穿过射线则计数减1。得出计数结果后,如果结果是0,则认为点在图形外部,否则认为在内部。

evenodd

字面意思是“奇偶”。按该规则,要判断一个点是否在图形内,从该点作任意方向的一条射线,然后检测射线与图形路径的交点的数量。如果结果是奇数则认为点在内部,是偶数则认为点在外部。

摘自:http://blog.csdn.net/cuixiping/article/details/7848369

2 简单的实例代码

void TestRasFillRule()

{

agg::rendering_buffer &rbuf = rbuf_window();

agg::pixfmt_bgr24 pixf(rbuf);

typedef agg::renderer_base<agg::pixfmt_bgr24> renderer_base_type;

renderer_base_type renb(pixf);

typedef agg::renderer_scanline_bin_solid<renderer_base_type>renderder_scanline_type;

renderder_scanline_type rensl(renb);

agg::rasterizer_scanline_aa<> ras;

agg::scanline_p8 sl;

ras.reset();

renb.clear(agg::rgba8(255,255,255));

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

//agg::filling_rule_e rule = agg::fill_non_zero;

agg::filling_rule_e rule = agg::fill_even_odd;

ras.filling_rule(rule);

ras.move_to_d(100,100);

ras.line_to_d(200,100);

ras.line_to_d(200,400);

ras.line_to_d(100,400);

ras.close_polygon();

ras.move_to_d(150,250);

ras.line_to_d(180,250);

ras.line_to_d(180,350);

ras.line_to_d(150,350);

ras.close_polygon();

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

return;

}

时间: 2024-10-10 16:38:56

AGG第二十八课 rasterizer的填充规则的相关文章

NeHe OpenGL教程 第二十八课:贝塞尔曲面

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第二十八课:贝塞尔曲面 贝塞尔曲面: 这是一课关于数学运算的,没有别的内容了.来,有信心就看看它吧. 贝塞尔曲面 作者: David Nikdel ( [email protected] ) 这篇教程旨在介绍贝塞尔曲面,希望有比我更

AGG第二十六课 裁剪功能

AGG有四种类型的裁剪,分别工作在不同的层次 1. 基础渲染器Base Render 除非直接调用基础渲染器的绘制线段的方法,否则在一般情况下,都是在render_scanline的时候被调用,进行裁剪,这个时候已经进行了大量无用的工作.比如顶点源超出屏幕范围,在调用render_scanline函数之前,比如调用rasterizer对象的add_path函数,已经浪费大量的资源 2 光栅器rasterizer rasterizer主要应用于根据顶点源,生成线段的详细信息,这个时候调用裁剪,可以

第二十八课

第一单元语法部分 Vてくる/いく<动作.变化的持续>以说话的时间为基准,表示状态变化的开始.事物的发展过程或是动作的继续等.    a.Vてくる<由过去到现在>     表示事物由过去到现在(强调过去的某一时点起到说话时或者某一特定时点)的逐渐变化过程或者状态的持续. 例:    1 地震予知の技術はこれまで少しずつ進歩してきました.    2 李先生はずっとあの中学校で英語を教えてきました.    *还可以表示说话人某种感觉或感情程度的加强.    例:    1 だんだん寒くな

JAVA学习第二十八课(常用对象API)- String类

多线程告一段落,开始常用对象API的涉及,背也要背下来!!! 日后开发,遇见最多的对象是文字,也就是字符串 String类 字符串是一个特殊对象 字符串一旦初始化就不可以被改变 一.特点 public class Main { public static void main(String[] args) { Demo1(); System.out.println("--------------"); Demo2(); } /*演示字符串的第一种定义方式,并明确字符串常量池的特点*/ p

第二十八课:focusin与focusout,submit,oninput事件的修复

focusin与focusout 这两个事件是IE的私有实现,能冒泡,它代表获得焦点或失去焦点的事件.现在只有Firefox不支持focusin,focusout事件.其实另外两个事件focus和blur是用来实现获取焦点和失去焦点的事件,但是由于这两个事件不能冒泡,所以很多浏览器就使用focusin,focusout来代替它,但是火狐不支持这两个事件,所以暂时还不能使用focusin,focusout事件代替focus和blur事件. 那么兼容性写法是怎么样的呢?如下: if (documen

JAVA学习第二十八课(多线程(七))- 停止线程和多线程面试题

重点掌握 /* * wait 和 sleep 区别? * 1.wait可以指定时间也可以不指定 * sleep必须指定时间 * 2.在同步中,对CPU的执行权和锁的处理不同 * wait释放执行权,释放锁    sleep释放执行权,不释放锁 */ //同步里具备执行资格的线程不止一个,但是能得到锁的只有一个,所以能执行的也只有一个 一.停止线程的方式 不可能让线程一直在运行,所以需要让线程停止 1.定义循环结束标记 一般而言,线程运行代码都是循环的,只要控制了循环就可以结束任务 2.使用int

AGG第二十二课 conv_contour函数auto_detect_orientation的字体应用

1 提供如下的代码结构渲染字体 agg::conv_transform<...> conv (path,matrix); agg::conv_curve<...> curve (conv); agg::conv_contour<...> contour(curve); curve.approximaltion_scale (scale); contour.auto_detect_orientation (true); contour.width (bold); 当bol

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

1 affine仿射变换概念 在几何上定义为两个向量空间之间的一个仿射变换或者仿射映射(来自拉丁语,affinis,"和...相关")由一个线性变换接上一个平移组成. 2  agg::trans_affine成员函数说明 2.1 缩放 inline const trans_affine&trans_affine::scale(double x, double y) 参数一对x横坐标的缩放系数,参数二对y纵坐标的缩放系数 这里有一个问题:就是图形的缩放之后,并不是在原有的位置上,

第二十八课 再论智能指针(下)

多个智能指针指向同一片堆空间的需求是巨大的. 计数变量也是在堆空间里面定义的,它的生命周期和对象的生命周期相同. 添加SharedPointer.h文件: 1 #ifndef SHAREDPOINTER_H 2 #define SHAREDPOINTER_H 3 4 #include <cstdlib> 5 #include "Pointer.h" 6 #include "Exception.h" 7 8 namespace DTLib 9 { 10 1