lsa-planer

LSA-Planer Professional – Planungssoftware für Lichtsignalanlagen nach RiLSA 2015 und § 45 StVO. EUPL-1.2.

/ tests domain stuetzpunktdichte.test.ts

2,8 KB Rohdatei
tests/domain/stuetzpunktdichte.test.ts — 85 Zeilen
1 import { describe, expect, it } from 'vitest';
2 import {
3 REGELBREITE,
4 ueberlappung,
5 vermesseWege,
6 type Fahrlinie,
7 type Punkt,
8 } from '@/domain/geometrie/vermessung';
9
10 /**
11 * Gerade Fahrlinie von (0;y) bis (laengeM;y), zerlegt in Stuecke der
12 * angegebenen Schrittweite. So entsteht dieselbe Geometrie wie mit zwei
13 * Punkten - nur mit der Stuetzpunktdichte, die beim Nachfahren im Lageplan
14 * tatsaechlich anfaellt.
15 */
16 function geradeMitSchrittweite(
17 id: string,
18 y: number,
19 laengeM: number,
20 schritt: number,
21 breite: number,
22 ): Fahrlinie {
23 const punkte: Punkt[] = [];
24 const stuecke = Math.round(laengeM / schritt);
25 for (let i = 0; i <= stuecke; i += 1) {
26 punkte.push({ x: Math.min(i * schritt, laengeM), y });
27 }
28 return { id, punkte, breite };
29 }
30
31 describe('Ueberlagerung haengt nicht an der Zahl der gesetzten Stuetzpunkte', () => {
32 // Fussgaengerfurt laengs einer Fahrlinie, Achsabstand 0,5 m. Die Korridore
33 // ueberdecken sich ueber die vollen 20 m - Grenzabstand ist (3,25+4,0)/2.
34 const furt: Fahrlinie = {
35 id: 'furt',
36 punkte: [
37 { x: 0, y: 0.5 },
38 { x: 20, y: 0.5 },
39 ],
40 breite: REGELBREITE.fuss,
41 };
42 const grob = geradeMitSchrittweite('kfz-grob', 0, 20, 20, REGELBREITE.kfz);
43 const dicht = geradeMitSchrittweite('kfz-dicht', 0, 20, 0.8, REGELBREITE.kfz);
44
45 it('meldet die 20 m Ueberlagerung auch, wenn die Fahrlinie im Abstand von 0,8 m nachgefahren wurde', () => {
46 // Sonst erlebt der Anwender: Dieselbe Furt neben derselben Fahrlinie gilt
47 // als vertraeglich, sobald er die Linie mit mehr als einem Klick je Meter
48 // gezeichnet hat - es entsteht weder Konflikt noch Zwischenzeit.
49 expect(ueberlappung(grob, furt)?.laenge).toBeCloseTo(20, 3);
50 expect(ueberlappung(dicht, furt)?.laenge).toBeCloseTo(20, 3);
51 });
52
53 it('meldet sie auch, wenn die dicht gezeichnete Linie die zweite ist', () => {
54 expect(ueberlappung(furt, dicht)?.laenge).toBeCloseTo(20, 3);
55 });
56
57 it('vermisst dieselben Wege wie bei der grob gezeichneten Linie', () => {
58 const wegeGrob = vermesseWege(grob, furt);
59 const wegeDicht = vermesseWege(dicht, furt);
60 expect(wegeGrob).not.toBeNull();
61 expect(wegeDicht).not.toBeNull();
62 expect(wegeDicht?.raeumweg).toBe(wegeGrob?.raeumweg);
63 expect(wegeDicht?.einfahrweg).toBe(wegeGrob?.einfahrweg);
64 });
65
66 it('haelt die Rauschschwelle ein: ein gemeinsames Stueck unter 1 m bleibt unbeachtet', () => {
67 const vorne: Fahrlinie = {
68 id: 'vorne',
69 punkte: [
70 { x: 0, y: 0 },
71 { x: 20, y: 0 },
72 ],
73 breite: REGELBREITE.kfz,
74 };
75 const anschluss: Fahrlinie = {
76 id: 'anschluss',
77 punkte: [
78 { x: 19.5, y: 0 },
79 { x: 40, y: 0 },
80 ],
81 breite: REGELBREITE.kfz,
82 };
83 expect(ueberlappung(vorne, anschluss)).toBeNull();
84 });
85 });