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 @@

-一款基于`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);