Mercurial > public > stock-charts
annotate Sources/StockCharts/LineChart/Helpers/LinePath.swift @ 108:f53d8b9ca92b
Custom style implemented
author | Dennis Concepción Martín <dennisconcepcionmartin@gmail.com> |
---|---|
date | Sun, 04 Jul 2021 16:40:24 +0100 |
parents | 468e6857c4ce |
children |
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 { |
24
127af64e264e
Change var to public var
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
21
diff
changeset
|
11 public var data: [Double] |
127af64e264e
Change var to public var
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
21
diff
changeset
|
12 public var (width, height): (CGFloat, CGFloat) |
127af64e264e
Change var to public var
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
21
diff
changeset
|
13 |
8
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
14 @Binding var pathPoints: [CGPoint] |
5
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
15 |
18
136de51a74f2
Change struct to public
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
14
diff
changeset
|
16 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
|
17 var path = Path() |
70
c19e9c03e09d
Fixing Modifying state during view update
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
69
diff
changeset
|
18 var pathPoints = [CGPoint]() |
5
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
19 |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
20 let normalizedData = normalize(data) |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
21 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
|
22 let initialPoint = normalizedData[0] * Double(height) |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
23 var x: Double = 0 |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
24 |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
25 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
|
26 for y in normalizedData { |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
27 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
|
28 x += widthBetweenDataPoints |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
29 let y = y * Double(height) |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
30 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
|
31 } |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
32 |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
33 // Append current point to an array. Later will be used for Drag Gesture |
95
468e6857c4ce
Unwrap optional path.current
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
75
diff
changeset
|
34 pathPoints.append(path.currentPoint ?? CGPoint(x: 0, y: 0)) |
73
cc59a30661f7
Fixing: Modifying state during view update
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
72
diff
changeset
|
35 } |
cc59a30661f7
Fixing: Modifying state during view update
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
72
diff
changeset
|
36 |
75
b0eddc386535
Modifying state during view update fixed
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
74
diff
changeset
|
37 DispatchQueue.main.async { |
b0eddc386535
Modifying state during view update fixed
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
74
diff
changeset
|
38 self.pathPoints = pathPoints |
b0eddc386535
Modifying state during view update fixed
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
74
diff
changeset
|
39 } |
5
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 return path |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
42 } |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
43 |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
44 /* |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
45 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
|
46 */ |
18
136de51a74f2
Change struct to public
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
14
diff
changeset
|
47 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
|
48 var normalData = [Double]() |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
49 let min = data.min()! |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
50 let max = data.max()! |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
51 |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
52 for value in data { |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
53 let normal = (value - min) / (max - min) |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
54 normalData.append(normal) |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
55 } |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
56 |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
57 return normalData |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
58 } |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
59 } |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
60 |