Curvy road
Coord-generator for roadwarrior3, which generates a smoothly curving road passing through a specified set of points. This function is an example of calculating the points instead of using the GUI of roadwarrior3.
function slingerweg_vb
% Slingerweg voorbeeld.
%
% Maakt automatisch een vierkante baan met een rechte, en oplopend-bochtige stukken
% Bochterigheid (2 of meer) is gedefinieerd als aantal bochten op een gegeven lijnstuk.
coords = [];
% Rechte stuk: bovenste zijde.
x0 = -0.75;
y0 = 0.75;
x1 = 0.75;
y1 = 0.75;
coords = [coords; x0 y0; x1 y1];
% Bochtige stuk 1: rechter zijde.
%
% Bochten definieren als zig-zag, worden bij berekenen weg afgerond.
bochtigheid = 8;
x0 = 0.75;
y0 = 0.75;
x1 = 0.75;
y1 = -0.75;
lijnstuk = bochelLijn(x0, y0, x1, y1, bochtigheid);
coords = [coords; lijnstuk];
% Bochtige stuk 2: onderste zijde.
%
% Bochten definieren als zig-zag, worden bij berekenen weg afgerond.
bochtigheid = 12;
x0 = 0.75;
y0 = -0.75;
x1 = -0.75;
y1 = -0.75;
lijnstuk = bochelLijn(x0, y0, x1, y1, bochtigheid);
coords = [coords; lijnstuk];
% Bochtige stuk 3: linker zijde.
%
% Bochten definieren als zig-zag, worden bij berekenen weg afgerond.
bochtigheid = 16;
x0 = -0.75;
y0 = -0.75;
x1 = -0.75;
y1 = 0.75;
lijnstuk = bochelLijn(x0, y0, x1, y1, bochtigheid);
coords = [coords; lijnstuk];
roadwarrior3(coords);
function lijnstuk = bochelLijn(x0, y0, x1, y1, bochtigheid);
lijnstuk = [x0 y0];
dx = (x1 - x0) / bochtigheid;
dy = (y1 - y0) / bochtigheid;
bocht_amplitude = leng(x1 - x0, y1 - y0) / bochtigheid;
for iHoek = 1:(bochtigheid - 1),
% basis
x_hoek = x0 + dx * iHoek;
y_hoek = y0 + dy * iHoek;
% zijwaartse stap
x_zij = -dy;
y_zij = dx;
L_zijstap = leng(x_zij, y_zij);
alterneer = -1 + 2 * mod(iHoek, 2);
x_zij = alterneer * bocht_amplitude * x_zij / L_zijstap;
y_zij = alterneer * bocht_amplitude * y_zij / L_zijstap;
lijnstuk = [lijnstuk; x_hoek + x_zij y_hoek + y_zij];
end;
lijnstuk = [lijnstuk; x1 y1];
function l = leng(dx, dy)
l = sqrt(dx^2 + dy^2);