Example #1
0
		/// <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
			}
Example #2
0
		/// <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
			}
Example #3
0
		/// <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
			}