In een vorige blog werd uitgelegd dat het bepalen van een afstand naar een Alignment niet altijd goed gaat, of een ongewenst resultaat geeft vanwege het verschil loodrecht en dichtstbijzijnd. Hoe kun je nu toch een correcte (signed) afstand bepalen naar een Alignment (of andere lijnvormig object)?

PolyCurve

In Civil 3D heb je bijvoorbeeld een Alignment en een serie punten.

In Dynamo heb je een PolyCurve nodig van de Alignment. Met de Arkance Systems Node Library kun je dat met één Node oplossen. Daarna kun je met de Node  ClosestPointTo punten vinden op de PolyCurve:

Hier kun je zien dat het middelste (laagst liggende) punt nu naar verwachting op de Alignment wordt geplaatst, namelijk het punt met de kortst mogelijke afstand. Als je de Node Station And Offset zou gebruiken, dan zou het punt haaks op de Alignment gevonden worden (op het rechte verticale stuk helemaal rechts) en daarmee een ongewenst resultaat opleveren, zoals je in de vorige blog hebt kunnen zien.

Plus of min (links of rechts)

De afstand naar de Alignment is nu prima te berekenen met de functie DistanceTo, maar dit levert alleen een rechtstreekse en positieve afstand op.

Om de links/rechts afstand op te vragen zul je een wiskundige berekening moeten doen. Namelijk de hoek uitrekenen tussen de projectielijn en de richting van het geprojecteerde punt op de Alignment. Als je de richting van de Alignment opvraagt op dat punt dan is de hoek tussen Alignment en projectielijn altijd pakweg 90 graden, of het te projecteren punt nu links of rechts van de lijn ligt. Daarom kies je het beste de richting haaks op de Alignment, weer richting terug naar het te projecteren punt, zodat de hoek altijd rond 0 graden (links) of 180 graden (rechts) ligt.

Hoek tussen vectoren

Hiervoor zijn twee vectoren nodig. Eén is heel eenvoudig uit te rekenen tussen het punt en het geprojecteerde punt. De andere (haaks op de Alignment) kan met een kleine omweg van ParameterAtPoint > CoordinateSystemAtParameter > XAxis worden bepaald. Daarna kun je de hoek uitrekenen tussen twee vectoren met de functie AngleWithVector.

Nu hoef je alleen nog te kijken of de hoek kleiner of groter is dan 90 graden, en daarmee haal je gelijk de afrondingsfouten eruit. Je kunt hier een aantal Nodes voor gebruiken maar ook een DesignScript functie die direct de afstand corrigeert naar een min-waarde:

Met andere woorden: als de hoek kleiner is dan 90 graden dan wordt afstand * -1 teruggegeven , en zo niet dan wordt de afstand als opgegeven weer teruggegeven. Min-afstanden liggen dus links van de Alignment en plus-afstanden liggen rechts van de Alignment.