分享:根据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,也叫简单数据类型 ...
随机推荐
- POJ_2001_Shortest_Prefixes_(Trie)
描述 http://poj.org/problem?id=2001 给出一组单词,求每个单词的最小唯一前缀. 最小唯一前缀:该前缀不能是其他单词的前缀,并且最小,如果不存在,则为该单词本身. Shor ...
- 使用表达式避免拼接SQL语句
在SQL语句编写过程中,无论在存储过程中还是在程序中,有时为了使语句兼容全部情况与某字段的特殊情况,不得不拼接SQL字串 如下表 商品ID 类别ID 1 1 2 1 3 2 4 3 5 3 如果我们要 ...
- createElement
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- CentOS升级Python的方法
centOS内核版本为:3.10.101-1.el6.elrepo.x86_64 1,下载Python安装包 wget http://www.python.org/ftp/python/2.7.6/P ...
- [洛谷U990]传递游戏(90分)
[题目描述 Description] n个人在做传递物品的游戏,编号为1-n. 游戏规则是这样的:开始时物品可以在任意一人手上,他可把物品传递给其他人中的任意一位:下一个人可以传递给未接过物品的任意一 ...
- poj 2932 Coneology(扫描线+set)
Coneology Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 3574 Accepted: 680 Descript ...
- Codevs 3286 火柴排队 2013年NOIP全国联赛提高组 树状数组,逆序对
题目:http://codevs.cn/problem/3286/ 3286 火柴排队 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : ...
- (转载)WindowsXP上安装和运行神器SqlMap的步骤
在Windows XP上安装和运行SqlMap的步骤…… 1.首先下载SqlMap 点击下载. https://codeload.github.com/sqlmapproject/sqlmap/leg ...
- Morris Traversal 二叉树遍历。
那天做了个SWAP NODE的题,要求constant space,不得不Morris Traversal. 稍微研究了一下,真正意义上的O(1)space对二叉树进行遍历.好像是1979年的算法. ...
- Android下的Linux指令集
Android目录结构 data app:用户安装的应用 data:应用的专属文件夹 system:系统的配置信息,注册表文件 anr:anr异常的记录信息 dev:devices的缩写 存放设备所对 ...