public ClimateGenerator(ClimateSettings _settings, int _seed) { biomesColors[BiomeType.WATER] = Color.blue; biomesColors[BiomeType.POLAR_ICE] = new Color(255, 255, 255) / 255; biomesColors[BiomeType.POLAR_DESERT] = new Color(192, 192, 192) / 255; biomesColors[BiomeType.SUBPOLAR_MOIST_TUNDRA] = new Color(96, 128, 128) / 255; biomesColors[BiomeType.SUBPOLAR_WET_TUNDRA] = new Color(64, 128, 128) / 255; biomesColors[BiomeType.SUBPOLAR_RAIN_TUNDRA] = new Color(32, 128, 192) / 255; biomesColors[BiomeType.SUBPOLAR_DRY_TUNDRA] = new Color(128, 128, 128) / 255; biomesColors[BiomeType.BOREAL_DESERT] = new Color(160, 160, 128) / 255; biomesColors[BiomeType.BOREAL_DRY_SCRUB] = new Color(128, 160, 128) / 255; biomesColors[BiomeType.BOREAL_MOIST_FOREST] = new Color(96, 160, 128) / 255; biomesColors[BiomeType.BOREAL_WET_FOREST] = new Color(64, 160, 144) / 255; biomesColors[BiomeType.BOREAL_RAIN_FOREST] = new Color(32, 160, 192) / 255; biomesColors[BiomeType.COOL_TEMPERATE_MOIST_FOREST] = new Color(96, 192, 128) / 255; biomesColors[BiomeType.COOL_TEMPERATE_WET_FOREST] = new Color(64, 192, 144) / 255; biomesColors[BiomeType.COOL_TEMPERATE_RAIN_FOREST] = new Color(32, 192, 192) / 255; biomesColors[BiomeType.COOL_TEMPERATE_STEPPES] = new Color(128, 192, 128) / 255; biomesColors[BiomeType.COOL_TEMPERATE_DESERT] = new Color(192, 192, 128) / 255; biomesColors[BiomeType.COOL_TEMPERATE_DESERT_SCRUB] = new Color(160, 192, 128) / 255; biomesColors[BiomeType.WARM_TEMPERATE_MOIST_FOREST] = new Color(96, 224, 128) / 255; biomesColors[BiomeType.WARM_TEMPERATE_WET_FOREST] = new Color(64, 224, 144) / 255; biomesColors[BiomeType.WARM_TEMPERATE_RAIN_FOREST] = new Color(32, 224, 192) / 255; biomesColors[BiomeType.WARM_TEMPERATE_THORN_SCRUB] = new Color(160, 224, 128) / 255; biomesColors[BiomeType.WARM_TEMPERATE_DRY_FOREST] = new Color(128, 224, 128) / 255; biomesColors[BiomeType.WARM_TEMPERATE_DESERT] = new Color(224, 224, 128) / 255; biomesColors[BiomeType.WARM_TEMPERATE_DESERT_SCRUB] = new Color(192, 224, 128) / 255; biomesColors[BiomeType.SUBTROPICAL_DESERT] = new Color(240, 240, 128) / 255; biomesColors[BiomeType.SUBTROPICAL_DESERT_SCRUB] = new Color(224, 240, 128) / 255; biomesColors[BiomeType.TROPICAL_DESERT] = new Color(255, 255, 128) / 255; biomesColors[BiomeType.TROPICAL_DESERT_SCRUB] = new Color(224, 255, 128) / 255; biomesColors[BiomeType.SUBTROPICAL_THORN_WOODLAND] = new Color(176, 240, 128) / 255; biomesColors[BiomeType.TROPICAL_THORN_WOODLAND] = new Color(192, 255, 128) / 255; biomesColors[BiomeType.TROPICAL_VERY_DRY_FOREST] = new Color(160, 255, 128) / 255; biomesColors[BiomeType.SUBTROPICAL_DRY_FOREST] = new Color(128, 240, 128) / 255; biomesColors[BiomeType.TROPICAL_DRY_FOREST] = new Color(128, 255, 128) / 255; biomesColors[BiomeType.SUBTROPICAL_MOIST_FOREST] = new Color(96, 240, 128) / 255; biomesColors[BiomeType.SUBTROPICAL_WET_FOREST] = new Color(64, 240, 144) / 255; biomesColors[BiomeType.SUBTROPICAL_RAIN_FOREST] = new Color(32, 240, 176) / 255; biomesColors[BiomeType.TROPICAL_MOIST_FOREST] = new Color(96, 255, 128) / 255; biomesColors[BiomeType.TROPICAL_WET_FOREST] = new Color(64, 255, 144) / 255; biomesColors[BiomeType.TROPICAL_RAIN_FOREST] = new Color(32, 255, 160) / 255; settings = _settings; noiseFilters = new NoiseFilter[_settings.moistureNoiseLayers.Length]; for (var i = 0; i < noiseFilters.Length; i++) { noiseFilters[i] = new NoiseFilter(_settings.moistureNoiseLayers[i].noiseSettings, _seed); } moistureMinMax = new MinMax(); }
private double avar(double zzt, double zzl, double zzc) { const double rt = 7.8, rl = 24.0; double sgt, yr; if (_lvar > Changes.None) { double q; switch (_lvar) { case Changes.All: _cs = _climateSettings[_klim]; goto case Changes.VariabilityMode; case Changes.VariabilityMode: goto case Changes.Frequency; case Changes.Frequency: q = Math.Log(0.133 * _wn); _gm = _cs.cfm1 + _cs.cfm2 / (Math.Pow(_cs.cfm3 * q, 2) + 1); _gp = _cs.cfp1 + _cs.cfp2 / (Math.Pow(_cs.cfp3 * q, 2) + 1); goto case Changes.AntennaHeight; case Changes.AntennaHeight: _dexa = Math.Sqrt(18000000 * Transmitter.he) + Math.Sqrt(18000000 * Receiver.he) + Math.Pow(575.7e12 / _wn, THIRD); goto case Changes.Distance; case Changes.Distance: if (_dist < _dexa) { _de = 130000 * _dist / _dexa; } else { _de = 130000 + _dist - _dexa; } break; } _vmd = curve(_cs.cv1, _cs.cv2, _cs.yv1, _cs.yv2, _cs.yv3, _de); _sgtm = curve(_cs.csm1, _cs.csm2, _cs.ysm1, _cs.ysm2, _cs.ysm3, _de) * _gm; _sgtp = curve(_cs.csp1, _cs.csp2, _cs.ysp1, _cs.ysp2, _cs.ysp3, _de) * _gp; _sgtd = _sgtp * _cs.csd1; _tgtd = (_sgtp - _sgtd) * _cs.zd; if (_w1) { _sgl = 0; } else { q = (1 - 0.8 * Math.Exp(-_dist / 50000.0)) * _dh * _wn; _sgl = 10 * q / (q + 13); } _vs0 = Math.Pow(5 + 3 * Math.Exp(-_de / 100000.0), 2); _lvar = Changes.None; } var zt = zzt; var zl = zzl; var zc = zzc; switch (_mdvar) { case VariabilityMode.Single: zt = zc; zl = zc; break; case VariabilityMode.Individual: zl = zc; break; case VariabilityMode.Mobile: zl = zt; break; } if (Math.Abs(zt) > 3.1 || Math.Abs(zl) > 3.1 || Math.Abs(zc) > 3.1) { _kwx = Math.Max(_kwx, 1); } if (zt < 0) { sgt = _sgtm; } else if (zt <= _cs.zd) { sgt = _sgtp; } else { sgt = _sgtd + _tgtd / zt; } var vs = _vs0 + Math.Pow(sgt * zt, 2) / (rt + zc * zc) + Math.Pow(_sgl * zl, 2) / (rl + zc * zc); switch (_mdvar) { case VariabilityMode.Single: yr = 0; _sgc = Math.Sqrt(sgt * sgt + _sgl * _sgl + vs); break; case VariabilityMode.Individual: yr = sgt * zt; _sgc = Math.Sqrt(_sgl * _sgl + vs); break; case VariabilityMode.Mobile: yr = Math.Sqrt(sgt * sgt + _sgl * _sgl) * zt; _sgc = Math.Sqrt(vs); break; default: yr = sgt * zt + _sgl * zl; _sgc = Math.Sqrt(vs); break; } var avarv = _aref - _vmd - yr - _sgc * zc; if (avarv < 0) { avarv = avarv * (29 - avarv) / (29 - 10 * avarv); } return(avarv); }