public WeatherAverage(int month, double temperatureMin, double temperatureMax, int precipitation, Weather.eWindSpeed windspeedMin, Weather.eWindSpeed windspeedMax, Country country, Town town, Airport airport) { this.Month = month; this.Airport = airport; this.Country = country; this.Town = town; this.TemperatureMin = temperatureMin; this.TemperatureMax = temperatureMax; this.WindSpeedMax = windspeedMax; this.WindSpeedMin = windspeedMin; this.Precipitation = precipitation; }
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { Weather.eWindSpeed windspeed = (Weather.eWindSpeed)value; double v = (double)windspeed; if (AppSettings.GetInstance().getLanguage().Unit == Language.UnitSystem.Imperial) { v = MathHelpers.KMToMiles(v); } return(string.Format("{0:0} {1}", v, new StringToLanguageConverter().Convert("km/t"))); }
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { Weather weather = (Weather)value; int currentHour; if (GameObject.GetInstance().DayRoundEnabled) { currentHour = 12; } else { currentHour = GameObject.GetInstance().GameTime.Hour; } Weather.eWindSpeed windspeed = weather.Temperatures[currentHour].WindSpeed; Weather.WindDirection direction = weather.Temperatures[currentHour].Direction; return(string.Format("{0} {1}", new EnumLanguageConverter().Convert(direction), new WindSpeedToUnitConverter().Convert(windspeed))); }
//creates the weather from an average private static Weather CreateDayWeather(DateTime date, Weather previousWeather, WeatherAverage average) { Weather.WindDirection[] windDirectionValues = (Weather.WindDirection[])Enum.GetValues(typeof(Weather.WindDirection)); Weather.eWindSpeed[] windSpeedValues = (Weather.eWindSpeed[])Enum.GetValues(typeof(Weather.eWindSpeed)); Weather.CloudCover[] coverValues = (Weather.CloudCover[])Enum.GetValues(typeof(Weather.CloudCover)); Weather.WindDirection windDirection = windDirectionValues[rnd.Next(windDirectionValues.Length)]; Weather.CloudCover cover; Weather.Precipitation precip = Weather.Precipitation.None; Weather.eWindSpeed windSpeed; double temperature, temperatureLow, temperatureHigh, temperatureSunrise, temperatureSunset, temperatureDayend; int windIndexMin = windSpeedValues.ToList().IndexOf(average.WindSpeedMin); int windIndexMax = windSpeedValues.ToList().IndexOf(average.WindSpeedMax); if (previousWeather == null) { windSpeed = windSpeedValues[rnd.Next(windIndexMin, windIndexMax)]; temperatureLow = MathHelpers.GetRandomDoubleNumber(average.TemperatureMin - 5, average.TemperatureMin + 5); temperatureHigh = MathHelpers.GetRandomDoubleNumber(Math.Max(average.TemperatureMax - 5, temperatureLow + 1), average.TemperatureMax + 5); } else { double previousTemperature = (previousWeather.TemperatureHigh + previousWeather.TemperatureLow) / 2; int windIndex = windSpeedValues.ToList().IndexOf(previousWeather.WindSpeed); windSpeed = windSpeedValues[rnd.Next(Math.Max(windIndexMin, windIndex - 2), Math.Min(windIndex + 2, windIndexMax))]; double minTemp = Math.Max(average.TemperatureMin, previousTemperature - 5); temperatureLow = MathHelpers.GetRandomDoubleNumber(minTemp - 5, minTemp + 5); double maxTemp = Math.Min(average.TemperatureMax, previousTemperature + 5); temperatureHigh = MathHelpers.GetRandomDoubleNumber(Math.Max(maxTemp - 5, temperatureLow), maxTemp + 5);//rnd.NextDouble() * ((maxTemp + 5) - Math.Max(maxTemp - 5, temperatureLow + 2)) + Math.Max(maxTemp - 5, temperatureLow + 2); } double tempDiff = temperatureHigh - temperatureLow; temperatureSunrise = temperatureLow + MathHelpers.GetRandomDoubleNumber(-2, Math.Min(tempDiff, 2)); temperatureSunset = temperatureHigh - MathHelpers.GetRandomDoubleNumber(-2, Math.Min(tempDiff, 2)); temperatureDayend = temperatureLow + rnd.Next(-2, 2); temperature = (temperatureLow + temperatureHigh) / 2; Boolean isOvercast = rnd.Next(100) < average.Precipitation; if (isOvercast) { cover = Weather.CloudCover.Overcast; precip = GetPrecipitation(temperature); } else { Weather.CloudCover[] notOvercastCovers = new Weather.CloudCover[] { Weather.CloudCover.Clear, Weather.CloudCover.Mostly_Cloudy, Weather.CloudCover.Partly_Cloudy }; cover = notOvercastCovers[rnd.Next(notOvercastCovers.Length)]; } HourlyWeather[] hourlyTemperature = new HourlyWeather[24]; if (previousWeather == null) hourlyTemperature[0] = new HourlyWeather(temperatureLow, cover, cover == Weather.CloudCover.Overcast ? GetPrecipitation(temperatureLow) : Weather.Precipitation.None, windSpeed, windDirection); else hourlyTemperature[0] = previousWeather.Temperatures[previousWeather.Temperatures.Length - 1]; double morningSteps = (temperatureSunrise - hourlyTemperature[0].Temperature) / (Weather.Sunrise - 1); for (int i = 1; i <= Weather.Sunrise; i++) { double temp = hourlyTemperature[i - 1].Temperature + morningSteps; Weather.CloudCover hourlyCover = rnd.Next(3) == 0 ? coverValues[rnd.Next(coverValues.Length)] : cover; int windspeedIndex = windSpeedValues.ToList().IndexOf(windSpeed); Weather.eWindSpeed[] hourlyWindspeedValues = new Weather.eWindSpeed[] { windSpeed, windSpeed, windSpeed, hourlyTemperature[i - 1].WindSpeed, windspeedIndex > 0 ? (Weather.eWindSpeed)windspeedIndex - 1 : (Weather.eWindSpeed)windspeedIndex + 1, windspeedIndex < windSpeedValues.Length - 1 ? (Weather.eWindSpeed)windspeedIndex + 1 : (Weather.eWindSpeed)windspeedIndex - 1 }; Weather.eWindSpeed hourlyWindspeed = hourlyWindspeedValues[rnd.Next(hourlyWindspeedValues.Length)]; hourlyTemperature[i] = new HourlyWeather(temp, hourlyCover, hourlyCover == Weather.CloudCover.Overcast ? GetPrecipitation(temp) : Weather.Precipitation.None, hourlyWindspeed, windDirection); } double daySteps = (temperatureSunset - temperatureSunrise) / (Weather.Sunset - Weather.Sunrise - 1); for (int i = Weather.Sunrise + 1; i < Weather.Sunset; i++) { Weather.CloudCover hourlyCover = rnd.Next(3) == 0 ? coverValues[rnd.Next(coverValues.Length)] : cover; double temp = hourlyTemperature[i - 1].Temperature + daySteps; if (hourlyCover != hourlyTemperature[i - 1].Cover && hourlyCover == Weather.CloudCover.Overcast) temp -= MathHelpers.GetRandomDoubleNumber(1, 4); if (hourlyCover != hourlyTemperature[i - 1].Cover && hourlyTemperature[i - 1].Cover == Weather.CloudCover.Overcast) temp += MathHelpers.GetRandomDoubleNumber(1, 4); int windspeedIndex = windSpeedValues.ToList().IndexOf(windSpeed); Weather.eWindSpeed[] hourlyWindspeedValues = new Weather.eWindSpeed[] { windSpeed, windSpeed, windSpeed, hourlyTemperature[i - 1].WindSpeed, windspeedIndex > 0 ? (Weather.eWindSpeed)windspeedIndex - 1 : (Weather.eWindSpeed)windspeedIndex + 1, windspeedIndex < windSpeedValues.Length - 1 ? (Weather.eWindSpeed)windspeedIndex + 1 : (Weather.eWindSpeed)windspeedIndex - 1 }; Weather.eWindSpeed hourlyWindspeed = hourlyWindspeedValues[rnd.Next(hourlyWindspeedValues.Length)]; hourlyTemperature[i] = new HourlyWeather(temp, hourlyCover, hourlyCover == Weather.CloudCover.Overcast ? GetPrecipitation(temp) : Weather.Precipitation.None, hourlyWindspeed, windDirection); } double eveningSteps = (temperatureDayend - temperatureSunset) / (hourlyTemperature.Length - Weather.Sunset); for (int i = Weather.Sunset; i < hourlyTemperature.Length; i++) { double temp = hourlyTemperature[i - 1].Temperature + eveningSteps; Weather.CloudCover hourlyCover = rnd.Next(3) == 0 ? coverValues[rnd.Next(coverValues.Length)] : cover; int windspeedIndex = windSpeedValues.ToList().IndexOf(windSpeed); Weather.eWindSpeed[] hourlyWindspeedValues = new Weather.eWindSpeed[] { windSpeed, windSpeed, windSpeed, hourlyTemperature[i - 1].WindSpeed, windspeedIndex > 0 ? (Weather.eWindSpeed)windspeedIndex - 1 : (Weather.eWindSpeed)windspeedIndex + 1, windspeedIndex < windSpeedValues.Length - 1 ? (Weather.eWindSpeed)windspeedIndex + 1 : (Weather.eWindSpeed)windspeedIndex - 1 }; Weather.eWindSpeed hourlyWindspeed = hourlyWindspeedValues[rnd.Next(hourlyWindspeedValues.Length)]; hourlyTemperature[i] = new HourlyWeather(temp, hourlyCover, hourlyCover == Weather.CloudCover.Overcast ? GetPrecipitation(temp) : Weather.Precipitation.None, hourlyWindspeed, windDirection); } temperatureLow = hourlyTemperature.Min(t => t.Temperature); temperatureHigh = hourlyTemperature.Max(t => t.Temperature); cover = (from c in hourlyTemperature group c by c.Cover into g select new { Cover = g.Key, Qty = g.Count() }).OrderByDescending(g => g.Qty).First().Cover; precip = (from c in hourlyTemperature group c by c.Precip into g select new { Precip = g.Key, Qty = g.Count() }).OrderByDescending(g => g.Qty).First().Precip; Weather weather = new Weather(date, windSpeed, windDirection, cover, precip, hourlyTemperature, temperatureLow, temperatureHigh); return weather; }
//creates a new weather object for a specific date based on the weather for another day private static Weather CreateDayWeather(Airport airport, DateTime date, Weather previousWeather) { WeatherAverage average = WeatherAverages.GetWeatherAverage(date.Month, airport); if (average != null) return CreateDayWeather(date, previousWeather, average); Weather.Precipitation[] precipitationValues = (Weather.Precipitation[])Enum.GetValues(typeof(Weather.Precipitation)); Weather.CloudCover[] coverValues = (Weather.CloudCover[])Enum.GetValues(typeof(Weather.CloudCover)); Weather.WindDirection[] windDirectionValues = (Weather.WindDirection[])Enum.GetValues(typeof(Weather.WindDirection)); Weather.eWindSpeed[] windSpeedValues = (Weather.eWindSpeed[])Enum.GetValues(typeof(Weather.eWindSpeed)); Weather.WindDirection windDirection; Weather.eWindSpeed windSpeed; double temperature, temperatureLow, temperatureHigh, temperatureSunrise, temperatureSunset, temperatureDayend; windDirection = windDirectionValues[rnd.Next(windDirectionValues.Length)]; if (previousWeather == null) { windSpeed = windSpeedValues[rnd.Next(windSpeedValues.Length)]; double maxTemp = 40; double minTemp = -20; temperature = MathHelpers.GetRandomDoubleNumber(minTemp, maxTemp); } else { int windIndex = windSpeedValues.ToList().IndexOf(previousWeather.WindSpeed); windSpeed = windSpeedValues[rnd.Next(Math.Max(0, windIndex - 2), Math.Min(windIndex + 2, windSpeedValues.Length))]; double previousTemperature = (previousWeather.TemperatureHigh + previousWeather.TemperatureLow) / 2; double maxTemp = Math.Min(40, previousTemperature + 5); double minTemp = Math.Max(-20, previousTemperature - 5); temperature = MathHelpers.GetRandomDoubleNumber(minTemp, maxTemp); } temperatureLow = temperature - rnd.Next(1, 10); temperatureHigh = temperature + rnd.Next(1, 10); double tempDiff = temperatureHigh - temperatureLow; temperatureSunrise = temperatureLow + MathHelpers.GetRandomDoubleNumber(-2, Math.Min(tempDiff, 2)); temperatureSunset = temperatureHigh - MathHelpers.GetRandomDoubleNumber(-2, Math.Min(tempDiff, 2)); temperatureDayend = temperatureLow + rnd.Next(-2, 2); Weather.CloudCover cover = coverValues[rnd.Next(coverValues.Length)]; Weather.Precipitation precip = Weather.Precipitation.None; if (cover == Weather.CloudCover.Overcast) precip = precipitationValues[rnd.Next(precipitationValues.Length)]; HourlyWeather[] hourlyTemperature = new HourlyWeather[24]; if (previousWeather == null) hourlyTemperature[0] = new HourlyWeather(temperatureLow, cover, cover == Weather.CloudCover.Overcast ? GetPrecipitation(temperatureLow) : Weather.Precipitation.None, windSpeed, windDirection); else hourlyTemperature[0] = previousWeather.Temperatures[previousWeather.Temperatures.Length - 1]; double morningSteps = (temperatureSunrise - hourlyTemperature[0].Temperature) / (Weather.Sunrise - 1); for (int i = 1; i <= Weather.Sunrise; i++) { double temp = hourlyTemperature[i - 1].Temperature + morningSteps; Weather.CloudCover hourlyCover = rnd.Next(3) == 0 ? coverValues[rnd.Next(coverValues.Length)] : cover; int windspeedIndex = windSpeedValues.ToList().IndexOf(windSpeed); Weather.eWindSpeed[] hourlyWindspeedValues = new Weather.eWindSpeed[] { windSpeed, windSpeed, windSpeed, hourlyTemperature[i - 1].WindSpeed, windspeedIndex > 0 ? (Weather.eWindSpeed)windspeedIndex - 1 : (Weather.eWindSpeed)windspeedIndex + 1, windspeedIndex < windSpeedValues.Length - 1 ? (Weather.eWindSpeed)windspeedIndex + 1 : (Weather.eWindSpeed)windspeedIndex - 1 }; Weather.eWindSpeed hourlyWindspeed = hourlyWindspeedValues[rnd.Next(hourlyWindspeedValues.Length)]; hourlyTemperature[i] = new HourlyWeather(temp, hourlyCover, hourlyCover == Weather.CloudCover.Overcast ? GetPrecipitation(temp) : Weather.Precipitation.None, hourlyWindspeed, windDirection); } double daySteps = (temperatureSunset - temperatureSunrise) / (Weather.Sunset - Weather.Sunrise - 1); for (int i = Weather.Sunrise + 1; i < Weather.Sunset; i++) { Weather.CloudCover hourlyCover = rnd.Next(3) == 0 ? coverValues[rnd.Next(coverValues.Length)] : cover; double temp = hourlyTemperature[i - 1].Temperature + daySteps; if (hourlyCover != hourlyTemperature[i - 1].Cover && hourlyCover == Weather.CloudCover.Overcast) temp -= MathHelpers.GetRandomDoubleNumber(1, 4); if (hourlyCover != hourlyTemperature[i - 1].Cover && hourlyTemperature[i - 1].Cover == Weather.CloudCover.Overcast) temp += MathHelpers.GetRandomDoubleNumber(1, 4); int windspeedIndex = windSpeedValues.ToList().IndexOf(windSpeed); Weather.eWindSpeed[] hourlyWindspeedValues = new Weather.eWindSpeed[] { windSpeed, windSpeed, windSpeed, hourlyTemperature[i - 1].WindSpeed, windspeedIndex > 0 ? (Weather.eWindSpeed)windspeedIndex - 1 : (Weather.eWindSpeed)windspeedIndex + 1, windspeedIndex < windSpeedValues.Length - 1 ? (Weather.eWindSpeed)windspeedIndex + 1 : (Weather.eWindSpeed)windspeedIndex - 1 }; Weather.eWindSpeed hourlyWindspeed = hourlyWindspeedValues[rnd.Next(hourlyWindspeedValues.Length)]; hourlyTemperature[i] = new HourlyWeather(temp, hourlyCover, hourlyCover == Weather.CloudCover.Overcast ? GetPrecipitation(temp) : Weather.Precipitation.None, hourlyWindspeed, windDirection); } double eveningSteps = (temperatureDayend - temperatureSunset) / (hourlyTemperature.Length - Weather.Sunset); for (int i = Weather.Sunset; i < hourlyTemperature.Length; i++) { double temp = hourlyTemperature[i - 1].Temperature + eveningSteps; Weather.CloudCover hourlyCover = rnd.Next(3) == 0 ? coverValues[rnd.Next(coverValues.Length)] : cover; int windspeedIndex = windSpeedValues.ToList().IndexOf(windSpeed); Weather.eWindSpeed[] hourlyWindspeedValues = new Weather.eWindSpeed[] { windSpeed, windSpeed, windSpeed, hourlyTemperature[i - 1].WindSpeed, windspeedIndex > 0 ? (Weather.eWindSpeed)windspeedIndex - 1 : (Weather.eWindSpeed)windspeedIndex + 1, windspeedIndex < windSpeedValues.Length - 1 ? (Weather.eWindSpeed)windspeedIndex + 1 : (Weather.eWindSpeed)windspeedIndex - 1 }; Weather.eWindSpeed hourlyWindspeed = hourlyWindspeedValues[rnd.Next(hourlyWindspeedValues.Length)]; hourlyTemperature[i] = new HourlyWeather(temp, hourlyCover, hourlyCover == Weather.CloudCover.Overcast ? GetPrecipitation(temp) : Weather.Precipitation.None, hourlyWindspeed, windDirection); } temperatureLow = hourlyTemperature.Min(t => t.Temperature); temperatureHigh = hourlyTemperature.Max(t => t.Temperature); cover = (from c in hourlyTemperature group c by c.Cover into g select new { Cover = g.Key, Qty = g.Count() }).OrderByDescending(g => g.Qty).First().Cover; precip = (from c in hourlyTemperature group c by c.Precip into g select new { Precip = g.Key, Qty = g.Count() }).OrderByDescending(g => g.Qty).First().Precip; Weather weather = new Weather(date, windSpeed, windDirection, cover, precip, hourlyTemperature, temperatureLow, temperatureHigh); return weather; }
public WeatherAverage(int month, double temperatureMin, double temperatureMax, int precipitation, Weather.eWindSpeed windspeedMin, Weather.eWindSpeed windspeedMax, Airport airport) : this(month, temperatureMin, temperatureMax, precipitation, windspeedMin, windspeedMax, airport.Profile.Town.Country, airport.Profile.Town, airport) { }
public WeatherAverage(int month, double temperatureMin, double temperatureMax, int precipitation, Weather.eWindSpeed windspeedMin, Weather.eWindSpeed windspeedMax, Country country) : this(month, temperatureMin, temperatureMax, precipitation, windspeedMin, windspeedMax, country, null, null) { }
public WeatherAverage(int month, double temperatureMin, double temperatureMax, int precipitation, Weather.eWindSpeed windspeedMin, Weather.eWindSpeed windspeedMax, Town town) : this(month, temperatureMin, temperatureMax, precipitation, windspeedMin, windspeedMax, town.Country, town, null) { }
//creates the weather from an average private static Weather CreateDayWeather(DateTime date, Weather previousWeather, WeatherAverage average) { Weather.WindDirection[] windDirectionValues = (Weather.WindDirection[])Enum.GetValues(typeof(Weather.WindDirection)); Weather.eWindSpeed[] windSpeedValues = (Weather.eWindSpeed[])Enum.GetValues(typeof(Weather.eWindSpeed)); Weather.CloudCover[] coverValues = (Weather.CloudCover[])Enum.GetValues(typeof(Weather.CloudCover)); Weather.WindDirection windDirection = windDirectionValues[rnd.Next(windDirectionValues.Length)]; Weather.CloudCover cover; Weather.Precipitation precip = Weather.Precipitation.None; Weather.eWindSpeed windSpeed; double temperature, temperatureLow, temperatureHigh, temperatureSunrise, temperatureSunset, temperatureDayend; int windIndexMin = windSpeedValues.ToList().IndexOf(average.WindSpeedMin); int windIndexMax = windSpeedValues.ToList().IndexOf(average.WindSpeedMax); if (previousWeather == null) { windSpeed = windSpeedValues[rnd.Next(windIndexMin, windIndexMax)]; temperatureLow = MathHelpers.GetRandomDoubleNumber(average.TemperatureMin - 5, average.TemperatureMin + 5); temperatureHigh = MathHelpers.GetRandomDoubleNumber(Math.Max(average.TemperatureMax - 5, temperatureLow + 1), average.TemperatureMax + 5); } else { double previousTemperature = (previousWeather.TemperatureHigh + previousWeather.TemperatureLow) / 2; int windIndex = windSpeedValues.ToList().IndexOf(previousWeather.WindSpeed); windSpeed = windSpeedValues[rnd.Next(Math.Max(windIndexMin, windIndex - 2), Math.Min(windIndex + 2, windIndexMax))]; double minTemp = Math.Max(average.TemperatureMin, previousTemperature - 5); temperatureLow = MathHelpers.GetRandomDoubleNumber(minTemp - 5, minTemp + 5); double maxTemp = Math.Min(average.TemperatureMax, previousTemperature + 5); temperatureHigh = MathHelpers.GetRandomDoubleNumber(Math.Max(maxTemp - 5, temperatureLow), maxTemp + 5);//rnd.NextDouble() * ((maxTemp + 5) - Math.Max(maxTemp - 5, temperatureLow + 2)) + Math.Max(maxTemp - 5, temperatureLow + 2); } double tempDiff = temperatureHigh - temperatureLow; temperatureSunrise = temperatureLow + MathHelpers.GetRandomDoubleNumber(-2, Math.Min(tempDiff, 2)); temperatureSunset = temperatureHigh - MathHelpers.GetRandomDoubleNumber(-2, Math.Min(tempDiff, 2)); temperatureDayend = temperatureLow + rnd.Next(-2, 2); temperature = (temperatureLow + temperatureHigh) / 2; Boolean isOvercast = rnd.Next(100) < average.Precipitation; if (isOvercast) { cover = Weather.CloudCover.Overcast; precip = GetPrecipitation(temperature); } else { Weather.CloudCover[] notOvercastCovers = new Weather.CloudCover[] { Weather.CloudCover.Clear, Weather.CloudCover.Mostly_Cloudy, Weather.CloudCover.Partly_Cloudy }; cover = notOvercastCovers[rnd.Next(notOvercastCovers.Length)]; } HourlyWeather[] hourlyTemperature = new HourlyWeather[24]; if (previousWeather == null) { hourlyTemperature[0] = new HourlyWeather(temperatureLow, cover, cover == Weather.CloudCover.Overcast ? GetPrecipitation(temperatureLow) : Weather.Precipitation.None, windSpeed, windDirection); } else { hourlyTemperature[0] = previousWeather.Temperatures[previousWeather.Temperatures.Length - 1]; } double morningSteps = (temperatureSunrise - hourlyTemperature[0].Temperature) / (Weather.Sunrise - 1); for (int i = 1; i <= Weather.Sunrise; i++) { double temp = hourlyTemperature[i - 1].Temperature + morningSteps; Weather.CloudCover hourlyCover = rnd.Next(3) == 0 ? coverValues[rnd.Next(coverValues.Length)] : cover; int windspeedIndex = windSpeedValues.ToList().IndexOf(windSpeed); Weather.eWindSpeed[] hourlyWindspeedValues = new Weather.eWindSpeed[] { windSpeed, windSpeed, windSpeed, hourlyTemperature[i - 1].WindSpeed, windspeedIndex > 0 ? (Weather.eWindSpeed)windspeedIndex - 1 : (Weather.eWindSpeed)windspeedIndex + 1, windspeedIndex < windSpeedValues.Length - 1 ? (Weather.eWindSpeed)windspeedIndex + 1 : (Weather.eWindSpeed)windspeedIndex - 1 }; Weather.eWindSpeed hourlyWindspeed = hourlyWindspeedValues[rnd.Next(hourlyWindspeedValues.Length)]; hourlyTemperature[i] = new HourlyWeather(temp, hourlyCover, hourlyCover == Weather.CloudCover.Overcast ? GetPrecipitation(temp) : Weather.Precipitation.None, hourlyWindspeed, windDirection); } double daySteps = (temperatureSunset - temperatureSunrise) / (Weather.Sunset - Weather.Sunrise - 1); for (int i = Weather.Sunrise + 1; i < Weather.Sunset; i++) { Weather.CloudCover hourlyCover = rnd.Next(3) == 0 ? coverValues[rnd.Next(coverValues.Length)] : cover; double temp = hourlyTemperature[i - 1].Temperature + daySteps; if (hourlyCover != hourlyTemperature[i - 1].Cover && hourlyCover == Weather.CloudCover.Overcast) { temp -= MathHelpers.GetRandomDoubleNumber(1, 4); } if (hourlyCover != hourlyTemperature[i - 1].Cover && hourlyTemperature[i - 1].Cover == Weather.CloudCover.Overcast) { temp += MathHelpers.GetRandomDoubleNumber(1, 4); } int windspeedIndex = windSpeedValues.ToList().IndexOf(windSpeed); Weather.eWindSpeed[] hourlyWindspeedValues = new Weather.eWindSpeed[] { windSpeed, windSpeed, windSpeed, hourlyTemperature[i - 1].WindSpeed, windspeedIndex > 0 ? (Weather.eWindSpeed)windspeedIndex - 1 : (Weather.eWindSpeed)windspeedIndex + 1, windspeedIndex < windSpeedValues.Length - 1 ? (Weather.eWindSpeed)windspeedIndex + 1 : (Weather.eWindSpeed)windspeedIndex - 1 }; Weather.eWindSpeed hourlyWindspeed = hourlyWindspeedValues[rnd.Next(hourlyWindspeedValues.Length)]; hourlyTemperature[i] = new HourlyWeather(temp, hourlyCover, hourlyCover == Weather.CloudCover.Overcast ? GetPrecipitation(temp) : Weather.Precipitation.None, hourlyWindspeed, windDirection); } double eveningSteps = (temperatureDayend - temperatureSunset) / (hourlyTemperature.Length - Weather.Sunset); for (int i = Weather.Sunset; i < hourlyTemperature.Length; i++) { double temp = hourlyTemperature[i - 1].Temperature + eveningSteps; Weather.CloudCover hourlyCover = rnd.Next(3) == 0 ? coverValues[rnd.Next(coverValues.Length)] : cover; int windspeedIndex = windSpeedValues.ToList().IndexOf(windSpeed); Weather.eWindSpeed[] hourlyWindspeedValues = new Weather.eWindSpeed[] { windSpeed, windSpeed, windSpeed, hourlyTemperature[i - 1].WindSpeed, windspeedIndex > 0 ? (Weather.eWindSpeed)windspeedIndex - 1 : (Weather.eWindSpeed)windspeedIndex + 1, windspeedIndex < windSpeedValues.Length - 1 ? (Weather.eWindSpeed)windspeedIndex + 1 : (Weather.eWindSpeed)windspeedIndex - 1 }; Weather.eWindSpeed hourlyWindspeed = hourlyWindspeedValues[rnd.Next(hourlyWindspeedValues.Length)]; hourlyTemperature[i] = new HourlyWeather(temp, hourlyCover, hourlyCover == Weather.CloudCover.Overcast ? GetPrecipitation(temp) : Weather.Precipitation.None, hourlyWindspeed, windDirection); } temperatureLow = hourlyTemperature.Min(t => t.Temperature); temperatureHigh = hourlyTemperature.Max(t => t.Temperature); cover = (from c in hourlyTemperature group c by c.Cover into g select new { Cover = g.Key, Qty = g.Count() }).OrderByDescending(g => g.Qty).First().Cover; precip = (from c in hourlyTemperature group c by c.Precip into g select new { Precip = g.Key, Qty = g.Count() }).OrderByDescending(g => g.Qty).First().Precip; Weather weather = new Weather(date, windSpeed, windDirection, cover, precip, hourlyTemperature, temperatureLow, temperatureHigh); return(weather); }
//creates a new weather object for a specific date based on the weather for another day private static Weather CreateDayWeather(Airport airport, DateTime date, Weather previousWeather) { WeatherAverage average = WeatherAverages.GetWeatherAverage(date.Month, airport); if (average != null) { return(CreateDayWeather(date, previousWeather, average)); } Weather.Precipitation[] precipitationValues = (Weather.Precipitation[])Enum.GetValues(typeof(Weather.Precipitation)); Weather.CloudCover[] coverValues = (Weather.CloudCover[])Enum.GetValues(typeof(Weather.CloudCover)); Weather.WindDirection[] windDirectionValues = (Weather.WindDirection[])Enum.GetValues(typeof(Weather.WindDirection)); Weather.eWindSpeed[] windSpeedValues = (Weather.eWindSpeed[])Enum.GetValues(typeof(Weather.eWindSpeed)); Weather.WindDirection windDirection; Weather.eWindSpeed windSpeed; double temperature, temperatureLow, temperatureHigh, temperatureSunrise, temperatureSunset, temperatureDayend; windDirection = windDirectionValues[rnd.Next(windDirectionValues.Length)]; if (previousWeather == null) { windSpeed = windSpeedValues[rnd.Next(windSpeedValues.Length)]; double maxTemp = 40; double minTemp = -20; temperature = MathHelpers.GetRandomDoubleNumber(minTemp, maxTemp); } else { int windIndex = windSpeedValues.ToList().IndexOf(previousWeather.WindSpeed); windSpeed = windSpeedValues[rnd.Next(Math.Max(0, windIndex - 2), Math.Min(windIndex + 2, windSpeedValues.Length))]; double previousTemperature = (previousWeather.TemperatureHigh + previousWeather.TemperatureLow) / 2; double maxTemp = Math.Min(40, previousTemperature + 5); double minTemp = Math.Max(-20, previousTemperature - 5); temperature = MathHelpers.GetRandomDoubleNumber(minTemp, maxTemp); } temperatureLow = temperature - rnd.Next(1, 10); temperatureHigh = temperature + rnd.Next(1, 10); double tempDiff = temperatureHigh - temperatureLow; temperatureSunrise = temperatureLow + MathHelpers.GetRandomDoubleNumber(-2, Math.Min(tempDiff, 2)); temperatureSunset = temperatureHigh - MathHelpers.GetRandomDoubleNumber(-2, Math.Min(tempDiff, 2)); temperatureDayend = temperatureLow + rnd.Next(-2, 2); Weather.CloudCover cover = coverValues[rnd.Next(coverValues.Length)]; Weather.Precipitation precip = Weather.Precipitation.None; if (cover == Weather.CloudCover.Overcast) { precip = precipitationValues[rnd.Next(precipitationValues.Length)]; } HourlyWeather[] hourlyTemperature = new HourlyWeather[24]; if (previousWeather == null) { hourlyTemperature[0] = new HourlyWeather(temperatureLow, cover, cover == Weather.CloudCover.Overcast ? GetPrecipitation(temperatureLow) : Weather.Precipitation.None, windSpeed, windDirection); } else { hourlyTemperature[0] = previousWeather.Temperatures[previousWeather.Temperatures.Length - 1]; } double morningSteps = (temperatureSunrise - hourlyTemperature[0].Temperature) / (Weather.Sunrise - 1); for (int i = 1; i <= Weather.Sunrise; i++) { double temp = hourlyTemperature[i - 1].Temperature + morningSteps; Weather.CloudCover hourlyCover = rnd.Next(3) == 0 ? coverValues[rnd.Next(coverValues.Length)] : cover; int windspeedIndex = windSpeedValues.ToList().IndexOf(windSpeed); Weather.eWindSpeed[] hourlyWindspeedValues = new Weather.eWindSpeed[] { windSpeed, windSpeed, windSpeed, hourlyTemperature[i - 1].WindSpeed, windspeedIndex > 0 ? (Weather.eWindSpeed)windspeedIndex - 1 : (Weather.eWindSpeed)windspeedIndex + 1, windspeedIndex < windSpeedValues.Length - 1 ? (Weather.eWindSpeed)windspeedIndex + 1 : (Weather.eWindSpeed)windspeedIndex - 1 }; Weather.eWindSpeed hourlyWindspeed = hourlyWindspeedValues[rnd.Next(hourlyWindspeedValues.Length)]; hourlyTemperature[i] = new HourlyWeather(temp, hourlyCover, hourlyCover == Weather.CloudCover.Overcast ? GetPrecipitation(temp) : Weather.Precipitation.None, hourlyWindspeed, windDirection); } double daySteps = (temperatureSunset - temperatureSunrise) / (Weather.Sunset - Weather.Sunrise - 1); for (int i = Weather.Sunrise + 1; i < Weather.Sunset; i++) { Weather.CloudCover hourlyCover = rnd.Next(3) == 0 ? coverValues[rnd.Next(coverValues.Length)] : cover; double temp = hourlyTemperature[i - 1].Temperature + daySteps; if (hourlyCover != hourlyTemperature[i - 1].Cover && hourlyCover == Weather.CloudCover.Overcast) { temp -= MathHelpers.GetRandomDoubleNumber(1, 4); } if (hourlyCover != hourlyTemperature[i - 1].Cover && hourlyTemperature[i - 1].Cover == Weather.CloudCover.Overcast) { temp += MathHelpers.GetRandomDoubleNumber(1, 4); } int windspeedIndex = windSpeedValues.ToList().IndexOf(windSpeed); Weather.eWindSpeed[] hourlyWindspeedValues = new Weather.eWindSpeed[] { windSpeed, windSpeed, windSpeed, hourlyTemperature[i - 1].WindSpeed, windspeedIndex > 0 ? (Weather.eWindSpeed)windspeedIndex - 1 : (Weather.eWindSpeed)windspeedIndex + 1, windspeedIndex < windSpeedValues.Length - 1 ? (Weather.eWindSpeed)windspeedIndex + 1 : (Weather.eWindSpeed)windspeedIndex - 1 }; Weather.eWindSpeed hourlyWindspeed = hourlyWindspeedValues[rnd.Next(hourlyWindspeedValues.Length)]; hourlyTemperature[i] = new HourlyWeather(temp, hourlyCover, hourlyCover == Weather.CloudCover.Overcast ? GetPrecipitation(temp) : Weather.Precipitation.None, hourlyWindspeed, windDirection); } double eveningSteps = (temperatureDayend - temperatureSunset) / (hourlyTemperature.Length - Weather.Sunset); for (int i = Weather.Sunset; i < hourlyTemperature.Length; i++) { double temp = hourlyTemperature[i - 1].Temperature + eveningSteps; Weather.CloudCover hourlyCover = rnd.Next(3) == 0 ? coverValues[rnd.Next(coverValues.Length)] : cover; int windspeedIndex = windSpeedValues.ToList().IndexOf(windSpeed); Weather.eWindSpeed[] hourlyWindspeedValues = new Weather.eWindSpeed[] { windSpeed, windSpeed, windSpeed, hourlyTemperature[i - 1].WindSpeed, windspeedIndex > 0 ? (Weather.eWindSpeed)windspeedIndex - 1 : (Weather.eWindSpeed)windspeedIndex + 1, windspeedIndex < windSpeedValues.Length - 1 ? (Weather.eWindSpeed)windspeedIndex + 1 : (Weather.eWindSpeed)windspeedIndex - 1 }; Weather.eWindSpeed hourlyWindspeed = hourlyWindspeedValues[rnd.Next(hourlyWindspeedValues.Length)]; hourlyTemperature[i] = new HourlyWeather(temp, hourlyCover, hourlyCover == Weather.CloudCover.Overcast ? GetPrecipitation(temp) : Weather.Precipitation.None, hourlyWindspeed, windDirection); } temperatureLow = hourlyTemperature.Min(t => t.Temperature); temperatureHigh = hourlyTemperature.Max(t => t.Temperature); cover = (from c in hourlyTemperature group c by c.Cover into g select new { Cover = g.Key, Qty = g.Count() }).OrderByDescending(g => g.Qty).First().Cover; precip = (from c in hourlyTemperature group c by c.Precip into g select new { Precip = g.Key, Qty = g.Count() }).OrderByDescending(g => g.Qty).First().Precip; Weather weather = new Weather(date, windSpeed, windDirection, cover, precip, hourlyTemperature, temperatureLow, temperatureHigh); return(weather); }
public HourlyWeather(double temperature, Weather.CloudCover cover, Weather.Precipitation precip, Weather.eWindSpeed windspeed, Weather.WindDirection direction) { this.Temperature = temperature; this.Precip = precip; this.Cover = cover; this.WindSpeed = windspeed; this.Direction = direction; }
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { Weather.eWindSpeed windspeed = (Weather.eWindSpeed)value; return(string.Format("{0:0} {1}", new NumberToUnitConverter().Convert((int)windspeed), new StringToLanguageConverter().Convert("km/t"))); }