Skip to content
Merged
27 changes: 23 additions & 4 deletions Sources/SwiftPlot/GraphLayout.swift
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public struct GraphLayout {
/// The amount of (horizontal) space to reserve for markers on the Y-axis.
var yMarkerMaxWidth: Float = 40

struct Results {
struct Results : CoordinateResolver {
/// The size these results have been calculated for; the entire size of the plot.
let totalSize: Size

Expand Down Expand Up @@ -51,6 +51,25 @@ public struct GraphLayout {

var legendLabels: [(String, LegendIcon)] = []
var legendRect: Rect?

func resolve(_ coordinate: Coordinate) -> Point {
let x = coordinate.point.x
let y = coordinate.point.y
switch(coordinate.coordinateSpace) {
case .figurePoints:
return Point(x, y)
case .axesPoints:
return Point(x, y) + plotBorderRect.origin
case .figureFraction:
let maxX = plotBorderRect.origin.x + plotBorderRect.size.width
let maxY = plotBorderRect.origin.y + plotBorderRect.size.height
return Point(x * maxX, y * maxY)
case .axesFraction:
let maxX = plotBorderRect.size.width
let maxY = plotBorderRect.size.height
return Point(x * maxX, y * maxY) + plotBorderRect.origin
}
}
}

// Layout.
Expand Down Expand Up @@ -206,7 +225,7 @@ public struct GraphLayout {
drawTitle(results: results, renderer: renderer)
drawLabels(results: results, renderer: renderer)
drawLegend(results.legendLabels, results: results, renderer: renderer)
drawAnnotations(renderer: renderer)
drawAnnotations(resolver: results, renderer: renderer)
}

private func drawTitle(results: Results, renderer: Renderer) {
Expand Down Expand Up @@ -379,9 +398,9 @@ public struct GraphLayout {
}
}

func drawAnnotations(renderer: Renderer) {
func drawAnnotations(resolver: CoordinateResolver, renderer: Renderer) {
for var annotation in annotations{
annotation.draw(renderer: renderer)
annotation.draw(resolver: resolver, renderer: renderer)
}
}
}
Expand Down
29 changes: 22 additions & 7 deletions Sources/SwiftPlot/PlotStyleHelpers.swift
Original file line number Diff line number Diff line change
Expand Up @@ -43,15 +43,30 @@ public struct PlotLegend {
public init() {}
}

public struct Coordinate {
public enum CoordinateSpace {
case figurePoints
case figureFraction
case axesPoints
case axesFraction
}
public var coordinateSpace: CoordinateSpace = .figurePoints
public var point: Point = Point(0.0, 0.0)
}

public protocol CoordinateResolver {
func resolve(_ coordinate: Coordinate) -> Point
}

public protocol Annotation {
mutating func draw(renderer: Renderer)
mutating func draw(resolver: CoordinateResolver, renderer: Renderer)
}

struct Box: Annotation {
public var color = Color.black
public var location = Point(0.0, 0.0)
public var size = Size(width: 0.0, height: 0.0)
public func draw(renderer: Renderer) {
public func draw(resolver: CoordinateResolver, renderer: Renderer) {
renderer.drawSolidRect(Rect(origin: location, size: size),
fillColor: color,
hatchPattern: .none)
Expand All @@ -70,14 +85,14 @@ struct Text : Annotation {
public var location = Point(0.0, 0.0)
public var boundingBox: Box?
public var borderWidth: Float = 5
public mutating func draw(renderer: Renderer) {
public mutating func draw(resolver: CoordinateResolver, renderer: Renderer) {
if boundingBox != nil {
var bboxSize = renderer.getTextLayoutSize(text: text, textSize: size)
bboxSize.width += 2 * borderWidth
bboxSize.height += 2 * borderWidth
boundingBox?.location = Point(location.x - borderWidth, location.y - borderWidth)
boundingBox?.size = bboxSize
boundingBox?.draw(renderer: renderer)
boundingBox?.draw(resolver: resolver, renderer: renderer)
}
renderer.drawText(text: text,
location: location,
Expand Down Expand Up @@ -107,7 +122,7 @@ struct Arrow : Annotation {
public var isFilled: Bool = false
public var startAnnotation: Annotation?
public var endAnnotation: Annotation?
public mutating func draw(renderer: Renderer) {
public mutating func draw(resolver: CoordinateResolver, renderer: Renderer) {
// Draws arrow body.
renderer.drawPlotLines(points: [start, end],
strokeWidth: strokeWidth,
Expand All @@ -134,8 +149,8 @@ struct Arrow : Annotation {
}

//Draws start and end annotations if specified.
startAnnotation?.draw(renderer: renderer)
endAnnotation?.draw(renderer: renderer)
startAnnotation?.draw(resolver: resolver, renderer: renderer)
endAnnotation?.draw(resolver: resolver, renderer: renderer)

}
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) {
Expand Down