commit ceeadcac13d2c190f1e630cee6b1b1cba1caf27b
parent 753c61072d1c1b4ecfd4d8081a2a1a409f342bdd
Author: Georges Dupéron <jahvascriptmaniac+github@free.fr>
Date: Fri, 4 Nov 2011 18:47:33 +0100
Génération de ville basée sur les règles.
Diffstat:
| A | rules.c | | | 12 | ++++++++++++ |
| A | rules.md | | | 62 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
2 files changed, 74 insertions(+), 0 deletions(-)
diff --git a/rules.c b/rules.c
@@ -0,0 +1,12 @@
+#include <stdio.h>
+#include "hash.h"
+
+void regle1() {
+ // carré(x1,y1,x2,y2) → carré()*4 avec une croix de routes au milieu.
+}
+
+int main() {
+ // Générer une tile de base
+ // tile.subdivide tant qu'on n'a pas le niveau de détail désiré.
+ return 0;
+}
diff --git a/rules.md b/rules.md
@@ -0,0 +1,62 @@
+rectangle suffisemment petit, résidentiel → maison
+rectangle suffisemment petit, commercial → magasin
+…
+
+// TODO : condition : les routes présentes sur le bord du rectangle doivent être signalées.
+// TODO : largeur des routes
+// TODO : quand on trace une route jusqu'au bord, faire un carrefour / T avec la route voisine.
+
+
+// TODO : faire pour des angles entre 70° et 110°.
+
+// RectangleRoutes(Vertex coins[4]) est un quadrilatère de routes avec des angles aux coins égaux à 90°.
+// TODO : distinguer à la création les RectangleRoutes avec (all sides length > 10) et les autres cas.
+struct RectangleRoutes {
+ Vertex ne;
+ Vertex se;
+ Vertex so;
+ Vertex no;
+ // TODO : prendre en compte les entrées/sorties.
+ IO n;
+ IO e;
+ IO s;
+ IO o;
+ int seed;
+}
+
+int randomInRange(int seed, int n, int a, int b) {
+ return (hash(seed, n) % (b - a)) + a;
+}
+
+int newSeed(int seed, int n) {
+ return hash(seed, n);
+}
+
+RectangleRoutes r (all sides length > 10) {
+ Vertex split = { .x = randomInRange(r.seed, 0, r.no.x+5, r.ne.x-5), .y = randomInRange(r.seed, 1, r.no.x+5, r.ne.x-5) };
+ Carrefour(split + (1,1), split - (1,1))
+ // routes au NESW du carrefour
+ Route((r.ne.x, split.y) + (0,1)), split + (1,1))
+ Route((split.x, r.se.y) + (1,0)), split + (-1,1))
+ Route((r.so.x, split.y) + (0,-1)), split + (-1,-1))
+ Route((split.x, r.no.y) + (-1,0)), split + (1,-1))
+ // subrectangles
+ RectangleRoutes(split + (1,1), r.ne, newSeed(r.seed, 2));
+ RectangleRoutes(split + (1,-1), r.se, newSeed(r.seed, 3));
+ RectangleRoutes(split + (-1,-1), r.so, newSeed(r.seed, 4));
+ RectangleRoutes(split + (-1,1), r.no, newSeed(r.seed, 5));
+}
+
+// rectangle suffisemment grand → rectangle*4 avec un T de routes au milieu.
+Rectangle r (r.width > 10 && r.height > 10) {
+ Vertex split = randomPointInRect(r);
+ Carrefour(split + (1,1), split - (1,1))
+ // routes au NESW du carrefour
+ Route((r.ne.x, split.y) + (0,1)), split + (1,1))
+ Route((split.x, r.se.y) + (1,0)), split + (-1,1))
+ Route((r.so.x, split.y) + (0,-1)), split + (-1,-1))
+ // subrectangles
+ Rectangle((r.so.x,split.y) + (0,1), r.ne);
+ Rectangle(split + (1,-1), r.se);
+ Rectangle(split + (-1,-1), r.so);
+}