首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

求绘图接口源代码或宽度线作图方法

2013-11-12 
求绘图接口源代码或宽度线绘制方法本人想实现一套绘图接口(类似于GDI、GDI+、CoreGraphics),不知道如何绘制

求绘图接口源代码或宽度线绘制方法
本人想实现一套绘图接口(类似于GDI、GDI+、CoreGraphics),不知道如何绘制宽度线。
求助于各位大神,是否知道有哪些图形接口是开源的,我想看一看源代码受受启发。

绘制宽度线遇到些难点:端点的处理,希望实现端线垂直于端点的斜率方向,但是想到的处理方法都比较麻烦;另外,直线还简单,绘制宽度曲线就更麻烦了,完全不知道怎么处理,不知选择手动绘制宽度内的点还是自动填充。 图形接口 GDI 宽度线
[解决办法]
仅供参考

void width_line_begin()
{
    if (NULL==(Left_list=malloc(sizeof(struct Node)))) {
        printf(" Can't allocate the space!\n");
        exit(0);
    }
    Left_list->fx =-1;
    Left_list->fy =-1;
    Left_list->next =(struct Node *)NULL;//create the left   edge list
    current =Left_list;
    if (NULL==(Right_list=malloc(sizeof(struct Node)))) {
        printf(" Can't allocate the space!\n");
        exit(0);
    }
    Right_list->fx =-1;
    Right_list->fy =-1;
    Right_list->next =(struct Node *)NULL;//create the right edge list
    xa2=x;
    ya2=y;
    s2=(ya2-ya1)/distance((double)xa1,(double)ya1,(double)xa2,(double)ya2);
    c2=(xa2-xa1)/distance((double)xa1,(double)ya1,(double)xa2,(double)ya2);
    switch (line_ends) {
        case 1:
            xa3=xa1-w*s2;
            ya3=ya1+w*c2;
            add_left_node();

            xa3=xa1+w*s2;
            ya3=ya1-w*c2;
            add_right_node();

            xa3=xa2+w*s2;
            ya3=ya2-w*c2;
            add_right_node();

            xa3=xa2-w*s2;
            ya3=ya2+w*c2;
            add_left_node();
        break;
        case 2:
            if (noends==NO) {
                xa3=xa1+w*(-c2-s2);
                ya3=ya1+w*(-s2+c2);
                add_left_node();

                xa3=xa1+w*(-c2+s2);
                ya3=ya1+w*(-s2-c2);
                add_right_node();
            }
            xa3=xa1+w*s2;
            ya3=ya1-w*c2;
            add_right_node();

            xa3=xa2+w*s2;
            ya3=ya2-w*c2;
            add_right_node();

            xa3=xa1-w*s2;
            ya3=ya1+w*c2;
            add_left_node();

            xa3=xa2-w*s2;
            ya3=ya2+w*c2;
            add_left_node();
        break;
        case 3:
            if (noends==NO) {
                xa3=xa1-w*c2;


                ya3=ya1-w*s2;
                add_left_node();
            }
            xa3=xa1+w*s2;
            ya3=ya1-w*c2;
            add_right_node();

            xa3=xa2+w*s2;
            ya3=ya2-w*c2;
            add_right_node();

            xa3=xa1-w*s2;
            ya3=ya1+w*c2;
            add_left_node();

            xa3=xa2-w*s2;
            ya3=ya2+w*c2;
            add_left_node();
        break;
        case 4:
            if (noends==NO) {
                af=acos((double)-c2);
                if (-s2<0) af=-af;

                da=acos((double)(w-DofRoundEnd)/w);

                for (th=af-M_PI/2+da;th<af+M_PI/2;th+=da) {
                    xa3=xa1+w*cos((double)th);
                    ya3=ya1+w*sin((double)th);
                    add_right_node();
                }
            }
            xa3=xa1+w*s2;
            ya3=ya1-w*c2;
            add_right_node();

            xa3=xa2+w*s2;
            ya3=ya2-w*c2;
            add_right_node();

            xa3=xa1-w*s2;
            ya3=ya1+w*c2;
            add_left_node();

            xa3=xa2-w*s2;
            ya3=ya2+w*c2;
            add_left_node();
        break;
        default:;
    }
    s1=s2;
    c1=c2;
    prepenpos=curpenpos;
}
void width_line_end()
{
    switch (line_ends) {
        case 1:
        break;
        case 2:
            xa3=x+w*(c1+s1);
            ya3=y+w*(s1-c1);
            add_right_node();

            xa3=x+w*(c1-s1);
            ya3=y+w*(s1+c1);
            add_left_node();
        break;
        case 3:
            xa3=x+w*c1;
            ya3=y+w*s1;
            add_left_node();
        break;
        case 4:
            af=acos((double)c1);
            if (s1<0) af=-af;

            da=acos((double)(w-DofRoundEnd)/w);

            for (th=af-M_PI/2+da;th<af+M_PI/2;th+=da) {


                xa3=x+w*cos((double)th);
                ya3=y+w*sin((double)th);
                add_right_node();
            }
        break;
        default:;
    }
    output_list();
}


[解决办法]
参考我的博文(http://blog.csdn.net/turingo/article/details/8131057)。

引用:
本人想实现一套绘图接口(类似于GDI、GDI+、CoreGraphics),不知道如何绘制宽度线。
求助于各位大神,是否知道有哪些图形接口是开源的,我想看一看源代码受受启发。

绘制宽度线遇到些难点:端点的处理,希望实现端线垂直于端点的斜率方向,但是想到的处理方法都比较麻烦;另外,直线还简单,绘制宽度曲线就更麻烦了,完全不知道怎么处理,不知选择手动绘制宽度内的点还是……

热点排行