分享:根据svg节点对象类型和路径值转换坐标值
功能用处:
对svg文件的路径节点填充时会使用(相邻两个坐标区域内的四边形的填充颜色不重复)。
需要对svg文件中的Path节点或者 Polyline 节点做颜色填充.并且相邻的两个区域之间的颜色不允许重复。
代码如下:
/// <summary>
/// 根据svg节点对象类型和路径值转换成标准的坐标值
/// </summary>
/// <param name="pointType">线条类型,可以是 Path 或者 Polyline</param>
/// <param name="pointValue">
/// 线条值
/// <para>如 Path 节点的“d”属性</para>
/// <para>如 Polyline 节点的“points”属性</para>
/// </param>
/// <returns>返回浮点类型的二维平面坐标点集合</returns>
IList<PointF> ConvertPoints(string pointType, string pointValue)
{
IList<PointF> points = new List<PointF>(); string[] pointArray = { }; if (pointType.ToLower() == "points")
{
//Polyline 节点
pointArray = pointValue.Split(new char[] { ' ', ',' }); for (int i = ; i < pointArray.Length; i = i + )
{
if (i + >= pointArray.Length)
break; if (string.IsNullOrEmpty(pointArray[i]) || string.IsNullOrEmpty(pointArray[i + ]))
continue; try
{
PointF item = new PointF();
item.X = float.Parse(pointArray[i]);
item.Y = float.Parse(pointArray[i + ]);
points.Add(item);
}
catch (Exception)
{
throw;
}
}
}
else if (pointType.ToLower() == "d")
{
//Path 节点 if (!pointValue.StartsWith("m"))
{
return new List<PointF>();
} pointValue = pointValue.Substring();
PointF prePos = new PointF();
//过滤掉 path 路径符号
pointArray = pointValue.Split(new char[] { ' ', 'c', 'l', 's', 'v', 'q', 't', 'm', 'z' });
foreach (string thisPoint in pointArray)
{
if (string.IsNullOrEmpty(thisPoint))
continue; try
{
string[] pThis = thisPoint.Split(',');
PointF item = new PointF();
item.X = prePos.X + float.Parse(pThis[]);
item.Y = prePos.Y + float.Parse(pThis[]);
points.Add(item); prePos = item;
}
catch (Exception)
{
throw;
}
}
} return points;
}
然后根据坐标集合获取一个 四边形的坐标对象:
/// <summary>
/// 根据节点ID和节点坐标的二维平面x,y坐标集合获取坐标值对象
/// </summary>
/// <param name="points">浮点类型的二维平面坐标点集合</param>
/// <param name="nodeId">Svg节点ID</param>
/// <returns>Svg位置对象</returns>
public ObjectPosition GetObjectPosition(IList<PointF> points, string nodeId)
{
ObjectPosition thisPos = new ObjectPosition(nodeId); for (int i = ; i < points.Count; i++)
{
PointF pos = points[i];
if (i == )
{
thisPos.Init(pos.X, pos.Y);
}
else
{
thisPos.SetPoint(pos.X, pos.Y);
}
} return thisPos;
}
然后初始化坐标,并且获取四边形的坐标值:
/// <summary>
/// 初始化坐标
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
public void Init(float x, float y)
{
X1 = x;
X2 = x;
Y1 = y;
Y2 = y;
} /// <summary>
/// 设置四边形坐标值
/// <remarks>原则:大中取大,小中取小.</remarks>
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
public void SetPoint(float x, float y)
{
if (x < X1) X1 = x;
else if (x > X2) X2 = x;
if (y < Y1) Y1 = y;
else if (y > Y2) Y2 = y;
}
最后使用:
/// <summary>
/// 通过svg文件或者加载的Svg内容获取svg对象的坐标对象
/// </summary>
/// <returns>
/// <para>key:节点名称</para>
/// <para>value:节点坐标对象</para>
/// </returns>
public Dictionary<string, ObjectPosition> GetSvgObjectPositions()
{
Dictionary<string, ObjectPosition> mapList = new Dictionary<string, ObjectPosition>(); HtmlAgilityPack.HtmlDocument document = new HtmlAgilityPack.HtmlDocument();
//加载Svg内容
document.LoadHtml(this.SvgString); var polylines = document.DocumentNode.SelectNodes("//polyline");
if (polylines != null)
{
for (int i = ; i < polylines.Count; i++)
{
if (polylines[i].Attributes["id"] == null)
continue;
if (polylines[i].Attributes["points"] == null)
continue; string nodeId = polylines[i].Attributes["id"].Value;
IList<PointF> points = this.ConvertPoints("points", polylines[i].Attributes["points"].Value);
ObjectPosition posInfo = this.GetObjectPosition(points, nodeId);
mapList.Add(posInfo.NodeID, posInfo);
}
} var paths = document.DocumentNode.SelectNodes("//path");
if (paths != null)
{
for (int i = ; i < paths.Count; i++)
{
if (paths[i].Attributes["id"] == null)
continue;
if (paths[i].Attributes["d"] == null)
continue; string nodeId = paths[i].Attributes["id"].Value;
IList<PointF> points = this.ConvertPoints("d", paths[i].Attributes["d"].Value);
ObjectPosition posInfo = this.GetObjectPosition(points, nodeId);
mapList.Add(posInfo.NodeID, posInfo);
}
} return mapList;
}
分享:根据svg节点对象类型和路径值转换坐标值的更多相关文章
- 分享:Svg文件转换为图片(调用 Inkscape 命令行)
其实只是做了简单封装,可以方便进行批量转换. 获取Svg对象坐标的代码请看:根据svg节点对象类型和路径值转换坐标值, DrawingColor方法是进行颜色填充的. /// <summary& ...
- 转载:as3.0下对象类型返回值与变量默认值的详细说明
转自:http://www.cuplayer.com/player/PlayerCodeAs/2012/0905367.html Null.NaN.undefined 及各自应用对象:变量的默认值: ...
- PHP之对象类型
PHP之object对象 对象初始化 要创建一个新的对象object,使用new语句实例化一个类: 转化为对象 如果讲一个对象转化成对象,它将不会有任何变化.如果其它任何类型的值被转化成对象,将会创建 ...
- [原创]java WEB学习笔记81:Hibernate学习之路--- 对象关系映射文件(.hbm.xml):hibernate-mapping 节点,class节点,id节点(主键生成策略),property节点,在hibernate 中 java类型 与sql类型之间的对应关系,Java 时间和日期类型的映射,Java 大对象类型 的 映射 (了解),映射组成关系
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- JavaScript判断对象类型及节点类型、节点名称和节点值
一.JavaScript判断对象类型 1.可以使用typeof函数判断对象类型 function checkObject1(){ var str="str"; console.lo ...
- SAP CRM 用户界面对象类型和设计对象
在CRM中的用户界面对象类型的帮助下,我们可以做这些工作: 进行不同的视图配置 创建动态导航 从设计层控制字段标签.值帮助 控制BOL对象的属性的可视性 从导航栏访问自定义组件 一个用户界面对象类型之 ...
- (87)Wangdao.com第二十天_JavaScript document 节点对象
document 节点对象, 代表整个文档,每张网页都有自己的 document 对象. window.document 当浏览器开始加载文档时就存在了 正常的网页使用 document 或者 win ...
- 复杂对象类型的WebService高级部分
从客户端除了传递字符串以外还可以传递复杂对象(对象必须序列化了),List,Map,数组和文件. (1)定义一个对象实现了serializable 接口package cn.com.chenlly.s ...
- JS框架设计之对象类型判断一种子模块
Javascript有两套数据类型,一套是基础数据类型,一套是对象数据类型.基础数据类型包括5种基本数据类型,分别是null,bool,undefined,number,string,也叫简单数据类型 ...
随机推荐
- bzoj3876
不高兴的回忆啊啊啊当初这种简单题因为自己作死就暴零0了这题在OJ上是简单的最小有下界费用流,增广到正费用为止因为算的是总时限但实际的话似乎要用pacman吃豆豆那题的方法先用dp跑出第一次的增广路再用 ...
- 排序算法_MergeSort
算法思想: 分治自顶而下实现归并排序: 分治法的三个步骤 设归并排序的当前区间是R[low..high],分治法的三个步骤是:①分解:将当前区间一分为二,即求分裂点 ...
- 安装windows系统(win7)
又到了清理电脑,重装系统的时候了.最近被自己电脑折腾得不清,特记录下安装心得,以方便以后. 分区考虑(35G+40G) 35G=16G+4G+5G+10G,其中16G是64位官方旗舰版WIN7刚安装好 ...
- sublime text 2 运行 python时返回EOFError: EOF when reading a line错误
其主要原因是sublime text 2中python没有与 stdin(标准输入)连接所致,解决方法也很简单,那就是安装sublimeREPL插件,然后 Tools->sublimerepl- ...
- 博客搬家到CSDN:http://blog.csdn.net/yeweiouyang
博客搬家到CSDN:http://blog.csdn.net/yeweiouyang
- 8-10-Exercise
链接:第三次练习 A.ZOJ 3203 Light Bulb 这道题............哎~既可以用数学直接推导出来,也可以三分求,还可以二分求~~~~ NO1.数学公式 这种方法搞的不是很清楚 ...
- 安装XCode导致mac无法正常开机怎么办
作为一个IOS编程菜鸟,之前在网上买的IOS教程都坑爹的是xcode4以前的版本的,由于3和4界面变化较大,所以看着书往往不知所云,所以就迫不及待地从网上下载了XCode 3.2.5+iOS SDK ...
- SEO为什么要求网页设计师用DIV+CSS布局网页?
问:SEO为什么要求网页设计师用DIV+CSS布局网页? 答:通常情况下,SEOer非常喜欢把一个网站做到最细节,在网页设计方面,有时与设计师沟通时,通常会问到:SEO为什么要求网页设计师用DIV+C ...
- springsecurity4+springboot 实现remember-me 发现springsecurity 的BUG
前言:现在开发中,记住我这个功能是普遍的,用户不可能每次登录都要输入用户名密码.昨天准备用spring security的记住我功能,各种坑啊,吐血 . 先看下具体实现吧. spring securi ...
- 关于Ajax&初见Ajax
Ajax实现的效果 究竟Ajax能实现什么功能呢?今天下午学习了一下Ajax,现在跟大家分享一下我的学习心得.Ajax是什么?工作机制又是什么?可能不大准确,只是我个人看了视频学习后的一点点看法. A ...