public static GeoGrid seaLevel(GeoGrid input, Project proj) { float sea = proj.SeaLevel; int freq = input.getFrequency(); GeoGrid landForms = new GeoGrid(proj.Frequency); for (int par = 0; par < GeoGrid.NUMPARA; par++) { for (int r = 0; r < freq - 1; r++) { for (int c = 0; c < 2 * freq - 1; c++) { if (input.getTile(par, r, c).Value <= sea) { landForms.getTile(par, r, c).Value = 0f; } else { landForms.getTile(par, r, c).Value = 1f; } if (r == 0 && c == 0) { landForms.getTile(par, r, c).Value = 1f; } else if (r == 0 && c == freq - 1) { landForms.getTile(par, r, c).Value = 1f; } else if (r == 0 && c == 2 * freq - 2) { landForms.getTile(par, r, c).Value = 1f; } else if (r == freq - 1 && c == 0) { landForms.getTile(par, r, c).Value = 1f; } else if (r == freq - 1 && c == freq - 1) { landForms.getTile(par, r, c).Value = 1f; } else if (r == freq - 1 && c == 2 * freq - 2) { landForms.getTile(par, r, c).Value = 1f; } } } } return(landForms); }
public void drawGrid() { int frequency = grid.getFrequency(); float size; float initX; float initY; if (ASPECT <= ICOASPECT) { size = (2.0f * ASPECT) / ((11.0f) * (frequency - 1) * (ROOT3 / 2.0f)); initX = -ASPECT + (2.0f * ASPECT) / 11.0f; initY = 1.0f - (1.0f - ASPECT / ICOASPECT); for (int i = 0; i < 5; i++) { DrawIcoFace(frequency, size, initX, initY, i, 0); DrawIcoFace(frequency, size, initX, initY - ((ROOT3 * 2.0f * ASPECT) / 5.5f), i, 1); DrawIcoFace(frequency, size, initX + ((2.0f * ASPECT) / 11.0f), initY - ((ROOT3 * ASPECT) / 5.5f), i, 2); DrawIcoFace(frequency, size, initX + ((2.0f * ASPECT) / 11.0f), initY - ((ROOT3 * 3.0f * ASPECT) / 5.5f), i, 3); initX += (2.0f * ASPECT) / 5.5f; } } else { size = 4.0f / (9.0f * (frequency - 1)); initX = -ICOASPECT + (ICOASPECT / 11.0f); initY = 1.0f; for (int i = 0; i < 5; i++) { DrawIcoFace(frequency, size, initX + (2 * i * ICOASPECT / 5.5f), initY, i, 0); DrawIcoFace(frequency, size, initX + (2 * i * ICOASPECT / 5.5f), initY - (4.0f / 3.0f), i, 1); DrawIcoFace(frequency, size, initX + ((2 * i + 1) * ICOASPECT / 5.5f), initY - (2.0f / 3.0f), i, 2); DrawIcoFace(frequency, size, initX + ((2 * i + 1) * ICOASPECT / 5.5f), initY - (6.0f / 3.0f), i, 3); } } }
//cutoff determines the amount of steps before moisture reaches its lowest point public static RectGrid moisture(RectGrid input, Project proj, int cutoff) { GeoGrid geo = new GeoGrid(proj.Frequency); GeoGrid output = new GeoGrid(proj.Frequency); RectGrid coastDist = new RectGrid(input.Height, input.Width); GridDisplayEquiRect temp = new GridDisplayEquiRect(proj.Frequency); temp.RectToGeo(input, geo); GeoGrid landForms = seaLevel(geo, proj); int freq = landForms.getFrequency(); int rank = 1; Tile[] mates; bool clear = false; while (!clear) { clear = true; GeoGrid next = landForms.deepCopy(proj.Frequency); //Wheeeeeeee~ for (int par = 0; par < GeoGrid.NUMPARA; par++) { for (int r = 0; r < freq - 1; r++) { for (int c = 0; c < 2 * freq - 1; c++) { //If it's a land tile that hasn't been visited... if (landForms.getTile(par, r, c).Value > .5f) { mates = landForms.neighbors(r, c, par); for (int m = 0; m < mates.Length; m++) { //if it's a sea tile if (mates[m].Value < .5f) { //Remove from next step next.getTile(par, r, c).Value = 0f; //set distance away from coast output.getTile(par, r, c).Rank = Math.Min(rank, cutoff); clear = false; } } } } } } landForms = next; rank++; } //Determine moisture weight by dividing by cutoff (yes, I coulda put this in the loop above) for (int par = 0; par < GeoGrid.NUMPARA; par++) { for (int r = 0; r < freq - 1; r++) { for (int c = 0; c < 2 * freq - 1; c++) { output.getTile(par, r, c).Value = 1 - ((float)output.getTile(par, r, c).Rank / cutoff); output.getTile(par, r, c).Rank = 0; } } } temp.LoadGrid(output); temp.GeoToRect(coastDist); return(coastDist); }