mirror of
https://github.com/XCharts-Team/XCharts.git
synced 2026-05-18 22:40:10 +00:00
增加虚线Dash、点线Dot、点划线DashDot、双点划线DashDotDot等类型的折线图支持
This commit is contained in:
@@ -69,13 +69,21 @@ namespace XCharts
|
||||
/// </summary>
|
||||
Solid,
|
||||
/// <summary>
|
||||
/// 破折线
|
||||
/// 虚线
|
||||
/// </summary>
|
||||
Dashed,
|
||||
/// <summary>
|
||||
/// 虚线
|
||||
/// 点线
|
||||
/// </summary>
|
||||
Dotted
|
||||
Dotted,
|
||||
/// <summary>
|
||||
/// 点划线
|
||||
/// </summary>
|
||||
DashDot,
|
||||
/// <summary>
|
||||
/// 双点划线
|
||||
/// </summary>
|
||||
DashDotDot
|
||||
}
|
||||
|
||||
[SerializeField] protected bool m_Show = true;
|
||||
|
||||
@@ -92,7 +92,23 @@ namespace XCharts
|
||||
/// step line.
|
||||
/// 阶梯线图:下一个拐点。
|
||||
/// </summary>
|
||||
StepEnd
|
||||
StepEnd,
|
||||
/// <summary>
|
||||
/// 虚线
|
||||
/// </summary>
|
||||
Dash,
|
||||
/// <summary>
|
||||
/// 点线
|
||||
/// </summary>
|
||||
Dot,
|
||||
/// <summary>
|
||||
/// 点划线
|
||||
/// </summary>
|
||||
DashDot,
|
||||
/// <summary>
|
||||
/// 双点划线
|
||||
/// </summary>
|
||||
DashDotDot
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -958,34 +958,20 @@ namespace XCharts
|
||||
switch (type)
|
||||
{
|
||||
case Axis.SplitLineType.Dashed:
|
||||
ChartHelper.DrawDashLine(vh, startPos, endPos, axis.axisLine.width, color);
|
||||
break;
|
||||
case Axis.SplitLineType.Dotted:
|
||||
var startX = startPos.x;
|
||||
var startY = startPos.y;
|
||||
var dashLen = type == Axis.SplitLineType.Dashed ? 6 : 2.5f;
|
||||
var count = isYAxis ? (endPos.x - startPos.x) / (dashLen * 2) :
|
||||
(endPos.y - startPos.y) / (dashLen * 2);
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
if (isYAxis)
|
||||
{
|
||||
var toX = startX + dashLen;
|
||||
ChartHelper.DrawLine(vh, new Vector3(startX, startY), new Vector3(toX, startY),
|
||||
axis.axisLine.width, color);
|
||||
startX += dashLen * 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
var toY = startY + dashLen;
|
||||
ChartHelper.DrawLine(vh, new Vector3(startX, startY), new Vector3(startX, toY),
|
||||
axis.axisLine.width, color);
|
||||
startY += dashLen * 2;
|
||||
}
|
||||
|
||||
}
|
||||
ChartHelper.DrawDotLine(vh, startPos, endPos, axis.axisLine.width, color);
|
||||
break;
|
||||
case Axis.SplitLineType.Solid:
|
||||
ChartHelper.DrawLine(vh, startPos, endPos, axis.axisLine.width, color);
|
||||
break;
|
||||
case Axis.SplitLineType.DashDot:
|
||||
ChartHelper.DrawDashDotLine(vh, startPos, endPos, axis.axisLine.width, color);
|
||||
break;
|
||||
case Axis.SplitLineType.DashDotDot:
|
||||
ChartHelper.DrawDashDotDotLine(vh, startPos, endPos, axis.axisLine.width, color);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -16,9 +16,26 @@ namespace XCharts
|
||||
/// </summary>
|
||||
public enum Type
|
||||
{
|
||||
/// <summary>
|
||||
/// 实线
|
||||
/// </summary>
|
||||
Solid,
|
||||
/// <summary>
|
||||
/// 虚线
|
||||
/// </summary>
|
||||
Dashed,
|
||||
Dotted
|
||||
/// <summary>
|
||||
/// 点线
|
||||
/// </summary>
|
||||
Dotted,
|
||||
/// <summary>
|
||||
/// 点划线
|
||||
/// </summary>
|
||||
DashDot,
|
||||
/// <summary>
|
||||
/// 双点划线
|
||||
/// </summary>
|
||||
DashDotDot,
|
||||
}
|
||||
[SerializeField] private bool m_Show = true;
|
||||
[SerializeField] private Type m_Type = Type.Solid;
|
||||
|
||||
@@ -173,6 +173,22 @@ namespace XCharts
|
||||
nnp = i < serie.dataPoints.Count - 1 ? serie.dataPoints[i + 1] : np;
|
||||
isFinish = DrawStepLine(vh, serieIndex, serie, xAxis, lp, np, nnp, i, lineColor, areaColor, areaToColor, zeroPos);
|
||||
break;
|
||||
case LineType.Dash:
|
||||
ChartHelper.DrawDashLine(vh, lp, np, serie.lineStyle.width, lineColor);
|
||||
isFinish = true;
|
||||
break;
|
||||
case LineType.Dot:
|
||||
ChartHelper.DrawDotLine(vh, lp, np, serie.lineStyle.width, lineColor);
|
||||
isFinish = true;
|
||||
break;
|
||||
case LineType.DashDot:
|
||||
ChartHelper.DrawDashDotLine(vh, lp, np, serie.lineStyle.width, lineColor);
|
||||
isFinish = true;
|
||||
break;
|
||||
case LineType.DashDotDot:
|
||||
ChartHelper.DrawDashDotDotLine(vh, lp, np, serie.lineStyle.width, lineColor);
|
||||
isFinish = true;
|
||||
break;
|
||||
}
|
||||
if (isFinish) serie.animation.SetDataFinish(i);
|
||||
lp = np;
|
||||
@@ -312,6 +328,22 @@ namespace XCharts
|
||||
nnp = i < serie.dataPoints.Count - 1 ? serie.dataPoints[i + 1] : np;
|
||||
isFinish = DrawStepLine(vh, serieIndex, serie, yAxis, lp, np, nnp, i, lineColor, areaColor, areaToColor, zeroPos);
|
||||
break;
|
||||
case LineType.Dash:
|
||||
ChartHelper.DrawDashLine(vh, lp, np, serie.lineStyle.width, lineColor);
|
||||
isFinish = true;
|
||||
break;
|
||||
case LineType.Dot:
|
||||
ChartHelper.DrawDotLine(vh, lp, np, serie.lineStyle.width, lineColor);
|
||||
isFinish = true;
|
||||
break;
|
||||
case LineType.DashDot:
|
||||
ChartHelper.DrawDashDotLine(vh, lp, np, serie.lineStyle.width, lineColor);
|
||||
isFinish = true;
|
||||
break;
|
||||
case LineType.DashDotDot:
|
||||
ChartHelper.DrawDashDotDotLine(vh, lp, np, serie.lineStyle.width, lineColor);
|
||||
isFinish = true;
|
||||
break;
|
||||
}
|
||||
if (isFinish) serie.animation.SetDataFinish(i);
|
||||
lp = np;
|
||||
|
||||
@@ -245,6 +245,83 @@ namespace XCharts
|
||||
vh.AddUIVertexQuad(vertex);
|
||||
}
|
||||
|
||||
public static void DrawDashLine(VertexHelper vh, Vector3 p1, Vector3 p2, float size, Color32 color, float dashLen = 15f, float blankLen = 7f)
|
||||
{
|
||||
float dist = Vector3.Distance(p1, p2);
|
||||
if (dist < 0.1f) return;
|
||||
int segment = Mathf.CeilToInt(dist / (dashLen + blankLen));
|
||||
Vector3 dir = (p2 - p1).normalized;
|
||||
Vector3 sp = p1, np;
|
||||
for (int i = 1; i <= segment; i++)
|
||||
{
|
||||
np = p1 + dir * dist * i / segment;
|
||||
var dashep = np - dir * blankLen;
|
||||
DrawLine(vh, sp, dashep, size, color);
|
||||
sp = np;
|
||||
}
|
||||
DrawLine(vh, sp, p2, size, color);
|
||||
}
|
||||
public static void DrawDotLine(VertexHelper vh, Vector3 p1, Vector3 p2, float size, Color32 color, float dotLen = 5f, float blankLen = 5f)
|
||||
{
|
||||
float dist = Vector3.Distance(p1, p2);
|
||||
if (dist < 0.1f) return;
|
||||
int segment = Mathf.CeilToInt(dist / (dotLen + blankLen));
|
||||
Vector3 dir = (p2 - p1).normalized;
|
||||
Vector3 sp = p1, np;
|
||||
for (int i = 1; i <= segment; i++)
|
||||
{
|
||||
np = p1 + dir * dist * i / segment;
|
||||
var dashep = np - dir * blankLen;
|
||||
DrawLine(vh, sp, dashep, size, color);
|
||||
sp = np;
|
||||
}
|
||||
DrawLine(vh, sp, p2, size, color);
|
||||
}
|
||||
|
||||
public static void DrawDashDotLine(VertexHelper vh, Vector3 p1, Vector3 p2, float size, Color32 color, float dashLen = 15f, float blankDotLen = 15f)
|
||||
{
|
||||
float dist = Vector3.Distance(p1, p2);
|
||||
if (dist < 0.1f) return;
|
||||
int segment = Mathf.CeilToInt(dist / (dashLen + blankDotLen));
|
||||
Vector3 dir = (p2 - p1).normalized;
|
||||
Vector3 sp = p1, np;
|
||||
for (int i = 1; i <= segment; i++)
|
||||
{
|
||||
np = p1 + dir * dist * i / segment;
|
||||
var dashep = np - dir * blankDotLen;
|
||||
DrawLine(vh, sp, dashep, size, color);
|
||||
var dotsp = dashep + (blankDotLen - 2 * size) / 2 * dir;
|
||||
var dotep = dotsp + 2 * size * dir;
|
||||
DrawLine(vh, dotsp, dotep, size, color);
|
||||
sp = np;
|
||||
}
|
||||
DrawLine(vh, sp, p2, size, color);
|
||||
}
|
||||
|
||||
public static void DrawDashDotDotLine(VertexHelper vh, Vector3 p1, Vector3 p2, float size, Color32 color, float dashLen = 15f, float blankDotLen = 20f)
|
||||
{
|
||||
float dist = Vector3.Distance(p1, p2);
|
||||
if (dist < 0.1f) return;
|
||||
int segment = Mathf.CeilToInt(dist / (dashLen + blankDotLen));
|
||||
Vector3 dir = (p2 - p1).normalized;
|
||||
Vector3 sp = p1, np;
|
||||
for (int i = 1; i <= segment; i++)
|
||||
{
|
||||
np = p1 + dir * dist * i / segment;
|
||||
var dashep = np - dir * blankDotLen;
|
||||
DrawLine(vh, sp, dashep, size, color);
|
||||
var dotsp = dashep + (blankDotLen / 2 - 2 * size) / 2 * dir;
|
||||
var dotep = dotsp + 2 * size * dir;
|
||||
DrawLine(vh, dotsp, dotep, size, color);
|
||||
var dotsp2 = dashep + blankDotLen / 2 * dir;
|
||||
dotsp2 = dotsp2 + (blankDotLen / 4 - 2 * size) / 2 * dir;
|
||||
var dotep2 = dotsp2 + 2 * size * dir;
|
||||
DrawLine(vh, dotsp2, dotep2, size, color);
|
||||
sp = np;
|
||||
}
|
||||
DrawLine(vh, sp, p2, size, color);
|
||||
}
|
||||
|
||||
public static void DrawPolygon(VertexHelper vh, Vector3 p, float size, Color32 color)
|
||||
{
|
||||
Vector3 p1 = new Vector3(p.x - size, p.y - size);
|
||||
|
||||
Reference in New Issue
Block a user