| 152 | } |
| 153 | |
| 154 | func (c *LineChart) Draw(data *DataTable) (out string) { |
| 155 | var scaleY, scaleX float64 |
| 156 | |
| 157 | c.data = data |
| 158 | |
| 159 | if c.Flags&DRAW_INDEPENDENT != 0 && len(data.columns) > 3 { |
| 160 | fmt.Println("Error: Can't use DRAW_INDEPENDENT for more then 2 graphs") |
| 161 | return "" |
| 162 | } |
| 163 | |
| 164 | charts := len(data.columns) - 1 |
| 165 | |
| 166 | prevPoint := [2]int{-1, -1} |
| 167 | |
| 168 | maxX, minX, maxY, minY := getBoundaryValues(data, -1) |
| 169 | |
| 170 | c.paddingX = int(math.Max(float64(len(ff(minY))), float64(len(ff(maxY))))) + 1 |
| 171 | |
| 172 | c.chartHeight = c.Height - c.paddingY |
| 173 | |
| 174 | if c.Flags&DRAW_INDEPENDENT != 0 { |
| 175 | c.chartWidth = c.Width - 2*c.paddingX |
| 176 | } else { |
| 177 | c.chartWidth = c.Width - c.paddingX - 1 |
| 178 | } |
| 179 | |
| 180 | scaleX = float64(c.chartWidth) / (maxX - minX) |
| 181 | |
| 182 | if c.Flags&DRAW_RELATIVE != 0 || minY < 0 { |
| 183 | scaleY = float64(c.chartHeight) / (maxY - minY) |
| 184 | } else { |
| 185 | scaleY = float64(c.chartHeight) / maxY |
| 186 | } |
| 187 | |
| 188 | for i := 1; i < charts+1; i++ { |
| 189 | if c.Flags&DRAW_INDEPENDENT != 0 { |
| 190 | maxX, minX, maxY, minY = getBoundaryValues(data, i) |
| 191 | |
| 192 | scaleX = float64(c.chartWidth-1) / (maxX - minX) |
| 193 | scaleY = float64(c.chartHeight) / maxY |
| 194 | |
| 195 | if c.Flags&DRAW_RELATIVE != 0 || minY < 0 { |
| 196 | scaleY = float64(c.chartHeight) / (maxY - minY) |
| 197 | } |
| 198 | } |
| 199 | |
| 200 | symbol := Color("•", i) |
| 201 | |
| 202 | c_data := getChartData(data, i) |
| 203 | |
| 204 | for _, point := range c_data { |
| 205 | x := int((point[0]-minX)*scaleX) + c.paddingX |
| 206 | y := int((point[1])*scaleY) + c.paddingY |
| 207 | |
| 208 | if c.Flags&DRAW_RELATIVE != 0 || minY < 0 { |
| 209 | y = int((point[1]-minY)*scaleY) + c.paddingY |
| 210 | } |
| 211 | |