diff --git a/Documentation~/en/api.md b/Documentation~/en/api.md index e1178518..f4fcb5ca 100644 --- a/Documentation~/en/api.md +++ b/Documentation~/en/api.md @@ -1443,6 +1443,7 @@ Grid component. |ContainsX()|v3.7.0|public bool ContainsX(float x)
Whether the given x is in the grid. | |ContainsY()|v3.7.0|public bool ContainsY(float y)
Whether the given y is in the grid. | |IsPointerEnter()||public bool IsPointerEnter()
Whether the pointer is in the grid. | +|NotAnyIntersect()|v3.10.0|public bool NotAnyIntersect(Vector3 sp, Vector3 ep)
Determines whether a given line segment will not intersect the Grid boundary at all. | |UpdateRuntimeData()||public void UpdateRuntimeData(BaseChart chart)| ## GridCoordContext diff --git a/Documentation~/zh/api.md b/Documentation~/zh/api.md index e89649e2..2dae103a 100644 --- a/Documentation~/zh/api.md +++ b/Documentation~/zh/api.md @@ -1443,6 +1443,7 @@ Drawing grid in rectangular coordinate. Line chart, bar chart, and scatter chart |ContainsX()|v3.7.0|public bool ContainsX(float x)
给定的x是否在网格内。 | |ContainsY()|v3.7.0|public bool ContainsY(float y)
给定的y是否在网格内。 | |IsPointerEnter()||public bool IsPointerEnter()
指针是否在网格内。 | +|NotAnyIntersect()|v3.10.0|public bool NotAnyIntersect(Vector3 sp, Vector3 ep)
判断给定的线段是否与Grid边界是否完全不会相交。 | |UpdateRuntimeData()||public void UpdateRuntimeData(BaseChart chart)| ## GridCoordContext diff --git a/Documentation~/zh/changelog.md b/Documentation~/zh/changelog.md index c39c03fd..83d4b466 100644 --- a/Documentation~/zh/changelog.md +++ b/Documentation~/zh/changelog.md @@ -70,6 +70,7 @@ slug: /changelog ## master +* (2023.12.25) 修复`Line`开启`clip`时绘制的顶点数可能反而增加的问题 * (2023.12.22) 修复`Scatter`散点图部分边界数据不显示的问题 * (2023.12.21) 修复`TriggerTooltip()`接口在指定0或最大index时可能无法触发的问题 * (2023.12.19) 修复`Legend`的`LabelStyle`设置`formatter`后不生效的问题 diff --git a/README.md b/README.md index a72f107a..d308a27d 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ ![XCharts](Documentation~/zh/img/xcharts.png) -一款基于`UGUI`的功能强大、简单易用的数据可视化图表插件。支持`折线图`、`柱状图`、`饼图`、`雷达图`、`散点图`、`热力图`、`环形图`、`K线图`、`极坐标`、`平行坐标`等十多种内置图表,以及`3D饼图`、`3D柱图`、`3D金字塔`、`漏斗图`、`仪表盘`、`水位图`、`象形柱图`、`甘特图`、`矩形树图`等扩展图表。 +一款基于`UGUI`的功能强大、简单易用的数据可视化图表插件。支持`折线图`、`柱状图`、`饼图`、`雷达图`、`散点图`、`热力图`、`环形图`、`K线图`、`极坐标`、`平行坐标`等十多种内置图表,以及`3D饼图`、`3D柱图`、`3D金字塔`、`漏斗图`、`仪表盘`、`水位图`、`象形柱图`、`甘特图`、`矩形树图`、`桑基图`等多种扩展图表。 [XCharts 官方主页](https://xcharts-team.github.io) [XCharts 在线示例](https://xcharts-team.github.io/examples) @@ -59,12 +59,12 @@ ## 特性 -- __纯代码绘制__:图表完全纯代码绘制,无需额外的贴图和Shader资源。 -- __可视化配置__:参数可视化配置,效果实时预览,也支持运行时代码动态修改配置和数据。 +- __纯代码绘制__:图表纯代码绘制,无需额外的贴图和Shader资源。 +- __可视化配置__:参数可视化配置,效果实时预览,支持运行时代码动态修改配置和数据。 - __高自由定制__:支持从主题和配置参数上任意调整;支持代码自定义绘制,自定义回调以及自定义实现图表。 - __多内置图表__:支持线图、柱状图、饼图、雷达图、散点图、热力图、环形图、K线图、极坐标、平行坐标等多种内置图表。 -- __多扩展图表__:支持3D柱图、3D饼图、漏斗图、金字塔、仪表盘、水位图、象形柱图、甘特图、矩形树图等多种扩展图表。 -- __多扩展组件__:支持表格、统计数值等扩展UI组件。 +- __多扩展图表__:支持3D柱图、3D饼图、漏斗图、金字塔、仪表盘、水位图、象形柱图、甘特图、矩形树图、桑基图等多种扩展图表。 +- __多扩展组件__:支持表格、统计数值等多种扩展UI组件。 - __多图表组合__:支持内置图表的任意组合,同一图中可同时显示多个相同或不同类型的图表。 - __多种坐标系__:支持直角坐标系、极坐标系、单轴等多种坐标系。 - __丰富的组件__:支持标题、图例、提示框、标线、标域、数据区域缩放、视觉映射等常用组件。 @@ -121,7 +121,7 @@ - `XCharts3.0` 不完全兼容 `XCharts2.0` 版本,升级`3.0`时,部分代码和配置可能需要重新调整。建议旧项目可以继续使用`XCharts2.0`,新项目推荐使用`XCharts3.0`。 - `XCharts2.0` 进入维护阶段,后续只修复严重`bug`,原则上不再加新功能。 -- `XCharts` 理论上支持`Unity 5.6`及以上版本,但由于版本测试有限难免疏漏,发现版本兼容问题可提`Issue`。 +- `XCharts` 理论上支持`Unity 5.6`及以上版本,但由于版本测试有限难免疏漏,发现问题可提`Issue`。 - 本仓库只包含`XCharts`源码,不包含`Demo`示例部分。需要查看`Demo`示例源码请到[XCharts-Demo](https://github.com/XCharts-Team/XCharts-Demo)仓库。也可以在浏览器查看`WebGL`下的运行效果 [在线Demo](https://xcharts-team.github.io/examples/) 。 ## 使用 @@ -155,8 +155,8 @@ ## Licenses - [MIT License](https://github.com/XCharts-Team/XCharts/blob/master/LICENSE.md) -- 可免费商用,可二次开发 -- 扩展图表和高级功能部分需购买使用授权 +- 可免费商用,可二次开发。 +- 扩展图表和高级功能部分需购买使用授权。 ## 订阅 diff --git a/Runtime/Coord/Grid/GridCoord.cs b/Runtime/Coord/Grid/GridCoord.cs index 1d04c4b8..49586906 100644 --- a/Runtime/Coord/Grid/GridCoord.cs +++ b/Runtime/Coord/Grid/GridCoord.cs @@ -254,6 +254,27 @@ namespace XCharts.Runtime else if (pos.y > context.y + context.height) pos.y = context.y + context.height; } + /// + /// Determines whether a given line segment will not intersect the Grid boundary at all. + /// ||判断给定的线段是否与Grid边界是否完全不会相交。 + /// + /// + /// + /// + [Since("v3.10.0")] + public bool NotAnyIntersect(Vector3 sp, Vector3 ep) + { + if (sp.x < context.x && ep.x < context.x) + return true; + if (sp.x > context.x + context.width && ep.x > context.x + context.width) + return true; + if (sp.y < context.y && ep.y < context.y) + return true; + if (sp.y > context.y + context.height && ep.y > context.y + context.height) + return true; + return false; + } + /// /// 给定的线段和Grid边界的交点 /// diff --git a/Runtime/Serie/Line/LineHandler.GridCoord.cs b/Runtime/Serie/Line/LineHandler.GridCoord.cs index e05a559e..ca8ae8b6 100644 --- a/Runtime/Serie/Line/LineHandler.GridCoord.cs +++ b/Runtime/Serie/Line/LineHandler.GridCoord.cs @@ -356,7 +356,7 @@ namespace XCharts.Runtime serie.animation.InitProgress(serie.context.dataPoints, isY); VisualMapHelper.AutoSetLineMinMax(visualMap, serie, isY, axis, relativedAxis); - LineHelper.UpdateSerieDrawPoints(serie, chart.settings, chart.theme, visualMap, lineWidth, isY); + LineHelper.UpdateSerieDrawPoints(serie, chart.settings, chart.theme, visualMap, lineWidth, isY, m_SerieGrid); LineHelper.DrawSerieLineArea(vh, serie, lastSerie, chart.theme, visualMap, isY, axis, relativedAxis, m_SerieGrid); LineHelper.DrawSerieLine(vh, chart.theme, serie, visualMap, m_SerieGrid, axis, relativedAxis, lineWidth); diff --git a/Runtime/Serie/Line/LineHelper.cs b/Runtime/Serie/Line/LineHelper.cs index d53eb7a2..fb43eb6e 100644 --- a/Runtime/Serie/Line/LineHelper.cs +++ b/Runtime/Serie/Line/LineHelper.cs @@ -470,7 +470,7 @@ namespace XCharts.Runtime } internal static void UpdateSerieDrawPoints(Serie serie, Settings setting, ThemeStyle theme, VisualMap visualMap, - float lineWidth, bool isY = false) + float lineWidth, bool isY, GridCoord grid) { serie.context.drawPoints.Clear(); var last = Vector3.zero; @@ -485,12 +485,12 @@ namespace XCharts.Runtime UpdateStepLineDrawPoints(serie, setting, theme, isY, lineWidth); break; default: - UpdateNormalLineDrawPoints(serie, setting, visualMap); + UpdateNormalLineDrawPoints(serie, setting, visualMap, grid); break; } } - private static void UpdateNormalLineDrawPoints(Serie serie, Settings setting, VisualMap visualMap) + private static void UpdateNormalLineDrawPoints(Serie serie, Settings setting, VisualMap visualMap, GridCoord grid) { var isVisualMapGradient = VisualMapHelper.IsNeedGradient(visualMap); if (isVisualMapGradient || serie.clip || (serie.lineStyle.IsNotSolidLine())) @@ -499,11 +499,16 @@ namespace XCharts.Runtime if (dataPoints.Count > 1) { var sp = dataPoints[0]; + var ip = Vector3.zero; for (int i = 1; i < dataPoints.Count; i++) { var ep = dataPoints[i]; var ignore = serie.context.dataIgnores[i]; - + if (serie.clip && grid.NotAnyIntersect(sp, ep)) + { + sp = ep; + continue; + } var dir = (ep - sp).normalized; var dist = Vector3.Distance(sp, ep); var segment = (int)(dist / setting.lineSegmentDistance); diff --git a/Runtime/Serie/Line/SimplifiedLineHandler.cs b/Runtime/Serie/Line/SimplifiedLineHandler.cs index 4abe6af9..2b9fad92 100644 --- a/Runtime/Serie/Line/SimplifiedLineHandler.cs +++ b/Runtime/Serie/Line/SimplifiedLineHandler.cs @@ -221,7 +221,7 @@ namespace XCharts.Runtime serie.animation.InitProgress(serie.context.dataPoints, isY); - LineHelper.UpdateSerieDrawPoints(serie, chart.settings, chart.theme, null, lineWidth, isY); + LineHelper.UpdateSerieDrawPoints(serie, chart.settings, chart.theme, null, lineWidth, isY, m_SerieGrid); LineHelper.DrawSerieLineArea(vh, serie, null, chart.theme, null, isY, axis, relativedAxis, m_SerieGrid); LineHelper.DrawSerieLine(vh, chart.theme, serie, null, m_SerieGrid, axis, relativedAxis, lineWidth);