From 28e19dd91c70fcdcdc4c522a16ccd73632c04b46 Mon Sep 17 00:00:00 2001 From: Flare Microsystems Date: Sat, 9 Mar 2024 23:35:03 -0800 Subject: [PATCH] Completed graphing --- MockForecastProvider.jar | Bin 4167 -> 4787 bytes .../displays/HourlyForecastDisplay.java | 247 ++++++++++++++---- vf1000.properties | 2 +- 3 files changed, 191 insertions(+), 58 deletions(-) diff --git a/MockForecastProvider.jar b/MockForecastProvider.jar index 08e10bea9e23e700a98489dca12930b3e21b9883..ebbf2aee0ee1cd3d9cf9b6bed887003edb4136a2 100644 GIT binary patch delta 3709 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 aI;|>^5gme^j)R7jfRte7QaeHSTlhc0^S}}S delta 3064 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 G0002DUc~VL diff --git a/src/com/flaremicro/visualforecast/displays/HourlyForecastDisplay.java b/src/com/flaremicro/visualforecast/displays/HourlyForecastDisplay.java index 7940630..af723fc 100644 --- a/src/com/flaremicro/visualforecast/displays/HourlyForecastDisplay.java +++ b/src/com/flaremicro/visualforecast/displays/HourlyForecastDisplay.java @@ -9,6 +9,7 @@ import java.awt.Font; import java.awt.FontMetrics; import java.awt.GradientPaint; import java.awt.Graphics2D; +import java.awt.Polygon; import java.awt.Rectangle; import java.awt.Transparency; import java.awt.image.BufferedImage; @@ -39,7 +40,11 @@ public class HourlyForecastDisplay implements Display { private int ticksBeforeChange = 200; private int animationTicks = -1; - + + private byte[] dewval = null; + private byte[] tempval = null; + private float[] percipval = null; + DateFormat simpleDateFormat = new SimpleDateFormat("ha"); public HourlyForecastDisplay() { @@ -52,6 +57,26 @@ public class HourlyForecastDisplay implements Display { } + public void setGraphValues(TownForecast town) { + if (town != null) + { + HourlyForecast[] forecast = town.getHourlyForecast(); + if (forecast != null && forecast.length > 0) + { + int size = Math.min(12, forecast.length); + dewval = new byte[size]; + tempval = new byte[size]; + percipval = new float[size]; + for (int i = 0; i < size; i++) + { + dewval[i] = forecast[i].dewPoint; + tempval[i] = forecast[i].temp; + percipval[i] = forecast[i].percip; + } + } + } + } + @Override public void initDisplay(RenderPanel renderer, ForecastProvider forecastProvider, long ticks, int iconTicks) { this.details = forecastProvider != null ? forecastProvider.getForecast() : null; @@ -63,6 +88,7 @@ public class HourlyForecastDisplay implements Display { townIndex = 0; currentTown = details.getTownForecast()[townIndex]; renderer.setCurrentTown(currentTown.getTownName()); + setGraphValues(currentTown); } redrawRegionlost(renderer); } @@ -110,27 +136,32 @@ public class HourlyForecastDisplay implements Display { @Override public void drawBoundLimitedDisplay(RenderPanel renderer, Graphics2D g2d, Rectangle bounds, long ticks, int iconTicks) { HourlyForecast[] forecast = currentTown.getHourlyForecast(); - if(forecast == null) + if (forecast == null) return; g2d.setColor(RenderConstants.BG_BLUE); //g2d.fillRect(RenderConstants.SIDE_OFFSET, RenderConstants.TOPBAR_HEIGHT + 20, RenderConstants.W - RenderConstants.SIDE_OFFSET * 2, RenderConstants.MAINBAR_HEIGHT - 40); DrawingUtil.drawGradientRect(g2d, RenderConstants.SIDE_OFFSET, RenderConstants.TOPBAR_HEIGHT + 20, RenderConstants.W - RenderConstants.SIDE_OFFSET * 2, RenderConstants.MAINBAR_HEIGHT - 40, 15, BG_BLUE.darker(), BG_BLUE.brighter()); - + int min = minTemp(forecast); int max = maxTemp(forecast); - - float range = Math.abs(min)+Math.abs(max); - - + + int range = max-min; + + if (range == 0) + { + min -= 1; + max += 1; + range = 2; + } g2d.setPaint(new GradientPaint(0, RenderConstants.TOPBAR_HEIGHT + 40, RenderConstants.BG_ORANGE, 0, RenderConstants.MAINBAR_HEIGHT, RenderConstants.BG_PURPLE)); g2d.fillRect(RenderConstants.SIDE_OFFSET + 40, RenderConstants.TOPBAR_HEIGHT + 40, RenderConstants.W - RenderConstants.SIDE_OFFSET * 2 - 60, RenderConstants.MAINBAR_HEIGHT - 124); g2d.setColor(Color.BLACK); g2d.drawRect(RenderConstants.SIDE_OFFSET, RenderConstants.TOPBAR_HEIGHT + 20, RenderConstants.W - RenderConstants.SIDE_OFFSET * 2, RenderConstants.MAINBAR_HEIGHT - 40); - + /*float lineHeight = (RenderConstants.MAINBAR_HEIGHT - 104) / 9F; for(int i = 0; i < 10; i++) { @@ -138,67 +169,103 @@ public class HourlyForecastDisplay implements Display { }*/ g2d.setFont(smallFont.deriveFont(20F)); FontMetrics fm = g2d.getFontMetrics(); - + DrawingUtil.drawOutlinedString(g2d, 100, RenderConstants.TOPBAR_HEIGHT + 35, "Temperature\u00B0c", Color.RED, Color.BLACK, 2); DrawingUtil.drawOutlinedString(g2d, 260, RenderConstants.TOPBAR_HEIGHT + 35, "Dew point\u00B0c", Color.WHITE, Color.BLACK, 2); DrawingUtil.drawOutlinedString(g2d, 410, RenderConstants.TOPBAR_HEIGHT + 35, "Precipitation%", Color.CYAN, Color.BLACK, 2); - String minText = min + "\u00B0"; String maxText = max + "\u00B0"; - DrawingUtil.drawOutlinedString(g2d, RenderConstants.SIDE_OFFSET+40-fm.stringWidth(maxText), RenderConstants.TOPBAR_HEIGHT + 53, maxText, Color.YELLOW, Color.BLACK, 2); - DrawingUtil.drawOutlinedString(g2d, RenderConstants.SIDE_OFFSET+40-fm.stringWidth(minText), RenderConstants.TOPBAR_HEIGHT + MAINBAR_HEIGHT - 92, minText, Color.YELLOW, Color.BLACK, 2); + DrawingUtil.drawOutlinedString(g2d, RenderConstants.SIDE_OFFSET + 40 - fm.stringWidth(maxText), RenderConstants.TOPBAR_HEIGHT + 53, maxText, Color.YELLOW, Color.BLACK, 2); + DrawingUtil.drawOutlinedString(g2d, RenderConstants.SIDE_OFFSET + 40 - fm.stringWidth(minText), RenderConstants.TOPBAR_HEIGHT + MAINBAR_HEIGHT - 92, minText, Color.YELLOW, Color.BLACK, 2); + + + g2d.setColor(RenderConstants.BG_ORANGE.darker()); + g2d.drawLine(RenderConstants.SIDE_OFFSET + 40, (RenderConstants.TOPBAR_HEIGHT + 50), (RenderConstants.W - RenderConstants.SIDE_OFFSET - 20), (RenderConstants.TOPBAR_HEIGHT + 50)); + + g2d.setColor(RenderConstants.BG_PURPLE.brighter()); + g2d.drawLine(RenderConstants.SIDE_OFFSET + 40, RenderConstants.TOPBAR_HEIGHT + 50 + RenderConstants.MAINBAR_HEIGHT - 144, (RenderConstants.W - RenderConstants.SIDE_OFFSET - 20), RenderConstants.TOPBAR_HEIGHT + 50 + RenderConstants.MAINBAR_HEIGHT - 144); + + //BlackLines + + if(max > 0 && min < 0) + { + int nextTemp = (RenderConstants.TOPBAR_HEIGHT + RenderConstants.MAINBAR_HEIGHT - 94) + (int) (((min) / (float)range) * (RenderConstants.MAINBAR_HEIGHT - 144)); + g2d.setColor(Color.LIGHT_GRAY); + g2d.drawLine(RenderConstants.SIDE_OFFSET + 40, nextTemp, RenderConstants.W - RenderConstants.SIDE_OFFSET - 20, nextTemp); + DrawingUtil.drawOutlinedString(g2d, RenderConstants.SIDE_OFFSET + 40 - fm.stringWidth("0\u00B0"), nextTemp+4, "0\u00B0", Color.YELLOW, Color.BLACK, 2); + } int slotWidth = (RenderConstants.W - RenderConstants.SIDE_OFFSET * 2 - 60) / 12; - int lastDewpoint = 0; - int lastTemperature = 0; - int lastPercip = 0; - - g2d.setColor(RenderConstants.BG_ORANGE.darker()); - g2d.drawLine(RenderConstants.SIDE_OFFSET+40, (RenderConstants.TOPBAR_HEIGHT + 50), (RenderConstants.W - RenderConstants.SIDE_OFFSET - 20), (RenderConstants.TOPBAR_HEIGHT + 50)); - - g2d.setColor(RenderConstants.BG_PURPLE.brighter()); - g2d.drawLine(RenderConstants.SIDE_OFFSET+40, RenderConstants.TOPBAR_HEIGHT + 50 + RenderConstants.MAINBAR_HEIGHT - 144, (RenderConstants.W - RenderConstants.SIDE_OFFSET - 20), RenderConstants.TOPBAR_HEIGHT + 50 + RenderConstants.MAINBAR_HEIGHT - 144); - - //BlackLines g2d.setClip(RenderConstants.SIDE_OFFSET + 40, RenderConstants.TOPBAR_HEIGHT + 40, RenderConstants.W - RenderConstants.SIDE_OFFSET * 2 - 60, RenderConstants.MAINBAR_HEIGHT - 124); - g2d.setStroke(new BasicStroke(2)); + + g2d.translate(RenderConstants.SIDE_OFFSET + 40, RenderConstants.TOPBAR_HEIGHT + RenderConstants.MAINBAR_HEIGHT - 94); + + g2d.translate(2, 2); g2d.setColor(Color.BLACK); - for(int i = 0; i < Math.min(12, forecast.length); i++) + this.graphTemp(g2d, this.dewval, min, slotWidth, range, RenderConstants.MAINBAR_HEIGHT - 144); + g2d.setColor(Color.WHITE); + g2d.translate(-2, -2); + this.graphTemp(g2d, this.dewval, min, slotWidth, range, RenderConstants.MAINBAR_HEIGHT - 144); + + g2d.translate(2, 2); + g2d.setColor(Color.BLACK); + this.graphPercent(g2d, this.percipval, slotWidth, 100F, RenderConstants.MAINBAR_HEIGHT - 144); + g2d.setColor(Color.CYAN); + g2d.translate(-2, -2); + this.graphPercent(g2d, this.percipval, slotWidth, 100F, RenderConstants.MAINBAR_HEIGHT - 144); + + g2d.translate(2, 2); + g2d.setColor(Color.BLACK); + this.graphTemp(g2d, this.tempval, min, slotWidth, range, RenderConstants.MAINBAR_HEIGHT - 144); + g2d.setColor(Color.RED); + g2d.translate(-2, -2); + this.graphTemp(g2d, this.tempval, min, slotWidth, range, RenderConstants.MAINBAR_HEIGHT - 144); + + g2d.translate(- RenderConstants.SIDE_OFFSET - 40, 94 - RenderConstants.TOPBAR_HEIGHT - RenderConstants.MAINBAR_HEIGHT); + + g2d.setClip(null); + + + /*g2d.setStroke(new BasicStroke(2)); + g2d.setColor(Color.BLACK); + + //This is so ugly + for (int i = 0; i < Math.min(12, forecast.length); i++) { - int nextDewpoint = (RenderConstants.TOPBAR_HEIGHT + 50) + (RenderConstants.MAINBAR_HEIGHT - 144) - (int)(((max-forecast[i].dewPoint)/range)*(RenderConstants.MAINBAR_HEIGHT - 144)); - int nextTemperature = (RenderConstants.TOPBAR_HEIGHT + 50) + (RenderConstants.MAINBAR_HEIGHT - 144) - (int)(((max-forecast[i].temp)/range)*(RenderConstants.MAINBAR_HEIGHT - 144)); - int nextPercip = (RenderConstants.TOPBAR_HEIGHT + 50) + (RenderConstants.MAINBAR_HEIGHT - 144) - (int) ((forecast[i].percip/100F)*(RenderConstants.MAINBAR_HEIGHT - 144)); - if(i == 0) + int nextDewpoint = (RenderConstants.TOPBAR_HEIGHT + 50) + (RenderConstants.MAINBAR_HEIGHT - 144) - (int) (((max - forecast[i].dewPoint) / range) * (RenderConstants.MAINBAR_HEIGHT - 144)); + int nextTemperature = (RenderConstants.TOPBAR_HEIGHT + 50) + (RenderConstants.MAINBAR_HEIGHT - 144) - (int) (((max - forecast[i].temp) / range) * (RenderConstants.MAINBAR_HEIGHT - 144)); + int nextPercip = (RenderConstants.TOPBAR_HEIGHT + 50) + (RenderConstants.MAINBAR_HEIGHT - 144) - (int) ((forecast[i].percip / 100F) * (RenderConstants.MAINBAR_HEIGHT - 144)); + if (i == 0) { lastDewpoint = nextDewpoint; lastTemperature = nextTemperature; lastPercip = nextPercip; } - g2d.drawLine(RenderConstants.SIDE_OFFSET+40+slotWidth/2+(slotWidth*(i-1))+1, lastDewpoint+2, RenderConstants.SIDE_OFFSET+40+slotWidth/2+(slotWidth*i)+2, nextDewpoint+2); - g2d.drawLine(RenderConstants.SIDE_OFFSET+40+slotWidth/2+(slotWidth*(i-1))+1, lastPercip+2, RenderConstants.SIDE_OFFSET+40+slotWidth/2+(slotWidth*i)+2, nextPercip+2); - g2d.drawLine(RenderConstants.SIDE_OFFSET+40+slotWidth/2+(slotWidth*(i-1))+1, lastTemperature+2, RenderConstants.SIDE_OFFSET+40+slotWidth/2+(slotWidth*i)+2, nextTemperature+2); - if(i == Math.min(12, forecast.length)-1) + g2d.drawLine(RenderConstants.SIDE_OFFSET + 40 + slotWidth / 2 + (slotWidth * (i - 1)) + 2, lastDewpoint + 2, RenderConstants.SIDE_OFFSET + 40 + slotWidth / 2 + (slotWidth * i) + 2, nextDewpoint + 2); + g2d.drawLine(RenderConstants.SIDE_OFFSET + 40 + slotWidth / 2 + (slotWidth * (i - 1)) + 2, lastPercip + 2, RenderConstants.SIDE_OFFSET + 40 + slotWidth / 2 + (slotWidth * i) + 2, nextPercip + 2); + g2d.drawLine(RenderConstants.SIDE_OFFSET + 40 + slotWidth / 2 + (slotWidth * (i - 1)) + 2, lastTemperature + 2, RenderConstants.SIDE_OFFSET + 40 + slotWidth / 2 + (slotWidth * i) + 2, nextTemperature + 2); + if (i == Math.min(12, forecast.length) - 1) { - g2d.drawLine(RenderConstants.SIDE_OFFSET+40+slotWidth/2+(slotWidth*(i)), nextDewpoint+2, RenderConstants.SIDE_OFFSET+40+slotWidth/2+(slotWidth*(i+2)), nextDewpoint+2); - g2d.drawLine(RenderConstants.SIDE_OFFSET+40+slotWidth/2+(slotWidth*(i)), nextPercip+2, RenderConstants.SIDE_OFFSET+40+slotWidth/2+(slotWidth*(i+2)), nextPercip+2); - g2d.drawLine(RenderConstants.SIDE_OFFSET+40+slotWidth/2+(slotWidth*(i)), nextTemperature+2, RenderConstants.SIDE_OFFSET+40+slotWidth/2+(slotWidth*(i+2)), nextTemperature+2); + g2d.drawLine(RenderConstants.SIDE_OFFSET + 40 + slotWidth / 2 + (slotWidth * (i)) + 2, nextDewpoint + 2, RenderConstants.SIDE_OFFSET + 40 + slotWidth / 2 + (slotWidth * (i + 2)) + 2, nextDewpoint + 2); + g2d.drawLine(RenderConstants.SIDE_OFFSET + 40 + slotWidth / 2 + (slotWidth * (i)) + 2, nextPercip + 2, RenderConstants.SIDE_OFFSET + 40 + slotWidth / 2 + (slotWidth * (i + 2)) + 2, nextPercip + 2); + g2d.drawLine(RenderConstants.SIDE_OFFSET + 40 + slotWidth / 2 + (slotWidth * (i)) + 2, nextTemperature + 2, RenderConstants.SIDE_OFFSET + 40 + slotWidth / 2 + (slotWidth * (i + 2)) + 2, nextTemperature + 2); } lastPercip = nextPercip; lastTemperature = nextTemperature; lastDewpoint = nextDewpoint; } g2d.setClip(null); - - for(int i = 0; i < Math.min(12, forecast.length); i++) + + for (int i = 0; i < Math.min(12, forecast.length); i++) { g2d.setClip(RenderConstants.SIDE_OFFSET + 40, RenderConstants.TOPBAR_HEIGHT + 40, RenderConstants.W - RenderConstants.SIDE_OFFSET * 2 - 60, RenderConstants.MAINBAR_HEIGHT - 124); - int nextDewpoint = (RenderConstants.TOPBAR_HEIGHT + 50) + (RenderConstants.MAINBAR_HEIGHT - 144) - (int)(((max-forecast[i].dewPoint)/range)*(RenderConstants.MAINBAR_HEIGHT - 144)); - int nextTemperature = (RenderConstants.TOPBAR_HEIGHT + 50) + (RenderConstants.MAINBAR_HEIGHT - 144) - (int)(((max-forecast[i].temp)/range)*(RenderConstants.MAINBAR_HEIGHT - 144)); - int nextPercip = (RenderConstants.TOPBAR_HEIGHT + 50) + (RenderConstants.MAINBAR_HEIGHT - 144) - (int) ((forecast[i].percip/100F)*(RenderConstants.MAINBAR_HEIGHT - 144)); - if(i == 0) + int nextDewpoint = (RenderConstants.TOPBAR_HEIGHT + 50) + (RenderConstants.MAINBAR_HEIGHT - 144) - (int) (((max - forecast[i].dewPoint) / range) * (RenderConstants.MAINBAR_HEIGHT - 144)); + int nextTemperature = (RenderConstants.TOPBAR_HEIGHT + 50) + (RenderConstants.MAINBAR_HEIGHT - 144) - (int) (((max - forecast[i].temp) / range) * (RenderConstants.MAINBAR_HEIGHT - 144)); + int nextPercip = (RenderConstants.TOPBAR_HEIGHT + 50) + (RenderConstants.MAINBAR_HEIGHT - 144) - (int) ((forecast[i].percip / 100F) * (RenderConstants.MAINBAR_HEIGHT - 144)); + if (i == 0) { lastDewpoint = nextDewpoint; lastTemperature = nextTemperature; @@ -206,38 +273,104 @@ public class HourlyForecastDisplay implements Display { } g2d.setStroke(new BasicStroke(2)); g2d.setColor(Color.WHITE); - g2d.drawLine(RenderConstants.SIDE_OFFSET+40+slotWidth/2+(slotWidth*(i-1)), lastDewpoint, RenderConstants.SIDE_OFFSET+40+slotWidth/2+(slotWidth*i), nextDewpoint); + g2d.drawLine(RenderConstants.SIDE_OFFSET + 40 + slotWidth / 2 + (slotWidth * (i - 1)), lastDewpoint, RenderConstants.SIDE_OFFSET + 40 + slotWidth / 2 + (slotWidth * i), nextDewpoint); g2d.setColor(Color.CYAN); - g2d.drawLine(RenderConstants.SIDE_OFFSET+40+slotWidth/2+(slotWidth*(i-1)), lastPercip, RenderConstants.SIDE_OFFSET+40+slotWidth/2+(slotWidth*i), nextPercip); + g2d.drawLine(RenderConstants.SIDE_OFFSET + 40 + slotWidth / 2 + (slotWidth * (i - 1)), lastPercip, RenderConstants.SIDE_OFFSET + 40 + slotWidth / 2 + (slotWidth * i), nextPercip); g2d.setColor(Color.RED); - g2d.drawLine(RenderConstants.SIDE_OFFSET+40+slotWidth/2+(slotWidth*(i-1)), lastTemperature, RenderConstants.SIDE_OFFSET+40+slotWidth/2+(slotWidth*i), nextTemperature); - if(i == Math.min(12, forecast.length)-1) + g2d.drawLine(RenderConstants.SIDE_OFFSET + 40 + slotWidth / 2 + (slotWidth * (i - 1)), lastTemperature, RenderConstants.SIDE_OFFSET + 40 + slotWidth / 2 + (slotWidth * i), nextTemperature); + if (i == Math.min(12, forecast.length) - 1) { g2d.setColor(Color.WHITE); - g2d.drawLine(RenderConstants.SIDE_OFFSET+40+slotWidth/2+(slotWidth*(i)), nextDewpoint, RenderConstants.SIDE_OFFSET+40+slotWidth/2+(slotWidth*(i+1)), nextDewpoint); + g2d.drawLine(RenderConstants.SIDE_OFFSET + 40 + slotWidth / 2 + (slotWidth * (i)), nextDewpoint, RenderConstants.SIDE_OFFSET + 40 + slotWidth / 2 + (slotWidth * (i + 1)), nextDewpoint); g2d.setColor(Color.CYAN); - g2d.drawLine(RenderConstants.SIDE_OFFSET+40+slotWidth/2+(slotWidth*(i)), nextPercip, RenderConstants.SIDE_OFFSET+40+slotWidth/2+(slotWidth*(i+1)), nextPercip); + g2d.drawLine(RenderConstants.SIDE_OFFSET + 40 + slotWidth / 2 + (slotWidth * (i)), nextPercip, RenderConstants.SIDE_OFFSET + 40 + slotWidth / 2 + (slotWidth * (i + 1)), nextPercip); g2d.setColor(Color.RED); - g2d.drawLine(RenderConstants.SIDE_OFFSET+40+slotWidth/2+(slotWidth*(i)), nextTemperature, RenderConstants.SIDE_OFFSET+40+slotWidth/2+(slotWidth*(i+1)), nextTemperature); + g2d.drawLine(RenderConstants.SIDE_OFFSET + 40 + slotWidth / 2 + (slotWidth * (i)), nextTemperature, RenderConstants.SIDE_OFFSET + 40 + slotWidth / 2 + (slotWidth * (i + 1)), nextTemperature); } - + g2d.setClip(null); lastPercip = nextPercip; lastTemperature = nextTemperature; lastDewpoint = nextDewpoint; - + String timeString = simpleDateFormat.format(forecast[i].hour); - if((i % 2) == 0) - DrawingUtil.drawOutlinedString(g2d, RenderConstants.SIDE_OFFSET+40+slotWidth/2+(slotWidth*i)-fm.stringWidth(timeString)/2, RenderConstants.TOPBAR_HEIGHT + MAINBAR_HEIGHT - 70, timeString, Color.YELLOW, Color.BLACK, 2); - else - DrawingUtil.drawOutlinedString(g2d, RenderConstants.SIDE_OFFSET+40+slotWidth/2+(slotWidth*i)-fm.stringWidth(timeString)/2, RenderConstants.TOPBAR_HEIGHT + MAINBAR_HEIGHT - 60, timeString, Color.YELLOW, Color.BLACK, 2); - - IconProvider.drawIcon(g2d, IconProvider.INDEXED_ICONS[forecast[i].iconId], RenderConstants.SIDE_OFFSET + 45 + i * slotWidth , RenderConstants.TOPBAR_HEIGHT + MAINBAR_HEIGHT - 55, slotWidth - 10, iconTicks); + if ((i % 2) == 0) + DrawingUtil.drawOutlinedString(g2d, RenderConstants.SIDE_OFFSET + 40 + slotWidth / 2 + (slotWidth * i) - fm.stringWidth(timeString) / 2, RenderConstants.TOPBAR_HEIGHT + MAINBAR_HEIGHT - 70, timeString, Color.YELLOW, Color.BLACK, 2); + else DrawingUtil.drawOutlinedString(g2d, RenderConstants.SIDE_OFFSET + 40 + slotWidth / 2 + (slotWidth * i) - fm.stringWidth(timeString) / 2, RenderConstants.TOPBAR_HEIGHT + MAINBAR_HEIGHT - 60, timeString, Color.YELLOW, Color.BLACK, 2); + + IconProvider.drawIcon(g2d, IconProvider.INDEXED_ICONS[forecast[i].iconId], RenderConstants.SIDE_OFFSET + 45 + i * slotWidth, RenderConstants.TOPBAR_HEIGHT + MAINBAR_HEIGHT - 55, slotWidth - 10, iconTicks); } + */ g2d.setStroke(new BasicStroke(2)); g2d.setColor(Color.BLACK); g2d.drawRect(RenderConstants.SIDE_OFFSET + 40, RenderConstants.TOPBAR_HEIGHT + 40, RenderConstants.W - RenderConstants.SIDE_OFFSET * 2 - 60, RenderConstants.MAINBAR_HEIGHT - 124); + + for (int i = 0; i < Math.min(12, forecast.length); i++) + { + String timeString = simpleDateFormat.format(forecast[i].hour); + if ((i % 2) == 0) + DrawingUtil.drawOutlinedString(g2d, RenderConstants.SIDE_OFFSET + 40 + slotWidth / 2 + (slotWidth * i) - fm.stringWidth(timeString) / 2, RenderConstants.TOPBAR_HEIGHT + MAINBAR_HEIGHT - 70, timeString, Color.YELLOW, Color.BLACK, 2); + else DrawingUtil.drawOutlinedString(g2d, RenderConstants.SIDE_OFFSET + 40 + slotWidth / 2 + (slotWidth * i) - fm.stringWidth(timeString) / 2, RenderConstants.TOPBAR_HEIGHT + MAINBAR_HEIGHT - 60, timeString, Color.YELLOW, Color.BLACK, 2); + IconProvider.drawIcon(g2d, IconProvider.INDEXED_ICONS[forecast[i].iconId], RenderConstants.SIDE_OFFSET + 45 + i * slotWidth, RenderConstants.TOPBAR_HEIGHT + MAINBAR_HEIGHT - 55, slotWidth - 10, iconTicks); + } + + } + + public void graphTemp(Graphics2D g2d, byte[] tempVal, int min, int slotWidth, float range, float multiplier) { + int lastTemp = ValueCheck.NO_DATA_INT; + for (int i = 0; i < tempVal.length; i++) + { + if (ValueCheck.valueNoData(tempVal[i])) + { + lastTemp = ValueCheck.NO_DATA_INT; + continue; + } + int nextTemp = -(int) (((tempVal[i]-min) / range) * multiplier); + if (i == 0) + { + lastTemp = nextTemp; + } + if (ValueCheck.valueNoData(lastTemp)) + { + lastTemp = nextTemp; + continue; + } + g2d.drawLine(slotWidth / 2 + (slotWidth * (i - 1)), lastTemp, slotWidth / 2 + (slotWidth * i), nextTemp); + if (i == Math.min(12, tempVal.length) - 1) + { + g2d.drawLine(slotWidth / 2 + (slotWidth * (i)), nextTemp, slotWidth / 2 + (slotWidth * (i + 1)), nextTemp); + } + lastTemp = nextTemp; + } + } + + public void graphPercent(Graphics2D g2d, float[] precVal, int slotWidth, float range, float multiplier) { + int lastTemp = ValueCheck.NO_DATA_INT; + for (int i = 0; i < tempval.length; i++) + { + if (ValueCheck.valueNoData(precVal[i])) + { + lastTemp = ValueCheck.NO_DATA_INT; + continue; + } + int nextTemp = -(int) (((precVal[i]) / range) * multiplier); + if (i == 0) + { + lastTemp = nextTemp; + } + if (ValueCheck.valueNoData(lastTemp)) + { + lastTemp = nextTemp; + continue; + } + g2d.drawLine(slotWidth / 2 + (slotWidth * (i - 1)), lastTemp, slotWidth / 2 + (slotWidth * i), nextTemp); + if (i == Math.min(12, precVal.length) - 1) + { + g2d.drawLine(slotWidth / 2 + (slotWidth * (i)), nextTemp, slotWidth / 2 + (slotWidth * (i + 1)), nextTemp); + } + lastTemp = nextTemp; + } } @Override diff --git a/vf1000.properties b/vf1000.properties index 0c82524..eb0a101 100644 --- a/vf1000.properties +++ b/vf1000.properties @@ -1,3 +1,3 @@ #VisualForecast 1000 Properties file. Functional provider must be set for successful boot! -#Fri Mar 08 21:30:25 PST 2024 +#Sat Mar 09 23:33:26 PST 2024 forecast-provider-jar=MockForecastProvider.jar