annotate Sources/StockCharts/LineChart/Helpers/LinePath.swift @ 21:5135ff3343ae

Rename project to StockCharts
author Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
date Fri, 30 Apr 2021 17:40:33 +0200
parents Sources/InteractiveCharts/LineChart/Helpers/LinePath.swift@136de51a74f2
children 127af64e264e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
1 //
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
2 // LinePath.swift
21
5135ff3343ae Rename project to StockCharts
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 18
diff changeset
3 // StockCharts
5
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
4 //
21
5135ff3343ae Rename project to StockCharts
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 18
diff changeset
5 // Created by Dennis Concepción Martín on 30/4/21.
5
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
6 //
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
7
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
8 import SwiftUI
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
9
18
136de51a74f2 Change struct to public
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 14
diff changeset
10 public struct LinePath: Shape {
5
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
11 var data: [Double]
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
12 var (width, height): (CGFloat, CGFloat)
8
959175ee5ebd Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 5
diff changeset
13 @Binding var pathPoints: [CGPoint]
5
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
14
18
136de51a74f2 Change struct to public
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 14
diff changeset
15 public func path(in rect: CGRect) -> Path {
5
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
16 var path = Path()
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
17
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
18 let normalizedData = normalize(data)
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
19 let widthBetweenDataPoints = Double(width) / Double(normalizedData.count - 1) // Remove first point
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
20 let initialPoint = normalizedData[0] * Double(height)
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
21 var x: Double = 0
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
22
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
23 path.move(to: CGPoint(x: x, y: initialPoint))
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
24 for y in normalizedData {
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
25 if normalizedData.firstIndex(of: y) != 0 { // Skip first point
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
26 x += widthBetweenDataPoints
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
27 let y = y * Double(height)
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
28 path.addLine(to: CGPoint(x: x, y: y))
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
29 }
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
30
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
31 // Append current point to an array. Later will be used for Drag Gesture
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
32 pathPoints.append(path.currentPoint!)
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
33 }
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
34
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
35 return path
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
36 }
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
37
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
38 /*
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
39 Get data -> normalize it -> 0 <= output <= 1
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
40 */
18
136de51a74f2 Change struct to public
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 14
diff changeset
41 public func normalize(_ data: [Double]) -> [Double] {
5
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
42 var normalData = [Double]()
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
43 let min = data.min()!
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
44 let max = data.max()!
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
45
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
46 for value in data {
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
47 let normal = (value - min) / (max - min)
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
48 normalData.append(normal)
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
49 }
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
50
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
51 return normalData
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
52 }
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
53 }
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
54