Wat is de kortste afstand van een punt tot een lijnsegment? Bij het bepalen van deze afstand moeten er twee scenario's onderscheiden worden, zoals aangegeven in onderstaande figuur.
Stel dat het lijnsegment de punten $$(x_1, y_1)$$ en $$(x_2, y_2)$$ met elkaar verbindt, en dat we de kortste afstand zoeken tussen dit lijnsegment en het punt $$(x_3, y_3)$$. In het eerste scenario (figuur links) snijdt de loodlijn uit het punt $$(x_3, y_3)$$ de rechte waarop het lijnsegment gelegen is in een punt $$(x_v, y_v)$$ dat zich op het lijnsegment bevindt. Dit punt wordt het voetpunt genoemd. De kortste afstand is dan gelijk aan de afstand tussen de punten $$(x_3, y_3)$$ en $$(x_v, y_v)$$. In het tweede scenario (figuur rechts) ligt het voetpunt buiten het lijnsegment, en wordt de kortste afstand gevormd door de kleinste afstand van het punt $$(x_3, y_3)$$ tot elk van de twee uiteinden van het lijnsegment $$(x_1, y_1)$$ en $$(x_2, y_2)$$.
Schrijf een functie afstand waaraan vier natuurlijke getallen moeten doorgegeven worden. Deze getallen stellen respectievelijk de coördinaten van twee punten $$(x_1, y_1)$$ en $$(x_2, y_2)$$ voor. De functie moet de Euclidische afstand $$d$$ tussen deze twee punten teruggeven, die gegeven wordt door de formule \[ d = \sqrt{(x_1 - x_2)^2 + (y_1 - y_2)^2} \]
Schrijf een functie voetpunt waaraan zes natuurlijke getallen moeten doorgegeven worden. Deze getallen stellen respectievelijk de coördinaten van drie punten $$(x_1, y_1)$$, $$(x_2, y_2)$$ en $$(x_3, y_3)$$ voor. De functie moet de twee (reële) coördinaten $$(x_v, y_v)$$ van het voetpunt teruggeven. Dit voetpunt is het snijpunt van de loodlijn uit het punt $$(x_3, y_3)$$ met de rechte door de punten $$(x_1, y_1)$$ en $$(x_2, y_2)$$, en het lijnsegment dat de punten $$(x_1, y_1)$$ en $$(x_2, y_2)$$ verbindt. Hiervoor berekent men eerst de waarde \[ u = \frac{(x_3 - x_1)(x_2 - x_1) + (y_3 - y_1)(y_2 - y_1)}{(x_2 - x_1)^2 + (y_2 - y_1)^2} \] De loodlijn zal enkel het lijnsegment snijden als $$0 \leq u \leq 1$$. Indien dat niet het geval is, dan moet de functie tweemaal de waarde None teruggeven voor de coördinaten van het voetpunt. Als de twee uiteinden van het lijnsegment samenvallen, dan wordt de noemer bij de berekening van $$u$$ gelijk aan nul, maar dan valt ook het voetpunt samen met de uiteinden van het lijnsegment. In de andere gevallen worden de coördinaten van het voetpunt gegeven door \[ \begin{eqnarray*} x_v &=& x_1 + u(x_2 - x_1) \\ y_v &=& y_1 + u(y_2 - y_1) \end{eqnarray*}\]
Gebruik de functies afstand en voetpunt om een functie kortste_afstand te schrijven waaraan zes natuurlijke getallen moeten doorgegeven worden. Deze getallen stellen respectievelijk de coördinaten van drie punten $$(x_1, y_1)$$, $$(x_2, y_2)$$ en $$(x_3, y_3)$$ voor. De functie moet de kortste afstand teruggeven tussen het punt $$(x_3, y_3)$$ en het lijnsegment dat de punten $$(x_1, y_1)$$ en $$(x_2, y_2)$$ verbindt.
>>> afstand(152, 152, 285, 19)
188.09040379562165
>>> afstand(100, 100, 195, 255)
181.79658962697843
>>> afstand(200, 200, 195, 255)
55.226805085936306
>>> voetpunt(100, 100, 200, 200, 285, 19)
(152.0, 152.0)
>>> voetpunt(100, 100, 200, 200, 195, 255)
(None, None)
>>> kortste_afstand(100, 100, 200, 200, 285, 19)
188.09040379562165
>>> kortste_afstand(100, 100, 200, 200, 195, 255)
55.226805085936306