// /// <summary> // /// used internally to draw the division of the axis into a chart mesh // /// </summary> // /// <param name="parent"></param> // /// <param name="parentTransform"></param> // /// <param name="info"></param> // /// <param name="mesh"></param> // /// <param name="group"></param> // /// <param name="orientation"></param> // /// <param name="totalDivisions"></param> // /// <param name="oppositeSide"></param> // /// <param name="skip"></param> // private void DrawDivisions(float scrollOffset,AnyChart parent, Transform parentTransform, ChartDivisionInfo info, IChartMesh mesh, int group, ChartOrientation orientation, float totalDivisions, bool oppositeSide, int skip) // { // //scrollOffset = -scrollOffset; // float parentSize = (orientation == ChartOrientation.Vertical) ? ((IInternalUse)parent).InternalTotalHeight : ((IInternalUse)parent).InternalTotalWidth; // Vector2 startPosition, lengthDirection, advanceDirection; // GetDirectionVectors(parent, info, orientation, 0f, oppositeSide, out startPosition, out lengthDirection, out advanceDirection); // float markDepth = ChartCommon.GetAutoDepth(parent, orientation, info); // float length = ChartCommon.GetAutoLength(parent, orientation, info); // float backLength = (orientation == ChartOrientation.Vertical) ? ((IInternalUse)parent).InternalTotalWidth : ((IInternalUse)parent).InternalTotalHeight; // if (info.MarkBackLength.Automatic == false) // backLength = info.MarkBackLength.Value; // float totaluv = Math.Abs(length); // if (backLength != 0 && markDepth > 0) // totaluv += Math.Abs(backLength) + Math.Abs(markDepth); // Vector2 halfThickness = advanceDirection * (info.MarkThickness * 0.5f); // // if (scrollOffset != 0f) // // last--; // bool hasValues = ((IInternalUse)parent).InternalHasValues(this); // double maxValue = ((IInternalUse)parent).InternalMaxValue(this); // double minValue = ((IInternalUse)parent).InternalMinValue(this); // ChartMainDivisionInfo main = info as ChartMainDivisionInfo; // float divisionComplement = 0f; // float divisionOffsetComplement = 0f; // if (main != null) // { // if(main.Messure == ChartDivisionInfo.DivisionMessure.DataUnits) // { // if (main.UnitsPerDivision <= 0.0001f) // return; // float range = (float)(maxValue - minValue); // totalDivisions = (range / main.UnitsPerDivision) + 1; // divisionComplement = (float)(1f - (main.UnitsPerDivision - Math.Truncate(main.UnitsPerDivision))) / range; // divisionOffsetComplement = (divisionComplement) * parentSize; // } // } // float first, last; // GetStartEnd(parent, orientation, totalDivisions, out first, out last); // float AutoAxisDepth = Depth.Value; // float scrollFactor = (scrollOffset / (float)(maxValue - minValue)); // scrollOffset = scrollFactor * parentSize; // if (Depth.Automatic) // { // AutoAxisDepth = (((IInternalUse)parent).InternalTotalDepth) - markDepth; // } // float floorLast = Mathf.Floor(last); // for (float i = first; i < floorLast; i++) // { // if (skip != -1 && ((int)i) % skip == 0) // continue; // float factor = ((float)i) / (float)(totalDivisions - 1); // float offset = -scrollOffset + factor * parentSize; // if (scrollOffset != 0f) // { // float prevOffs = offset; // offset = offset - Mathf.Floor((offset / parentSize)) * parentSize; //// Debug.Log("prev " + prevOffs); //// Debug.Log("offs " + offset); // if (offset < prevOffs) // { // offset -= divisionOffsetComplement; // } // } // if (offset < 0f) // continue; // Vector2 start = startPosition + advanceDirection * offset; // Vector2 size = halfThickness + length * lengthDirection; // start -= halfThickness; // //size += halfThickness; // float uvoffset = 0f; // Rect r = ChartCommon.FixRect(new Rect(start.x, start.y, size.x, size.y)); // SetMeshUv(mesh, -length / totaluv, uvoffset); // uvoffset += Math.Abs(mesh.Length); // mesh.AddXYRect(r, group, AutoAxisDepth); // if (hasValues) // { // float valFactor = -scrollFactor + factor; // if (scrollOffset != 0f) // { // float prevFact = valFactor; // valFactor -= Mathf.Floor(valFactor); // if(valFactor < prevFact) // { // valFactor -= divisionComplement; // } // } // //valFactor += scrollFactor; // double offsetPos = (maxValue - minValue) * valFactor; // double scroll = minValue + ((maxValue - minValue) * scrollFactor); // double val = scroll + offsetPos; // string toSet = ""; // if (format == AxisFormat.Number) // toSet = ChartAdancedSettings.Instance.FormatFractionDigits(info.FractionDigits, (float)val); // else // { // DateTime date = ChartDateUtility.ValueToDate(val); // if (format == AxisFormat.DateTime) // toSet = ChartDateUtility.DateToDateTimeString(date); // else // { // if (format == AxisFormat.Date) // toSet = ChartDateUtility.DateToDateString(date); // else // toSet = ChartDateUtility.DateToTimeString(date); // } // } // toSet = info.TextPrefix + toSet + info.TextSuffix; // Vector2 textPos = new Vector2(start.x, start.y); // textPos += lengthDirection * info.TextSeperation; // TextData userData = new TextData(); // userData.interp = factor; // userData.info = info; // userData.fractionDigits = info.FractionDigits; // mesh.AddText(parent, info.TextPrefab, parentTransform, info.FontSize, info.FontSharpness, toSet, textPos.x, textPos.y, AutoAxisDepth + info.TextDepth,0f, userData); // } // if (markDepth > 0) // { // if (orientation == ChartOrientation.Horizontal) // { // SetMeshUv(mesh, markDepth / totaluv, uvoffset); // r = ChartCommon.FixRect(new Rect(start.x, AutoAxisDepth, size.x, markDepth)); // mesh.AddXZRect(r, group, start.y); // } // else // { // SetMeshUv(mesh, -markDepth / totaluv, uvoffset); // r = ChartCommon.FixRect(new Rect(start.y, AutoAxisDepth, size.y, markDepth)); // mesh.AddYZRect(r, group, start.x); // } // uvoffset += Math.Abs(mesh.Length); // if (backLength != 0) // { // SetMeshUv(mesh, backLength / totaluv, uvoffset); // uvoffset += Math.Abs(mesh.Length); // Vector2 backSize = halfThickness + backLength * lengthDirection; // Rect backR = ChartCommon.FixRect(new Rect(start.x, start.y, backSize.x, backSize.y)); // mesh.AddXYRect(backR, group, AutoAxisDepth + markDepth); // } // } // } // } /// <summary> /// used internally to determine drawing direction of the each chart division /// </summary> /// <param name="parent"></param> /// <param name="info"></param> /// <param name="orientation"></param> /// <param name="oppositeSide"></param> /// <param name="startPosition"></param> /// <param name="lengthDirection"></param> /// <param name="advanceDirection"></param> private void GetDirectionVectors(AnyChart parent, ChartDivisionInfo info, ChartOrientation orientation, float scrollOffset, bool oppositeSide, out DoubleVector3 startPosition, out DoubleVector3 lengthDirection, out DoubleVector3 advanceDirection) { if (orientation == ChartOrientation.Horizontal) { advanceDirection = new DoubleVector3(1f, 0f); if (oppositeSide) { startPosition = new DoubleVector3(scrollOffset, ((IInternalUse)parent).InternalTotalHeight); lengthDirection = new DoubleVector3(0f, -1f); return; } startPosition = new DoubleVector3(0f, 0f); lengthDirection = new DoubleVector3(0f, 1f); return; } advanceDirection = new DoubleVector3(0f, 1f); if (oppositeSide) { startPosition = new DoubleVector3(0f, 0f); lengthDirection = new DoubleVector3(1f, 0f); return; } startPosition = new DoubleVector3(((IInternalUse)parent).InternalTotalWidth, scrollOffset); lengthDirection = new DoubleVector3(-1f, 0f); }
internal static float GetAutoLength(AnyChart parent, ChartOrientation orientation, ChartDivisionInfo info) { float length = (orientation == ChartOrientation.Vertical) ? ((IInternalUse)parent).InternalTotalWidth : ((IInternalUse)parent).InternalTotalHeight; if (info.MarkLength.Automatic == false) { length = info.MarkLength.Value; } return(length); }
internal static float GetAutoDepth(AnyChart parent, ChartOrientation orientation, ChartDivisionInfo info) { float depth = ((IInternalUse)parent).InternalTotalDepth; if (info.MarkDepth.Automatic == false) { depth = info.MarkDepth.Value; } return(depth); }
private void DrawDivisions(double scrollOffset, AnyChart parent, Transform parentTransform, ChartDivisionInfo info, IChartMesh mesh, int group, ChartOrientation orientation, double gap, bool oppositeSide, double mainGap) { //scrollOffset = -scrollOffset; double parentSize = (orientation == ChartOrientation.Vertical) ? ((IInternalUse)parent).InternalTotalHeight : ((IInternalUse)parent).InternalTotalWidth; DoubleVector3 startPosition, lengthDirection, advanceDirection; GetDirectionVectors(parent, info, orientation, 0f, oppositeSide, out startPosition, out lengthDirection, out advanceDirection); double markDepth = ChartCommon.GetAutoDepth(parent, orientation, info); double length = ChartCommon.GetAutoLength(parent, orientation, info); double backLength = (orientation == ChartOrientation.Vertical) ? ((IInternalUse)parent).InternalTotalWidth : ((IInternalUse)parent).InternalTotalHeight; if (info.MarkBackLength.Automatic == false) { backLength = info.MarkBackLength.Value; } double totaluv = Math.Abs(length); if (backLength != 0 && markDepth > 0) { totaluv += Math.Abs(backLength) + Math.Abs(markDepth); } DoubleVector3 halfThickness = advanceDirection * (info.MarkThickness * 0.5f); // if (scrollOffset != 0f) // last--; bool hasValues = ((IInternalUse)parent).InternalHasValues(this); double maxValue = ((IInternalUse)parent).InternalMaxValue(this); double minValue = ((IInternalUse)parent).InternalMinValue(this); double range = maxValue - minValue; float AutoAxisDepth = Depth.Value; // float scrollFactor = (scrollOffset / (float)(maxValue - minValue)); //scrollOffset = scrollFactor * parentSize; if (Depth.Automatic) { AutoAxisDepth = (float)((((IInternalUse)parent).InternalTotalDepth) - markDepth); } double startValue = (scrollOffset + minValue); double endValue = (scrollOffset + maxValue) + double.Epsilon; double direction = 1.0; Func <double, double> ValueToPosition = x => ((x - startValue) / range) * parentSize; if (startValue > endValue) { direction = -1.0; //ValueToPosition = x => (1.0- ((x - startValue) / range)) * parentSize; } gap = Math.Abs(gap); double fraction = gap - (scrollOffset - Math.Floor((scrollOffset / gap) - double.Epsilon) * gap); double mainfraction = -1f; double currentMain = 0f; if (mainGap > 0f) { mainfraction = mainGap - (scrollOffset - Math.Floor((scrollOffset / mainGap) - double.Epsilon) * mainGap); currentMain = (scrollOffset + minValue + mainfraction); } int i = 0; mTmpToRemove.Clear(); double startRange = startValue + fraction; foreach (double key in mFormats.Keys) { if (key * direction > endValue * direction || key * direction < startRange * direction) { mTmpToRemove.Add(key); } } for (int k = 0; k < mTmpToRemove.Count; k++) { mFormats.Remove(mTmpToRemove[k]); } for (double current = startRange; direction *current <= direction *endValue; current += gap * direction) { ++i; if (i > 3000) { break; } if (mainGap > 0.0) { if (Math.Abs(current - currentMain) < 0.00001) { currentMain += mainGap; continue; } if (current > currentMain) { currentMain += mainGap; } } double offset = ValueToPosition(current); if (offset < 0 || offset > parentSize) { continue; } DoubleVector3 start = startPosition + advanceDirection * offset; DoubleVector3 size = halfThickness + length * lengthDirection; start -= halfThickness; //size += halfThickness; float uvoffset = 0f; Rect r = ChartCommon.FixRect(new Rect((float)start.x, (float)start.y, (float)size.x, (float)size.y)); SetMeshUv(mesh, (float)(-length / totaluv), uvoffset); uvoffset += Math.Abs(mesh.Length); mesh.AddXYRect(r, group, AutoAxisDepth); if (hasValues) { double val = Math.Round(current * 1000.0) / 1000.0; string toSet = ""; double keyVal = val;// (int)Math.Round(val); var dic = (orientation == ChartOrientation.Horizontal) ? parent.HorizontalValueToStringMap : parent.VerticalValueToStringMap; if (!(Math.Abs(val - keyVal) < 0.001 && dic.TryGetValue(keyVal, out toSet))) { if (mFormats.TryGetValue(val, out toSet) == false) { if (format == AxisFormat.Number) { toSet = ChartAdancedSettings.Instance.FormatFractionDigits(info.FractionDigits, val); } else { DateTime date = ChartDateUtility.ValueToDate(val); if (format == AxisFormat.DateTime) { toSet = ChartDateUtility.DateToDateTimeString(date, parent.CustomDateTimeFormat); } else { if (format == AxisFormat.Date) { toSet = ChartDateUtility.DateToDateString(date); } else { toSet = ChartDateUtility.DateToTimeString(date); } } } toSet = info.TextPrefix + toSet + info.TextSuffix; mFormats[val] = toSet; } } else { toSet = info.TextPrefix + toSet + info.TextSuffix; } DoubleVector3 textPos = new DoubleVector3(start.x, start.y); textPos += lengthDirection * info.TextSeperation; TextData userData = new TextData(); userData.interp = (float)(offset / parentSize); userData.info = info; userData.fractionDigits = info.FractionDigits; mesh.AddText(parent, info.TextPrefab, parentTransform, info.FontSize, info.FontSharpness, toSet, (float)textPos.x, (float)textPos.y, AutoAxisDepth + info.TextDepth, 0f, userData); } if (markDepth > 0) { if (orientation == ChartOrientation.Horizontal) { SetMeshUv(mesh, (float)(markDepth / totaluv), uvoffset); r = ChartCommon.FixRect(new Rect((float)start.x, AutoAxisDepth, (float)size.x, (float)markDepth)); mesh.AddXZRect(r, group, (float)start.y); } else { SetMeshUv(mesh, (float)(-markDepth / totaluv), uvoffset); r = ChartCommon.FixRect(new Rect((float)start.y, AutoAxisDepth, (float)size.y, (float)markDepth)); mesh.AddYZRect(r, group, (float)start.x); } uvoffset += Math.Abs(mesh.Length); if (backLength != 0) { SetMeshUv(mesh, (float)(backLength / totaluv), uvoffset); uvoffset += Math.Abs(mesh.Length); DoubleVector3 backSize = halfThickness + backLength * lengthDirection; Rect backR = ChartCommon.FixRect(new Rect((float)start.x, (float)start.y, (float)backSize.x, (float)backSize.y)); mesh.AddXYRect(backR, group, (float)(AutoAxisDepth + markDepth)); } } } // Debug.Log("start"); // Debug.Log(mFormats.Count); // Debug.Log(cached); }