/// <summary> /// Distanza punto - retta /// </summary> /// <param name="p">Punto</param> /// <param name="l">Linea</param> /// <returns></returns> public static double Distance(Point2D p, Line2D l) { // Scalare tra versore normale return (p - l.P2) ^ ((l.Vector()).Normal()); // e segmento Po - P1 o Po - P2 }
/// <summary> /// Versore (modulo unitario) per il punto p normale ad l /// </summary> /// <param name="p">Punto p</param> /// <param name="l">Linea l</param> /// <param name="vOut">Versore (parametro out)</param> /// <param name="ext">Punto esterno opzionale per definire il verso</param> /// <returns>true se trovato</returns> public static bool VersorOut( Point2D p, Line2D l, out Point2D vOut, Point2D ext = null) { bool prf; Point2D pr; vOut = null; prf = Projection(p, l, out pr, true); // Proiezione su curva (appartenente) if(prf) // Se trovata... { Point2D normale = l.Vector().Normal(); // Normale per il punto di proiezione if(ext != null) { double scalare = (ext-pr) ^ normale; // Scalare tra vettore uscente e normale calcolata if(scalare < 0) normale = -normale; // Inverte } vOut = normale; // Versore da pr, lunghezza unitaria } return prf; // restituisce false se errore }
/// <summary> /// Proiezione di un punto su una linea /// </summary> /// <param name="p">Punto</param> /// <param name="l">Linea</param> /// <param name="projection">Proiezione (parametro out)</param> /// <param name="bInside">true se richiesta appartenenza proiezione all'interno della linea</param> /// <returns>true se trovata</returns> public static bool Projection( Point2D p, Line2D l, out Point2D projection, bool bInside = false) { Point2D tmp = l.Vector().Normal(); Line2D prLine = new Line2D(p, l.Vector().Normal(), true); // Calcola normale al segmento passante per p List<Intersection> lint = Function2D.Intersect(l, prLine, bInside, false); // Interseca linea e normale, chiede eventuale appartenenza a linea if(lint.Count > 0) // Se trovata almeno una intersezione { projection = (lint[0]).p; // Estrae il punto di intersezione dal primo elemento della lista return true; } projection = new Point2D(); // Se non trova intersezione o se bInside e fuori dal segmento return false; // restituisce false + punto vuoto }