www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

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:
Arules.c | 12++++++++++++
Arules.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); +}