agg::ellipse画圆

前言:

path_storage是一个非常重要的顶点容器,并且也提供了很多的形状,在这里,我们看看path_storage是否可以描绘圆形,没有找到任何相关的函数支持直接画圆形,由于项目中并没有使用到任何贝塞尔曲线,所以也并不展开讨论相关的话题。因此引入了其他的顶点源,agg::ellipse去描绘一个圆形。该实例代码并没有引入坐标转换管道,该专业术语将会在一章描述。

    //Vertex Source顶点源,我更喜欢称之为端点集合,或者点集合矩阵
    //第一个参数是圆形圆心的X坐标,第二个参数是圆形圆心的Y坐标
    //第三个参数是圆形的X半径,第四个参数是圆形的Y半径,当X半径不
    //等于Y半径的时候,渲染出来的实际上是一个椭圆,具体可调整参数
    //根据第三和第四个参数可以了解到圆形可以是一个扁平的圆形,
    //不一定就是一个规规矩矩的圆形
    agg::ellipse ell(200,200,50,100);

    //选择画笔,当前可以尝试使用虚线去渲染,后面描述到!!
    typedef agg::conv_stroke<agg::ellipse> ell_cc_cs_type;
    ell_cc_cs_type csccell(ell);
  
    //尝试使用虚线来渲染,替换上面的实线,但是什么也没有看到,白板啊,白板啊!  
    //typedef agg::conv_dash<agg::ellipse> ell_cc_cs_type;
    //ell_cc_cs_type csccell(ell);

    ras.add_path(csccell);
    rensl.color(agg::rgba8(255,0,0));
    agg::render_scanlines(ras,sl,rensl);

    ras.reset();
   在很多的教材中在这里就已经直接引入坐标转换管道,将代码存在选择画笔之前,初学者会以为必须引入方可描绘圆弧,其实不然,本例子尽可能不调用一些额外的函数,就描绘了圆形,可对比揣摩下面的代码:
       //Vertex Source顶点源,我更喜欢称之为端点集合,或者点集合矩阵
    //第一个参数是圆形圆心的X坐标,第二个参数是圆形圆心的Y坐标
    //第三个参数是圆形的X半径,第四个参数是圆形的Y半径
    //根据第三和第四个参数可以了解到圆形可以是一个扁平的圆形,
    //不一定就是一个规规矩矩的圆形
    agg::ellipse ell(200,200,50,100);

    //Coordinate conversion pipeline坐标转换通道,晦涩难懂,
    //在这里设想一下add_path添加的都是直线什么的,并不支持
    //圆形这种半弧形,因此将弧形分拆成线段由线段组合成弧形
    //个人观点,欢迎指正!!
    typedef agg::conv_contour<agg::ellipse> ell_cc_type;
    ell_cc_type ccell(ell);

    typedef agg::conv_stroke<ell_cc_type> ell_cc_cs_type;
    ell_cc_cs_type csccell(ccell);

    ccell.width(20);
    ras.add_path(csccell);
    rensl.color(agg::rgba8(255,0,0));
    agg::render_scanlines(ras,sl,rensl);
    下一章将会通过坐标转换管道,来进行椭圆的缩放变换。
    
    注:接下来也会从源码的角度剖析agg::path_storage是如何构建容器存储线段的数据,比如起点和终点,并且项目中遇到agg渲染崩溃的问题,可能和容器的大小有关,查看是否是一个可扩展的数组。
typedefpath_base<vertex_block_storage<double> > path_storage;
时间: 2024-12-29 23:22:42

agg::ellipse画圆的相关文章

agg::ellipse画圆(扩展)

引言:在刚开始的时候对agg::conv_stroke不了解,认为她与agg::conv_dash是一路的货色,并且分别代表实线和虚线,其实不然,agg::conv_stroke此类存储线的位置,宽度,线端点形状,线连接方式等信息  ,通过使用虚线渲染圆,充分理解了,她们之间如何配合使用. 小节一:虚线的使用方法 例子如下:     //Vertex Source顶点源,我更喜欢称之为端点集合,或者点集合矩阵     //第一个参数是圆形圆心的X坐标,第二个参数是圆形圆心的Y坐标     //第

