Perl+OpenGL 重绘inkscape生成的svg矢量图

还不够完善,先挖个坑,后面慢慢填

Code: [全选] [展开/收缩] [Download] (Untitled.pl)

=info
Author: 523066680
Date: 2016-11
=cut use IO::Handle;
use OpenGL qw/ :all /;
use OpenGL::Config;
use Time::HiRes 'sleep';
use feature 'state'; STDOUT->autoflush(1); open READ, "<:raw", "multi.svg";
my @all;
my $tl;
for my $line (<READ>)
{
if ( $line=~/\s+d="(.*)"/ )
{
@all = split(" ", $1 );
}
} my @coords; for my $e (@all)
{
if ( $e =~/[a-zA-Z]/ )
{
$head = $e;
next;
}
push @coords,
{
'head' => $head,
'data' => [ split(",", $e) ],
};
} #相对坐标 叠加为绝对坐标
my ($ox, $oy);
for (my $i = 0; $i <= $#coords; $i++)
{
if ($coords[$i]->{head} eq 'c')
{
grep
{
$coords[ $i+$_ ]->{'data'}[0] += $ox;
$coords[ $i+$_ ]->{'data'}[1] += $oy;
} (0..2) ;
$i += 2;
}
else
{ }
#ox oy 始终是最后一点的坐标值
($ox, $oy) = ($coords[$i]->{'data'}[0], $coords[$i]->{'data'}[1]) ;
} my ($xmin, $xmax, $ymin, $ymax) = (10000.0, -10000.0, 10000.0, -10000.0);
for my $e (@coords)
{
printf("%.2f, %.2f\n", $e->{'data'}[0], $e->{'data'}[1]);
$xmin = $e->{'data'}[0] if ($e->{'data'}[0] < $xmin);
$xmax = $e->{'data'}[0] if ($e->{'data'}[0] > $xmax); $ymin = $e->{'data'}[1] if ($e->{'data'}[1] < $ymin);
$ymax = $e->{'data'}[1] if ($e->{'data'}[1] > $ymax);
}
printf("%f %f %f %f\n", $xmin, $xmax, $ymin, $ymax); &Main(); sub display
{
glClear(GL_COLOR_BUFFER_BIT);
glBlendFunc(GL_SRC_ALPHA, GL_DST_ALPHA); glPushMatrix(); my $array;
my @points; for (my $i = 0; $i <= $#coords; $i++)
{
if ($coords[$i]->{head} eq 'C')
{
glColor4f(0.0,0.5,0.0,1.0);
$array = OpenGL::Array->new( 3*4, GL_FLOAT);
@points = (
$coords[$i-1]->{'data'}[0], $coords[$i-1]->{'data'}[1], 0.0 ,
$coords[$i+0]->{'data'}[0], $coords[$i+0]->{'data'}[1], 0.0 ,
$coords[$i+1]->{'data'}[0], $coords[$i+1]->{'data'}[1], 0.0 ,
$coords[$i+2]->{'data'}[0], $coords[$i+2]->{'data'}[1], 0.0 ,
); $array->assign(0, @points); glMap1f_c(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, $array->ptr);
glMapGrid1f(20, 0.0, 1.0);
glEvalMesh1(GL_LINE, 0, 20);
$i+=2;
}
elsif ($coords[$i]->{head} eq 'c')
{
glColor4f(0.0,0.5,0.0,1.0);
$array = OpenGL::Array->new( 3*4, GL_FLOAT); @points = ( $coords[$i-1]->{'data'}[0], $coords[$i-1]->{'data'}[1], 0.0,
$coords[$i+0]->{'data'}[0], $coords[$i+0]->{'data'}[1], 0.0 ,
$coords[$i+1]->{'data'}[0], $coords[$i+1]->{'data'}[1], 0.0 ,
$coords[$i+2]->{'data'}[0], $coords[$i+2]->{'data'}[1], 0.0 ,
); $array->assign(0, @points); glMap1f_c(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, $array->ptr);
glMapGrid1f(20, 0.0, 1.0);
glEvalMesh1(GL_LINE, 0, 20);
$i += 2;
}
elsif ($coords[$i]->{head} eq 'L')
{
glBegin(GL_LINES);
glVertex3f( $coords[$i-1]->{'data'}[0], $coords[$i-1]->{'data'}[1], 0.0 );
glVertex3f( $coords[$i]->{'data'}[0], $coords[$i]->{'data'}[1], 0.0 );
glEnd();
}
elsif ($coords[$i]->{head} =~/m/i)
{
glBegin(GL_POINTS);
glColor3f(1.0, 1.0, 1.0);
glVertex3f( $coords[$i]->{'data'}[0], $coords[$i]->{'data'}[1], 0.0 );
glEnd();
}
} glPopMatrix();
glutSwapBuffers();
} sub init
{
glClearColor(0.0, 0.0, 0.0, 1.0);
glPointSize(2.0);
glLineWidth(2.0);
glEnable(GL_BLEND);
glEnable(GL_POINT_SMOOTH);
glEnable(GL_LINE_SMOOTH);
glEnable(GL_MAP1_VERTEX_3);
} sub idle
{
sleep 0.05;
glutPostRedisplay();
} sub Reshape
{
my $half = 1000;
glViewport(0, 0, 500.0, 500.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
#glOrtho(-$half, $half, -$half, $half, 0.0, 200.0);
glOrtho($xmin, $xmax, $ymin, $ymax, 0.0, 200.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0,0.0,100.0,0.0,0.0,0.0, 0.0,1.0,100.0);
} sub hitkey
{
my $keychar = lc(chr(shift));
if ($keychar eq 'q')
{
glutDestroyWindow($WinID);
}
} sub Main
{
glutInit();
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE );
glutInitWindowSize(500, 500);
glutInitWindowPosition(1,1);
our $WinID = glutCreateWindow("title");
&init();
glutDisplayFunc(\&display);
glutReshapeFunc(\&Reshape);
glutKeyboardFunc(\&hitkey);
glutIdleFunc(\&idle);
glutMainLoop();
} __END__
要使glMap1f_c 正常工作,需要借用OpenGL::Array 建立一个
仿C的指针 my $array = OpenGL::Array->new( 3*4, GL_FLOAT);
$array->assign(0, @points); glMap1f_c(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, $array->ptr);
glEnable(GL_MAP1_VERTEX_3);

请将一下内容保存到multi.svg,保存后可以拖入IE或者火狐中浏览。

Code: [全选] [展开/收缩] [Download] (multi.svg)

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) --> <svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="210mm"
height="297mm"
viewBox="0 0 744.09448819 1052.3622047"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="penta.svg">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.4"
inkscape:cx="402.20655"
inkscape:cy="647.84062"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1440"
inkscape:window-height="837"
inkscape:window-x="-4"
inkscape:window-y="120"
inkscape:window-maximized="1" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<path
sodipodi:type="star"
style="fill-rule:evenodd"
id="path4140"
sodipodi:sides="11"
sodipodi:cx="421.86606"
sodipodi:cy="388.68654"
sodipodi:r1="219.29707"
sodipodi:r2="63.376858"
sodipodi:arg1="0.029801473"
sodipodi:arg2="-2.8262334"
inkscape:flatsided="false"
inkscape:rounded="-0.07"
inkscape:randomized="0"
d="m 641.06576,395.22096 c -0.58462,19.63861 -285.54568,-7.5131 -279.45113,-26.19125 6.09452,-18.67807 252.23038,127.45733 241.12118,143.66224 C 591.62657,528.89693 366.58139,351.99388 381.80662,339.57579 397.03179,327.15774 525.08769,583.16575 506.981,590.7921 488.87423,598.41849 395.1952,327.92957 414.7172,325.71418 c 19.52193,-2.21538 -11.15897,282.38451 -30.51441,279.01099 -19.35551,-3.37353 48.07402,-281.57 65.6947,-272.87931 17.62062,8.69065 -162.05612,231.52397 -176.51508,218.22165 -14.45903,-13.30238 192.67067,-210.88099 202.79559,-194.04345 10.12488,16.83746 -261.50159,107.1562 -266.47347,88.14847 -4.9719,-19.00782 276.09575,-73.23875 275.51032,-53.60016 -0.58543,19.6385 -277.92215,-51.2329 -271.82841,-69.91123 6.09378,-18.6784 271.86238,87.65628 260.75247,103.8608 -11.10987,16.20446 -206.1044,-193.35592 -190.87975,-205.77459 15.22471,-12.41873 181.31462,220.72105 163.20754,228.34669 -18.107,7.6256 -68.84995,-274.0898 -49.32811,-276.30599 19.52191,-2.2162 33.20075,283.70845 13.84538,280.33412 -19.3553,-3.37432 90.26387,-267.80211 107.88484,-259.11218 17.62105,8.68996 -125.45412,256.62042 -139.91259,243.31744 -14.45842,-13.30292 220.71955,-176.48913 230.84513,-159.65209 10.12562,16.83712 -244.2782,148.05723 -249.24931,129.04921 -4.97109,-19.00794 281.09833,-29.14211 280.51372,-9.50359 z" />
</g>
</svg>

Perl+OpenGL 重绘inkscape生成的svg矢量图的更多相关文章

  1. Android 使用 SVG 矢量图

    android svg矢量图 可能包含的操作有: SVG图还包括改变颜色,透明度,大小,矩阵操作(平移.旋转.缩放),selector, (图标,背景,按钮),动画,等 setTint(int Col ...

  2. Android中使用SVG矢量图(一)

    SVG矢量图介绍 首先要解释下什么是矢量图像,什么是位图图像? 1.矢量图像:SVG (Scalable Vector Graphics, 可伸缩矢量图形) 是W3C 推出的一种开放标准的文本式矢量图 ...

  3. svg矢量图绘制以及转换为Android可用的VectorDrawable资源

    项目需要 要在快速设置面板里显示一个VoWiFi图标(为了能够区分出来图形,我把透明的背景填充为黑色了) 由于普通图片放大后容易失真,这里我们最好用矢量图(SVG(Scalable Vector Gr ...

  4. svg矢量图

    svg简介 Scalable Vector Graphics 可缩放矢量图形 SVG 图像在放大或改变尺寸的情况下其图形质量不会有所损失 svg知识点 svg如何绘图 svg和cnavas区别 svg ...

  5. SVGO: Node.js 开发的 SVG 矢量图优化工具(svg压缩工具)

    SVG图片压缩 这是个通过借助npm包的一种方式去压缩svg的图片,由于阿里的图库自己创建的图标有大小的限制,当我们想要自己用自己的图标的时候就可以使用这种方式去完成对svg的图片压缩. 1.下载no ...

  6. SVG矢量图学习实例

    从W3school上学习了一下SVG矢量图形,感觉和HTML相比还是有一些新的元素和属性的,一时间不能全部记住,特此留下笔记,供遗忘时作为参考 <!DOCTYPE html> <!- ...

  7. svg矢量图在flex布局中样式扭曲的问题

    问题机型 小米5 华为nova 其他未知的可能机型 问题描述 利用flex 布局的一行中, 左一样式: -webkit-box-flex: 0; flex: 0 1 auto; 左二样式: -webk ...

  8. SVG矢量图--爱心

    aixin.xml: <!-- height:width=viewportHeight:viewportWidth --> <vector xmlns:android="h ...

  9. SVG矢量图【转】

    var iconArray=[ //'circle', //实心圆 //'rect', //矩形 //'roundRect', //圆角矩形 //'triangle', //三角形 //'diamon ...

随机推荐

  1. IE11 - Object doesn't support property or method 'includes'

    IE不支持字符串的includes()方法:可以用indexOf()替换: includes()方法返回true和false; var str = "asdklmn": if(st ...

  2. MongoDB常用增删改查语句

    数据库database 创建及查看库 1.有则使用这个数据库,没有就创建 use DATABASE_NAME 2. 查看当前选择的数据库,默认是test db 3.查看数据库,默认有admin.loc ...

  3. 数组和集合(二):List集合的使用总结

    一.概述 · 继承collection接口,List代表一个元素有序.且可重复(包括null)的集合,集合中的每个元素都有其对应的顺序索引 · List默认按元素的添加顺序设置元素的索引 · 提供了一 ...

  4. UIPanel

    [UIPanel] UIPanel is a component that collects and manages all widgets underneath it. UIPanel is res ...

  5. jquery offset positon 获取位置不准的解决方法

    问题: 本地开发时,由于使用了图片,而且使用了offset().top涉及到图片所在的div距离计算的部分,本地开发一切都没问题:但是部署到服务器上时却出现布局错乱,经过排查发现总是少了一个图片高度的 ...

  6. 高性能Web服务器Nginx的配置与部署研究(16)小议location匹配模式优先级

    1 location 的匹配符 1.1 等于匹配符:= 等于匹配符就是等号,特点可以概括为两点: 精确匹配 不支持正则表达式 1.2 空匹配符 空匹配符的特点是: 匹配以指定模式开始的 URI 不支持 ...

  7. udacity term_sim.x86_64 ubuntu16.04 Vmware

    打印信息 ./term2_sim.x86_64 Set current directory to /home/mwolfram/udacity/sdcnd/term2/term2_sim_linux ...

  8. [SoapUI] JsonPath is to JSON what XPath is to XML

    1.通过JsonUtil验证Json的有效性 2.两种方式通过JPath读取Json的内容

  9. debian 9 更换源 使用国内源 配置方法

    配置前请先参考: https://wiki.debian.org/SourcesList https://www.debian.org/mirror/list https://mirrors.tuna ...

  10. Linux虚拟机安装配置手册(版本:7.3)

    一.准备 ①.安装VMWare 安装步骤省略.我这里使用的版本如下: ②.Linux系统镜像文件: 建议使用最新版本的Linux系统.有些组件对系统内核版本要求比较高,有可能会产生错误. 我这里使用的 ...