@@ -165,34 +165,69 @@ struct Arrow : Annotation {
165
165
public var headLength : Float = 10
166
166
public var headAngle : Float = 20
167
167
public var isDashed : Bool = false
168
- public var isFilled : Bool = false
168
+ public var isDoubleHeaded : Bool = false
169
+ public enum HeadStyle {
170
+ case skeletal
171
+ case filled
172
+ case wedge
173
+ case dart
174
+ }
175
+ public var headStyle = HeadStyle . skeletal
169
176
public var startAnnotation : Annotation ?
170
177
public var endAnnotation : Annotation ?
171
178
public var overrideAnchor : Bool = false
172
- public mutating func draw( resolver: CoordinateResolver , renderer: Renderer ) {
173
- // Draws arrow body.
174
- renderer. drawPlotLines ( points: [ start, end] ,
175
- strokeWidth: strokeWidth,
176
- strokeColor: color,
177
- isDashed: isDashed)
178
-
179
+ public func drawBody( renderer: Renderer ) {
180
+ switch headStyle {
181
+ case . wedge:
182
+ var p1 = start + Point( 0.0 , - strokeWidth/ 2 )
183
+ var p2 = start + Point( 0.0 , strokeWidth/ 2 )
184
+ let wedgeRotateAngle = - atan2( end. x - start. x, end. y - start. y)
185
+ p1 = rotatePoint ( point: p1, center: start, angleRadians: wedgeRotateAngle + 0.5 * Float. pi)
186
+ p2 = rotatePoint ( point: p2, center: start, angleRadians: wedgeRotateAngle + 0.5 * Float. pi)
187
+ renderer. drawSolidPolygon ( points: [ p1, p2, end] ,
188
+ fillColor: color)
189
+ default :
190
+ renderer. drawPlotLines ( points: [ start, end] ,
191
+ strokeWidth: strokeWidth,
192
+ strokeColor: color,
193
+ isDashed: isDashed)
194
+ }
195
+ }
196
+ public func drawHead( renderer: Renderer , a: Point , b: Point ) {
179
197
// Calculates arrow head points.
180
- var p1 = end + Point( cos ( headAngle) * headLength, sin ( headAngle) * headLength)
181
- var p2 = end + Point( cos ( headAngle) * headLength, - sin( headAngle) * headLength)
182
- let rotateAngle = - atan2( start . x - end . x, start . y - end . y)
183
- p1 = rotatePoint ( point: p1, center: end , angleRadians: rotateAngle + 0.5 * Float. pi)
184
- p2 = rotatePoint ( point: p2, center: end , angleRadians: rotateAngle + 0.5 * Float. pi)
198
+ var p1 = b + Point( cos ( headAngle) * headLength, sin ( headAngle) * headLength)
199
+ var p2 = b + Point( cos ( headAngle) * headLength, - sin( headAngle) * headLength)
200
+ let rotateAngle = - atan2( a . x - b . x, a . y - b . y)
201
+ p1 = rotatePoint ( point: p1, center: b , angleRadians: rotateAngle + 0.5 * Float. pi)
202
+ p2 = rotatePoint ( point: p2, center: b , angleRadians: rotateAngle + 0.5 * Float. pi)
185
203
186
204
// Draws arrow head points.
187
- if isFilled {
188
- renderer. drawSolidPolygon ( points: [ p1, end, p2] ,
189
- fillColor: color)
205
+ switch headStyle {
206
+ case . skeletal:
207
+ renderer. drawPlotLines ( points: [ p1, b, p2] ,
208
+ strokeWidth: strokeWidth,
209
+ strokeColor: color,
210
+ isDashed: isDashed)
211
+ case . filled:
212
+ renderer. drawSolidPolygon ( points: [ p1, b, p2] ,
213
+ fillColor: color)
214
+ case . dart:
215
+ var p3 = end + Point( - headLength/ 2 , 0.0 )
216
+ p3 = rotatePoint ( point: p3, center: b, angleRadians: rotateAngle + 0.5 * Float. pi)
217
+ renderer. drawSolidPolygon ( points: [ p1, p3, p2, b] ,
218
+ fillColor: color)
219
+ default :
220
+ break
190
221
}
191
- else {
192
- renderer. drawPlotLines ( points: [ p1, end, p2] ,
193
- strokeWidth: strokeWidth,
194
- strokeColor: color,
195
- isDashed: false )
222
+ }
223
+ public mutating func draw( resolver: CoordinateResolver , renderer: Renderer ) {
224
+ // Draws arrow body.
225
+ drawBody ( renderer: renderer)
226
+
227
+ // Draws arrow head(s).
228
+ drawHead ( renderer: renderer, a: start, b: end)
229
+ if isDoubleHeaded {
230
+ drawHead ( renderer: renderer, a: end, b: start)
196
231
}
197
232
198
233
//Draws start and end annotations if specified.
@@ -223,15 +258,16 @@ struct Arrow : Annotation {
223
258
endAnnotation? . draw ( resolver: resolver, renderer: renderer)
224
259
}
225
260
}
226
- public init ( color: Color = . black, start: Point = Point ( 0.0 , 0.0 ) , end: Point = Point ( 0.0 , 0.0 ) , strokeWidth: Float = 5 , headLength: Float = 10 , headAngle: Float = 20 , isDashed: Bool = false , isFilled : Bool = false , startAnnotation: Annotation ? = nil , endAnnotation: Annotation ? = nil , overrideAnchor: Bool = false ) {
261
+ public init ( color: Color = . black, start: Point = Point ( 0.0 , 0.0 ) , end: Point = Point ( 0.0 , 0.0 ) , strokeWidth: Float = 5 , headLength: Float = 10 , headAngle: Float = 20 , isDashed: Bool = false , isDoubleHeaded : Bool = false , headStyle : HeadStyle = . skeletal , startAnnotation: Annotation ? = nil , endAnnotation: Annotation ? = nil , overrideAnchor: Bool = false ) {
227
262
self . color = color
228
263
self . start = start
229
264
self . end = end
230
265
self . strokeWidth = strokeWidth
231
266
self . headLength = headLength
232
267
self . headAngle = headAngle * Float. pi / 180
233
268
self . isDashed = isDashed
234
- self . isFilled = isFilled
269
+ self . isDoubleHeaded = isDoubleHeaded
270
+ self . headStyle = headStyle
235
271
self . startAnnotation = startAnnotation
236
272
self . endAnnotation = endAnnotation
237
273
self . overrideAnchor = overrideAnchor
0 commit comments