简单谈谈自己对htm与css中画圆的理解。

近几天,在利用css编辑中,发现不少边框图像要求是矩形圆角或者直接画一个圆的例子,下面和大家一起分享下对画圆的看法. 在这次的分享中,我侧重给大家看一些例子来更好的理解, 我们都明白,画圆时要用到“border-radius:”,而且在每次画圆时,我们都应该先设定一个width和height. 那么我们可以这样理解, 我们的圆是在一个矩形(正方形)中进行裁剪的,而border-radius就是我们要裁剪的尺寸. 给大家一些图片,更好的去理解. 首先,我们设定一个width为100px,高度为10

圆角背景实现,如实现圆角按钮;用xml文件画圆

项目中为了更好的视觉效果,然后又懒的去弄图片做背景时,往往就会通过xml布局文件来实现圆角的效果. 在drawable目录下新建一个shape类型的xml文件,设置<corners android:radius="5dp" />,然后在需要设为圆角的控件中,如按钮或LinearLayout,设置他们的background为drawable="@drawable/...".即可达到圆角的效果 // 用xml文件画圆 用竖线连接ListView的各个item

汇编画圆

汇编画圆-->效果如下图 代码如下: 1 dseg segment 2 center_x dw 150 ;原点坐标_x 3 center_y dw 90 ;原点坐标_y 4 radius dw 50 ;半径_r 5 label_x dw ? ;外接正方形右边界 6 label_y dw ? ;外接正方形下边界 7 distance dw ? 8 dseg ends 9 cseg segment 10 assume cs:cseg , ds:dseg 11 start: 12 mov ax , d

中点画线法画圆

中点画线法已经在画直线的时候详细讲过了,画圆时我们也可以用这种方法.画一个圆心为坐标原点的1/4圆,然后对其进行简单几何变换,平移对称,就可以得到任意圆. 类似的用中点画线法,从(0,r)点开始,每次要么向右走,要么向右下走,直到x==y,即到达四分之一圆处: (1)当d<0时,中点在圆内,则取正右方的点,(x+1,y+0.5),此时d=d+2*x+3; (2) 当d>=0时,中点在圆外,则取右下方的点,(x+1,y-1),此时d=d+2*(x-y)+5; (3) d0=1-r,即点(0,r)

h5画圆

下面一段代码是,h5的画圆,半圆,四分之一圆等效果 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> div{ width: 300px; height: 300px; border: 1px solid red; border-radius: 150

Unity GL 画圆

Unity下GL没有画圆的函数,只能自己来了. 如果能帮到大家,我也很高兴. 虽然没有画圆的函数,但是能画直线,利用这一点,配合微积分什么的,就可以画出来了.反正就是花很多连在一起的直线,每条直线足够短的时候,就足够圆了 1 void DrawCircle(float x, float y, float z, float r, float accuracy) 2 { 3 GL.PushMatrix (); 4 //绘制2D图像 5 GL.LoadOrtho (); 6 7 float strid

agg::ellipse 方法approximation_scale()

摘自:http://franko.github.io/agg-intro/vertex-source.html In the previous section we have seen agg::path_storage object. While this object is very flexible and can be used to describe all kind of geometric shapes there are a few other vertex source pri

疯狂java 讲义第三章练习题---画圆

public class PaintRound{ /** * @author Dream_e. * @version v1.0 */ private int r;//圆的半径 PaintRound(int r){ this.r = r; } public void paint(){ int y = 2*r;//y的最大值为半径的2倍 int x = 0; int c = 0; int z = 2;//坐标轴递减量. for(int j = y; j >= 0; j-=z){ x = getX(r