Voronoi dual road networks with crossings




Modeling, Environment


Houdini 19.0

1 Introduction

A barebone example for a dual voronoi network with shortest paths and curved crossings.

2 Crossings

First we identify crossings by the number of neighbour points.

neighbourcount(0, i@ptnum)>2

We set up an array nbs[] of neighbour points. In the first loop we calculate their angle in relation to their center to order the neighbour points counter-clockwise with argsort and reorder.

The second loop calculates intermediate points located halfway between a neighbour and the center point (point(0, 'P', nb) + v@P) / 2.0. The third loop connects consecutive neighbour points along with one intermediate point to a curve.

int nbs[] = neighbours(0, i@ptnum);

float angle[];
foreach(int nb; nbs){
    vector pos = point(0, 'P', nb) - v@P;
    float a = atan(pos.x, pos.z);
    append(angle, a);

int indices[] = argsort(angle);
nbs = reorder(nbs, indices);

int pts[];
foreach(int nb; nbs){
    vector pos_pt = (point(0, 'P', nb) + v@P) / 2.0;
    int pt = addpoint(0, pos_pt);
    append(pts, pt);  

foreach(int i; int nb; nbs){
    int pt_next = nbs[(i+1)%len(nbs)];
    int pr = addprim(0, 'polyline', nb, pts[i], pts[(i+1)%len(pts)], pt_next);
    setprimgroup(0, 'crossing', pr, 1, 'set');

removepoint(0, i@ptnum);