Plot draws the Line, implementing the plot.Plotter interface.
(plt *plot.Plot)
| 98 | |
| 99 | // Plot draws the Line, implementing the plot.Plotter interface. |
| 100 | func (pts *Line) Plot(plt *plot.Plot) { |
| 101 | pc := plt.Paint |
| 102 | |
| 103 | ps := plot.PlotXYs(plt, pts.XYs) |
| 104 | np := len(ps) |
| 105 | pts.PXYs = ps |
| 106 | |
| 107 | if pts.Fill != nil { |
| 108 | pc.FillStyle.Color = pts.Fill |
| 109 | minY := plt.PY(plt.Y.Min) |
| 110 | prev := math32.Vec2(ps[0].X, minY) |
| 111 | pc.MoveTo(prev.X, prev.Y) |
| 112 | for i := range ps { |
| 113 | pt := ps[i] |
| 114 | switch pts.StepStyle { |
| 115 | case NoStep: |
| 116 | if pt.X < prev.X { |
| 117 | pc.LineTo(prev.X, minY) |
| 118 | pc.ClosePath() |
| 119 | pc.MoveTo(pt.X, minY) |
| 120 | } |
| 121 | pc.LineTo(pt.X, pt.Y) |
| 122 | case PreStep: |
| 123 | if i == 0 { |
| 124 | continue |
| 125 | } |
| 126 | if pt.X < prev.X { |
| 127 | pc.LineTo(prev.X, minY) |
| 128 | pc.ClosePath() |
| 129 | pc.MoveTo(pt.X, minY) |
| 130 | } else { |
| 131 | pc.LineTo(prev.X, pt.Y) |
| 132 | } |
| 133 | pc.LineTo(pt.X, pt.Y) |
| 134 | case MidStep: |
| 135 | if pt.X < prev.X { |
| 136 | pc.LineTo(prev.X, minY) |
| 137 | pc.ClosePath() |
| 138 | pc.MoveTo(pt.X, minY) |
| 139 | } else { |
| 140 | pc.LineTo(0.5*(prev.X+pt.X), prev.Y) |
| 141 | pc.LineTo(0.5*(prev.X+pt.X), pt.Y) |
| 142 | } |
| 143 | pc.LineTo(pt.X, pt.Y) |
| 144 | case PostStep: |
| 145 | if pt.X < prev.X { |
| 146 | pc.LineTo(prev.X, minY) |
| 147 | pc.ClosePath() |
| 148 | pc.MoveTo(pt.X, minY) |
| 149 | } else { |
| 150 | pc.LineTo(pt.X, prev.Y) |
| 151 | } |
| 152 | pc.LineTo(pt.X, pt.Y) |
| 153 | } |
| 154 | prev = pt |
| 155 | } |
| 156 | pc.LineTo(prev.X, minY) |
| 157 | pc.ClosePath() |