求绘图接口源代码或宽度线绘制方法
本人想实现一套绘图接口(类似于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();
}