日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

分享:根据svg节点对象类型和路径值转换坐标值

發(fā)布時(shí)間:2025/3/15 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 分享:根据svg节点对象类型和路径值转换坐标值 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

功能用處:

對(duì)svg文件的路徑節(jié)點(diǎn)填充時(shí)會(huì)使用(相鄰兩個(gè)坐標(biāo)區(qū)域內(nèi)的四邊形的填充顏色不重復(fù))。

需要對(duì)svg文件中的Path節(jié)點(diǎn)或者 Polyline?節(jié)點(diǎn)做顏色填充.并且相鄰的兩個(gè)區(qū)域之間的顏色不允許重復(fù)。

代碼如下:

/// <summary>/// 根據(jù)svg節(jié)點(diǎn)對(duì)象類型和路徑值轉(zhuǎn)換成標(biāo)準(zhǔn)的坐標(biāo)值/// </summary>/// <param name="pointType">線條類型,可以是 Path 或者 Polyline</param>/// <param name="pointValue">/// 線條值/// <para>如 Path 節(jié)點(diǎn)的“d”屬性</para>/// <para>如 Polyline 節(jié)點(diǎn)的“points”屬性</para>/// </param>/// <returns>返回浮點(diǎn)類型的二維平面坐標(biāo)點(diǎn)集合</returns>IList<PointF> ConvertPoints(string pointType, string pointValue){IList<PointF> points = new List<PointF>();string[] pointArray = { };if (pointType.ToLower() == "points"){//Polyline 節(jié)點(diǎn)pointArray = pointValue.Split(new char[] { ' ', ',' });for (int i = 0; i < pointArray.Length; i = i + 2){if (i + 1 >= pointArray.Length)break;if (string.IsNullOrEmpty(pointArray[i]) || string.IsNullOrEmpty(pointArray[i + 1]))continue;try{PointF item = new PointF();item.X = float.Parse(pointArray[i]);item.Y = float.Parse(pointArray[i + 1]);points.Add(item);}catch (Exception){throw;}}}else if (pointType.ToLower() == "d"){//Path 節(jié)點(diǎn)if (!pointValue.StartsWith("m")){return new List<PointF>();}pointValue = pointValue.Substring(1);PointF prePos = new PointF();//過濾掉 path 路徑符號(hào)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[0]);item.Y = prePos.Y + float.Parse(pThis[1]);points.Add(item);prePos = item;}catch (Exception){throw;}}}return points;}

然后根據(jù)坐標(biāo)集合獲取一個(gè)?四邊形的坐標(biāo)對(duì)象:

/// <summary>/// 根據(jù)節(jié)點(diǎn)ID和節(jié)點(diǎn)坐標(biāo)的二維平面x,y坐標(biāo)集合獲取坐標(biāo)值對(duì)象/// </summary>/// <param name="points">浮點(diǎn)類型的二維平面坐標(biāo)點(diǎn)集合</param>/// <param name="nodeId">Svg節(jié)點(diǎn)ID</param>/// <returns>Svg位置對(duì)象</returns>public ObjectPosition GetObjectPosition(IList<PointF> points, string nodeId){ObjectPosition thisPos = new ObjectPosition(nodeId);for (int i = 0; i < points.Count; i++){PointF pos = points[i];if (i == 0){thisPos.Init(pos.X, pos.Y);}else{thisPos.SetPoint(pos.X, pos.Y);}}return thisPos;}

然后初始化坐標(biāo),并且獲取四邊形的坐標(biāo)值:

/// <summary>/// 初始化坐標(biāo)/// </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>/// 設(shè)置四邊形坐標(biāo)值/// <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內(nèi)容獲取svg對(duì)象的坐標(biāo)對(duì)象/// </summary>/// <returns>/// <para>key:節(jié)點(diǎn)名稱</para>/// <para>value:節(jié)點(diǎn)坐標(biāo)對(duì)象</para>/// </returns>public Dictionary<string, ObjectPosition> GetSvgObjectPositions(){Dictionary<string, ObjectPosition> mapList = new Dictionary<string, ObjectPosition>();HtmlAgilityPack.HtmlDocument document = new HtmlAgilityPack.HtmlDocument();//加載Svg內(nèi)容document.LoadHtml(this.SvgString);var polylines = document.DocumentNode.SelectNodes("//polyline");if (polylines != null){for (int i = 0; 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 = 0; 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;}

?

轉(zhuǎn)載于:https://www.cnblogs.com/easeyeah/p/GetSvgCoordinate.html

總結(jié)

以上是生活随笔為你收集整理的分享:根据svg节点对象类型和路径值转换坐标值的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。