From 72af5c0d55c438bc0ab7ea795d053741a5a7c0f7 Mon Sep 17 00:00:00 2001 From: Jacob Christie Date: Mon, 11 Dec 2017 03:54:03 -0400 Subject: [PATCH 1/3] Refactored ChartUtils method into CGPoint extension --- .../Implementations/ChartBaseDataSet.swift | 4 +-- .../Formatters/DefaultValueFormatter.swift | 3 ++ .../Charts/Highlight/RadarHighlighter.swift | 6 ++-- .../Charts/Renderers/RadarChartRenderer.swift | 34 +++++++------------ .../Renderers/XAxisRendererRadarChart.swift | 2 +- .../Renderers/YAxisRendererRadarChart.swift | 4 +-- Source/Charts/Utils/ChartUtils.swift | 19 +++++------ 7 files changed, 30 insertions(+), 42 deletions(-) diff --git a/Source/Charts/Data/Implementations/ChartBaseDataSet.swift b/Source/Charts/Data/Implementations/ChartBaseDataSet.swift index 7136f2f04b..1143daf1a1 100644 --- a/Source/Charts/Data/Implementations/ChartBaseDataSet.swift +++ b/Source/Charts/Data/Implementations/ChartBaseDataSet.swift @@ -279,7 +279,7 @@ open class ChartBaseDataSet: NSObject, IChartDataSet { if needsFormatter { - return ChartUtils.defaultValueFormatter() + return DefaultValueFormatter.default } return _valueFormatter @@ -422,5 +422,3 @@ open class ChartBaseDataSet: NSObject, IChartDataSet return copy } } - - diff --git a/Source/Charts/Formatters/DefaultValueFormatter.swift b/Source/Charts/Formatters/DefaultValueFormatter.swift index aac13f1b41..362b9a837f 100644 --- a/Source/Charts/Formatters/DefaultValueFormatter.swift +++ b/Source/Charts/Formatters/DefaultValueFormatter.swift @@ -14,6 +14,9 @@ import Foundation @objc(ChartDefaultValueFormatter) open class DefaultValueFormatter: NSObject, IValueFormatter { + /// The default value formatter used for all chart components that needs a default + public static var `default` = DefaultValueFormatter(decimals: 1) + public typealias Block = ( _ value: Double, _ entry: ChartDataEntry, diff --git a/Source/Charts/Highlight/RadarHighlighter.swift b/Source/Charts/Highlight/RadarHighlighter.swift index 8df2d3195a..bedd95037c 100644 --- a/Source/Charts/Highlight/RadarHighlighter.swift +++ b/Source/Charts/Highlight/RadarHighlighter.swift @@ -66,10 +66,8 @@ open class RadarHighlighter: PieRadarHighlighter let y = (entry.y - chart.chartYMin) - let p = ChartUtils.getPosition( - center: chart.centerOffsets, - dist: CGFloat(y) * factor * CGFloat(phaseY), - angle: sliceangle * CGFloat(index) * CGFloat(phaseX) + chart.rotationAngle) + let p = chart.centerOffsets.moving(distance: CGFloat(y) * factor * CGFloat(phaseY), + atAngle: sliceangle * CGFloat(index) * CGFloat(phaseX) + chart.rotationAngle) vals.append(Highlight(x: Double(index), y: entry.y, xPx: p.x, yPx: p.y, dataSetIndex: i, axis: dataSet.axisDependency)) } diff --git a/Source/Charts/Renderers/RadarChartRenderer.swift b/Source/Charts/Renderers/RadarChartRenderer.swift index ab4890f646..3b9b87fbd9 100644 --- a/Source/Charts/Renderers/RadarChartRenderer.swift +++ b/Source/Charts/Renderers/RadarChartRenderer.swift @@ -76,10 +76,8 @@ open class RadarChartRenderer: LineRadarRenderer { guard let e = dataSet.entryForIndex(j) else { continue } - let p = ChartUtils.getPosition( - center: center, - dist: CGFloat((e.y - chart.chartYMin) * Double(factor) * phaseY), - angle: sliceangle * CGFloat(j) * CGFloat(phaseX) + chart.rotationAngle) + let p = center.moving(distance: CGFloat((e.y - chart.chartYMin) * Double(factor) * phaseY), + atAngle: sliceangle * CGFloat(j) * CGFloat(phaseX) + chart.rotationAngle) if p.x.isNaN { @@ -170,10 +168,8 @@ open class RadarChartRenderer: LineRadarRenderer { guard let e = dataSet.entryForIndex(j) else { continue } - let p = ChartUtils.getPosition( - center: center, - dist: CGFloat(e.y - chart.chartYMin) * factor * CGFloat(phaseY), - angle: sliceangle * CGFloat(j) * CGFloat(phaseX) + chart.rotationAngle) + let p = center.moving(distance: CGFloat(e.y - chart.chartYMin) * factor * CGFloat(phaseY), + atAngle: sliceangle * CGFloat(j) * CGFloat(phaseX) + chart.rotationAngle) let valueFont = dataSet.valueFont @@ -197,10 +193,8 @@ open class RadarChartRenderer: LineRadarRenderer if let icon = e.icon, dataSet.isDrawIconsEnabled { - var pIcon = ChartUtils.getPosition( - center: center, - dist: CGFloat(e.y) * factor * CGFloat(phaseY) + iconsOffset.y, - angle: sliceangle * CGFloat(j) * CGFloat(phaseX) + chart.rotationAngle) + var pIcon = center.moving(distance: CGFloat(e.y) * factor * CGFloat(phaseY) + iconsOffset.y, + atAngle: sliceangle * CGFloat(j) * CGFloat(phaseX) + chart.rotationAngle) pIcon.y += iconsOffset.x ChartUtils.drawImage(context: context, @@ -248,10 +242,8 @@ open class RadarChartRenderer: LineRadarRenderer for i in stride(from: 0, to: maxEntryCount, by: xIncrements) { - let p = ChartUtils.getPosition( - center: center, - dist: CGFloat(chart.yRange) * factor, - angle: sliceangle * CGFloat(i) + rotationangle) + let p = center.moving(distance: CGFloat(chart.yRange) * factor, + atAngle: sliceangle * CGFloat(i) + rotationangle) _webLineSegmentsBuffer[0].x = center.x _webLineSegmentsBuffer[0].y = center.y @@ -274,8 +266,8 @@ open class RadarChartRenderer: LineRadarRenderer { let r = CGFloat(chart.yAxis.entries[j] - chart.chartYMin) * factor - let p1 = ChartUtils.getPosition(center: center, dist: r, angle: sliceangle * CGFloat(i) + rotationangle) - let p2 = ChartUtils.getPosition(center: center, dist: r, angle: sliceangle * CGFloat(i + 1) + rotationangle) + let p1 = center.moving(distance: r, atAngle: sliceangle * CGFloat(i) + rotationangle) + let p2 = center.moving(distance: r, atAngle: sliceangle * CGFloat(i + 1) + rotationangle) _webLineSegmentsBuffer[0].x = p1.x _webLineSegmentsBuffer[0].y = p1.y @@ -336,10 +328,8 @@ open class RadarChartRenderer: LineRadarRenderer let y = e.y - chart.chartYMin - _highlightPointBuffer = ChartUtils.getPosition( - center: center, - dist: CGFloat(y) * factor * CGFloat(animator.phaseY), - angle: sliceangle * CGFloat(high.x) * CGFloat(animator.phaseX) + chart.rotationAngle) + _highlightPointBuffer = center.moving(distance: CGFloat(y) * factor * CGFloat(animator.phaseY), + atAngle: sliceangle * CGFloat(high.x) * CGFloat(animator.phaseX) + chart.rotationAngle) high.setDraw(pt: _highlightPointBuffer) diff --git a/Source/Charts/Renderers/XAxisRendererRadarChart.swift b/Source/Charts/Renderers/XAxisRendererRadarChart.swift index ab57149cce..85aeecbf44 100644 --- a/Source/Charts/Renderers/XAxisRendererRadarChart.swift +++ b/Source/Charts/Renderers/XAxisRendererRadarChart.swift @@ -58,7 +58,7 @@ open class XAxisRendererRadarChart: XAxisRenderer let angle = (sliceangle * CGFloat(i) + chart.rotationAngle).truncatingRemainder(dividingBy: 360.0) - let p = ChartUtils.getPosition(center: center, dist: CGFloat(chart.yRange) * factor + xAxis.labelRotatedWidth / 2.0, angle: angle) + let p = center.moving(distance: CGFloat(chart.yRange) * factor + xAxis.labelRotatedWidth / 2.0, atAngle: angle) drawLabel(context: context, formattedLabel: label, diff --git a/Source/Charts/Renderers/YAxisRendererRadarChart.swift b/Source/Charts/Renderers/YAxisRendererRadarChart.swift index b23b987556..12394149ed 100644 --- a/Source/Charts/Renderers/YAxisRendererRadarChart.swift +++ b/Source/Charts/Renderers/YAxisRendererRadarChart.swift @@ -186,7 +186,7 @@ open class YAxisRendererRadarChart: YAxisRenderer { let r = CGFloat(yAxis.entries[j] - yAxis._axisMinimum) * factor - let p = ChartUtils.getPosition(center: center, dist: r, angle: chart.rotationAngle) + let p = center.moving(distance: r, atAngle: chart.rotationAngle) let label = yAxis.getFormattedLabel(j) @@ -252,7 +252,7 @@ open class YAxisRendererRadarChart: YAxisRenderer for j in 0 ..< (data.maxEntryCountSet?.entryCount ?? 0) { - let p = ChartUtils.getPosition(center: center, dist: r, angle: sliceangle * CGFloat(j) + chart.rotationAngle) + let p = center.moving(distance: r, atAngle: sliceangle * CGFloat(j) + chart.rotationAngle) if j == 0 { diff --git a/Source/Charts/Utils/ChartUtils.swift b/Source/Charts/Utils/ChartUtils.swift index d5b441e164..a198d79420 100644 --- a/Source/Charts/Utils/ChartUtils.swift +++ b/Source/Charts/Utils/ChartUtils.swift @@ -33,6 +33,14 @@ extension FloatingPoint { } } +extension CGPoint { + /// Calculates the position around a center point, depending on the distance from the center, and the angle of the position around the center. + func moving(distance: CGFloat, atAngle angle: CGFloat) -> CGPoint { + return CGPoint(x: x + distance * cos(angle.DEG2RAD), + y: y + distance * sin(angle.DEG2RAD)) + } +} + extension CGSize { func rotatedBy(degrees: CGFloat) -> CGSize { let radians = degrees.DEG2RAD @@ -93,16 +101,7 @@ open class ChartUtils return number + Double.ulpOfOne } } - - /// Calculates the position around a center point, depending on the distance from the center, and the angle of the position around the center. - internal class func getPosition(center: CGPoint, dist: CGFloat, angle: CGFloat) -> CGPoint - { - return CGPoint( - x: center.x + dist * cos(angle.DEG2RAD), - y: center.y + dist * sin(angle.DEG2RAD) - ) - } - + open class func drawImage( context: CGContext, image: NSUIImage, From b8e837340735880a6c1213402eac3456c41101ae Mon Sep 17 00:00:00 2001 From: Jacob Christie Date: Mon, 11 Dec 2017 04:13:54 -0400 Subject: [PATCH 2/3] Replaced ChartUtils.defaultValueFormatter() --- Source/Charts/Data/Implementations/ChartBaseDataSet.swift | 2 +- Source/Charts/Formatters/DefaultValueFormatter.swift | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/Source/Charts/Data/Implementations/ChartBaseDataSet.swift b/Source/Charts/Data/Implementations/ChartBaseDataSet.swift index 1143daf1a1..b78867679e 100644 --- a/Source/Charts/Data/Implementations/ChartBaseDataSet.swift +++ b/Source/Charts/Data/Implementations/ChartBaseDataSet.swift @@ -279,7 +279,7 @@ open class ChartBaseDataSet: NSObject, IChartDataSet { if needsFormatter { - return DefaultValueFormatter.default + return ChartUtils.defaultValueFormatter() } return _valueFormatter diff --git a/Source/Charts/Formatters/DefaultValueFormatter.swift b/Source/Charts/Formatters/DefaultValueFormatter.swift index 362b9a837f..aac13f1b41 100644 --- a/Source/Charts/Formatters/DefaultValueFormatter.swift +++ b/Source/Charts/Formatters/DefaultValueFormatter.swift @@ -14,9 +14,6 @@ import Foundation @objc(ChartDefaultValueFormatter) open class DefaultValueFormatter: NSObject, IValueFormatter { - /// The default value formatter used for all chart components that needs a default - public static var `default` = DefaultValueFormatter(decimals: 1) - public typealias Block = ( _ value: Double, _ entry: ChartDataEntry, From 3b4e1394e2917e7d51b3a814cd3b1f778933e6ae Mon Sep 17 00:00:00 2001 From: Jacob Christie Date: Tue, 2 Jan 2018 18:25:22 -0400 Subject: [PATCH 3/3] Codestyle fixes --- Source/Charts/Utils/ChartUtils.swift | 36 ++++++++++++++++++---------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/Source/Charts/Utils/ChartUtils.swift b/Source/Charts/Utils/ChartUtils.swift index d231509cad..9f73270bda 100644 --- a/Source/Charts/Utils/ChartUtils.swift +++ b/Source/Charts/Utils/ChartUtils.swift @@ -12,30 +12,37 @@ import Foundation import CoreGraphics -extension FloatingPoint { - var DEG2RAD: Self { +extension FloatingPoint +{ + var DEG2RAD: Self + { return self * .pi / 180 } - var RAD2DEG: Self { + var RAD2DEG: Self + { return self * 180 / .pi } /// - returns: An angle between 0.0 < 360.0 (not less than zero, less than 360) /// NOTE: Value must be in degrees - var normalizedAngle: Self { + var normalizedAngle: Self + { let angle = truncatingRemainder(dividingBy: 360) return (sign == .minus) ? angle + 360 : angle } } -extension CGSize { - func rotatedBy(degrees: CGFloat) -> CGSize { +extension CGSize +{ + func rotatedBy(degrees: CGFloat) -> CGSize + { let radians = degrees.DEG2RAD return rotatedBy(radians: radians) } - func rotatedBy(radians: CGFloat) -> CGSize { + func rotatedBy(radians: CGFloat) -> CGSize + { return CGSize( width: abs(width * cos(radians)) + abs(height * sin(radians)), height: abs(width * sin(radians)) + abs(height * cos(radians)) @@ -43,9 +50,11 @@ extension CGSize { } } -extension Double { +extension Double +{ /// Rounds the number to the nearest multiple of it's order of magnitude, rounding away from zero if halfway. - func roundedToNextSignficant() -> Double { + func roundedToNextSignficant() -> Double + { guard !isInfinite, !isNaN, @@ -59,7 +68,8 @@ extension Double { return shifted / magnitude } - var decimalPlaces: Int { + var decimalPlaces: Int + { guard !isNaN, !isInfinite, @@ -77,9 +87,11 @@ extension Double { } } -extension CGPoint { +extension CGPoint +{ /// Calculates the position around a center point, depending on the distance from the center, and the angle of the position around the center. - func moving(distance: CGFloat, atAngle angle: CGFloat) -> CGPoint { + func moving(distance: CGFloat, atAngle angle: CGFloat) -> CGPoint + { return CGPoint(x: x + distance * cos(angle.DEG2RAD), y: y + distance * sin(angle.DEG2RAD)) }