mirror of
https://github.com/XCharts-Team/XCharts.git
synced 2026-05-16 13:30:10 +00:00
增加AreaStyle对虚线、点线、点划线的支持
This commit is contained in:
@@ -193,20 +193,10 @@ namespace XCharts
|
||||
areaColor, areaToColor, zeroPos);
|
||||
break;
|
||||
case LineType.Dash:
|
||||
ChartDrawer.DrawDashLine(vh, lp, np, serie.lineStyle.width, lineColor);
|
||||
isFinish = true;
|
||||
break;
|
||||
case LineType.Dot:
|
||||
ChartDrawer.DrawDotLine(vh, lp, np, serie.lineStyle.width, lineColor);
|
||||
isFinish = true;
|
||||
break;
|
||||
case LineType.DashDot:
|
||||
ChartDrawer.DrawDashDotLine(vh, lp, np, serie.lineStyle.width, lineColor);
|
||||
isFinish = true;
|
||||
break;
|
||||
case LineType.DashDotDot:
|
||||
ChartDrawer.DrawDashDotDotLine(vh, lp, np, serie.lineStyle.width, lineColor);
|
||||
isFinish = true;
|
||||
DrawOtherLine(vh, serie, xAxis, lp, np, i, lineColor, areaColor, areaToColor, zeroPos);
|
||||
break;
|
||||
}
|
||||
if (isFinish) serie.animation.SetDataFinish(i);
|
||||
@@ -829,6 +819,45 @@ namespace XCharts
|
||||
}
|
||||
}
|
||||
|
||||
private List<Vector3> posList = new List<Vector3>();
|
||||
private bool DrawOtherLine(VertexHelper vh, Serie serie, Axis axis, Vector3 lp,
|
||||
Vector3 np, int dataIndex, Color lineColor, Color areaColor,
|
||||
Color areaToColor, Vector3 zeroPos)
|
||||
{
|
||||
bool isYAxis = axis is YAxis;
|
||||
var lineWidth = serie.lineStyle.width;
|
||||
posList.Clear();
|
||||
switch (serie.lineType)
|
||||
{
|
||||
case LineType.Dash:
|
||||
ChartDrawer.DrawDashLine(vh, lp, np, lineWidth, lineColor, 15, 7, posList);
|
||||
break;
|
||||
case LineType.Dot:
|
||||
ChartDrawer.DrawDotLine(vh, lp, np, lineWidth, lineColor, 5, 5, posList);
|
||||
break;
|
||||
case LineType.DashDot:
|
||||
ChartDrawer.DrawDashDotLine(vh, lp, np, lineWidth, lineColor, 15, 15, posList);
|
||||
break;
|
||||
case LineType.DashDotDot:
|
||||
ChartDrawer.DrawDashDotDotLine(vh, lp, np, lineWidth, lineColor, 15, 20, posList);
|
||||
break;
|
||||
}
|
||||
if (serie.areaStyle.show && !isYAxis && posList.Count > 0)
|
||||
{
|
||||
lp = posList[0];
|
||||
var value = serie.GetSerieData(dataIndex).data[1];
|
||||
for (int i = 0; i < posList.Count; i++)
|
||||
{
|
||||
np = posList[i];
|
||||
var start = new Vector3(lp.x, value > 0 ? (lp.y - lineWidth) : (lp.y + lineWidth));
|
||||
var end = new Vector3(np.x, value > 0 ? (np.y - lineWidth) : (np.y + lineWidth));
|
||||
DrawPolygonToZero(vh, start, end, axis, zeroPos, areaColor, areaToColor, Vector3.zero);
|
||||
lp = np;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private List<Vector3> bezierPoints = new List<Vector3>();
|
||||
private Vector3 smoothStartPosUp, smoothStartPosDn;
|
||||
private bool DrawSmoothLine(VertexHelper vh, Serie serie, Axis xAxis, Vector3 lp,
|
||||
|
||||
@@ -42,83 +42,100 @@ namespace XCharts
|
||||
}
|
||||
|
||||
public static void DrawDashLine(VertexHelper vh, Vector3 p1, Vector3 p2, float size, Color32 color,
|
||||
float dashLen = 15f, float blankLen = 7f)
|
||||
float dashLen = 15f, float blankLen = 7f, List<Vector3> posList = null)
|
||||
{
|
||||
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;
|
||||
if (posList != null) posList.Clear();
|
||||
for (int i = 1; i <= segment; i++)
|
||||
{
|
||||
if (posList != null) posList.Add(sp);
|
||||
np = p1 + dir * dist * i / segment;
|
||||
var dashep = np - dir * blankLen;
|
||||
DrawLine(vh, sp, dashep, size, color);
|
||||
sp = np;
|
||||
}
|
||||
if (posList != null) posList.Add(p2);
|
||||
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 dotLen = 5f, float blankLen = 5f, List<Vector3> posList = null)
|
||||
{
|
||||
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;
|
||||
if (posList != null) posList.Clear();
|
||||
for (int i = 1; i <= segment; i++)
|
||||
{
|
||||
if (posList != null) posList.Add(sp);
|
||||
np = p1 + dir * dist * i / segment;
|
||||
var dashep = np - dir * blankLen;
|
||||
DrawLine(vh, sp, dashep, size, color);
|
||||
sp = np;
|
||||
}
|
||||
if (posList != null) posList.Add(p2);
|
||||
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 dashLen = 15f, float blankDotLen = 15f, List<Vector3> posList = null)
|
||||
{
|
||||
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;
|
||||
if (posList != null) posList.Clear();
|
||||
for (int i = 1; i <= segment; i++)
|
||||
{
|
||||
if (posList != null) posList.Add(sp);
|
||||
np = p1 + dir * dist * i / segment;
|
||||
var dashep = np - dir * blankDotLen;
|
||||
DrawLine(vh, sp, dashep, size, color);
|
||||
if (posList != null) posList.Add(dashep);
|
||||
var dotsp = dashep + (blankDotLen - 2 * size) / 2 * dir;
|
||||
var dotep = dotsp + 2 * size * dir;
|
||||
DrawLine(vh, dotsp, dotep, size, color);
|
||||
if (posList != null) posList.Add(dotsp);
|
||||
sp = np;
|
||||
}
|
||||
if (posList != null) posList.Add(p2);
|
||||
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)
|
||||
Color32 color, float dashLen = 15f, float blankDotLen = 20f, List<Vector3> posList = null)
|
||||
{
|
||||
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;
|
||||
if (posList != null) posList.Clear();
|
||||
for (int i = 1; i <= segment; i++)
|
||||
{
|
||||
if (posList != null) posList.Add(sp);
|
||||
np = p1 + dir * dist * i / segment;
|
||||
var dashep = np - dir * blankDotLen;
|
||||
DrawLine(vh, sp, dashep, size, color);
|
||||
if (posList != null) posList.Add(dashep);
|
||||
var dotsp = dashep + (blankDotLen / 2 - 2 * size) / 2 * dir;
|
||||
var dotep = dotsp + 2 * size * dir;
|
||||
DrawLine(vh, dotsp, dotep, size, color);
|
||||
if (posList != null) posList.Add(dotep);
|
||||
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);
|
||||
if (posList != null) posList.Add(dotep2);
|
||||
sp = np;
|
||||
}
|
||||
if (posList != null) posList.Add(p2);
|
||||
DrawLine(vh, sp, p2, size, color);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user