Simulation von Bürgern
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import java.util.ArrayDeque;
  2. import pathfinder.*;
  3. PImage img_houses;
  4. PImage img_streets;
  5. PGraphics pg_map;
  6. int i_mapOffsetX, i_mapOffsetY, i_mapOffsetStartX, i_mapOffsetStartY;
  7. int i_biggestHouseSize;
  8. ArrayList<House> houses = new ArrayList<House>();
  9. void initHouses() {
  10. img_houses.loadPixels();
  11. for (int x = 0; x < img_houses.width; x++) {
  12. for (int y = 0; y < img_houses.height; y++) {
  13. if (int(red(img_houses.pixels[y*img_houses.width+x])) == 187) { //red must be 187 for a pixel to be part of a house
  14. houses.add(new House(x, y));
  15. img_houses.updatePixels();
  16. img_houses.loadPixels();
  17. }
  18. }
  19. }
  20. img_houses.updatePixels();
  21. for (House house : houses) {
  22. house.i_size = int(map(house.i_size, 0, i_biggestHouseSize, 0, 100));
  23. }
  24. }
  25. class House {
  26. PVector v2_center;
  27. int i_size;
  28. int i_ID;
  29. void display() {
  30. //text(i_size,v2_center.x,v2_center.y);
  31. text(i_ID, v2_center.x, v2_center.y);
  32. }
  33. ArrayDeque<PVector> v2d_selected = new ArrayDeque<PVector>();
  34. ArrayList<PVector> v2d_points = new ArrayList<PVector>();
  35. boolean isToSelect(int px, int py, int[] pxl, int pw, int ph, int orgColor) {
  36. if (px < 0 || px >= pw || py < 0 || py >= ph)
  37. return false;
  38. return pxl[px + py * pw] == orgColor;
  39. }
  40. PVector v2_randomSpawnPoint() {
  41. return v2d_points.get(int(random(0, v2d_points.size())));
  42. }
  43. House(int startX, int startY) {
  44. i_ID = houses.size();
  45. int [] pxl = img_houses.pixels;
  46. int pw = img_houses.width;
  47. int ph = img_houses.height;
  48. int orgColor = pxl[startX + startY * pw];
  49. PVector v2_p = new PVector(startX, startY);
  50. //color randCol = color(int(random(0, 255)), int(random(0, 255)), int(random(0, 255)));
  51. v2d_selected.add(v2_p);
  52. int west, east;
  53. while (!v2d_selected.isEmpty () ) { //&& q.size() < 500) {
  54. v2_p = v2d_selected.removeFirst();
  55. if (isToSelect(int(v2_p.x), int(v2_p.y), pxl, pw, ph, orgColor)) {
  56. west = east = int(v2_p.x);
  57. while (isToSelect(--west, int(v2_p.y), pxl, pw, ph, orgColor));
  58. while (isToSelect(++east, int(v2_p.y), pxl, pw, ph, orgColor));
  59. for (int x = west + 1; x < east; x++) {
  60. v2d_points.add(new PVector(x, int(v2_p.y)));
  61. pxl[x + int(v2_p.y) * pw] = color(188, 188, 188); //important for not selecting the same area more than once
  62. if (isToSelect(x, int(v2_p.y) - 1, pxl, pw, ph, orgColor))
  63. v2d_selected.add(new PVector(x, int(v2_p.y) - 1));
  64. if (isToSelect(x, int(v2_p.y) + 1, pxl, pw, ph, orgColor))
  65. v2d_selected.add(new PVector(x, v2_p.y + 1));
  66. }
  67. }
  68. }
  69. i_size = v2d_points.size();
  70. PVector avgPoint = new PVector(0, 0);
  71. for (PVector point : v2d_points) {
  72. avgPoint.add(point);
  73. }
  74. avgPoint.x = avgPoint.x/i_size;
  75. avgPoint.y = avgPoint.y/i_size;
  76. v2_center = avgPoint;
  77. if (i_size > i_biggestHouseSize) i_biggestHouseSize = i_size;
  78. }
  79. }