Mercurial > public > stock-charts
annotate Sources/InteractiveCharts/LineChart/Helpers/LinePath.swift @ 14:edf2bfcd8d97
Reorganise structure
author | Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com> |
---|---|
date | Wed, 28 Apr 2021 19:01:40 +0200 |
parents | InteractiveCharts/LineChart/Helpers/LinePath.swift@959175ee5ebd |
children | 136de51a74f2 |
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 |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
3 // InteractiveCharts |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
4 // |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
5 // Created by Dennis Concepción Martín on 26/4/21. |
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 |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
10 struct LinePath: Shape { |
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 |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
15 func path(in rect: CGRect) -> Path { |
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 */ |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
41 func normalize(_ data: [Double]) -> [Double] { |
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 |