/// <summary> /// Arco per punti estremi e centro oppure terzo punto. /// Mantiene invariati gli oggetti pIni e pFin /// </summary> /// <param name="pIni">punto iniziale (mantenuto invariato)</param> /// <param name="pFin">punto finale (mantenuto invariato)</param> /// <param name="pCenter_or_3dPoint">centro o terzo punti</param> /// <param name="trepunti">TrePunti.tipo</param> public Arc2D(Point2D pIni, Point2D pFin, Point2D pCenter_or_3dPoint, TrePunti trepunti) : base(typeof(Arc2D)) { if(trepunti == TrePunti.Estremi_e_Centro) { this.pIni = pIni; // Imposta gli estremi... this.pFin = pFin; // ...e non li cambia piu` Point2D mid = 0.5 * (pIni + pFin); // Punto medio Point2D norm = (pFin - pIni).Normal(); // Normale double rIni = (pIni - pCenter_or_3dPoint).Mod(); double rFin = (pFin - pCenter_or_3dPoint).Mod(); double d12 = 0.5 * ((pFin - pIni).Mod()); // Meta` lunghezza this.radius = 0.5 * (rIni + rFin); // Raggio (medio) double apo = Math.Sqrt( radius*radius - d12*d12 ); // Apotema this.pCenter = mid + (apo * Math.Sign(norm^(pCenter_or_3dPoint-mid))) * norm; // Centro Point2D dirIni = pIni - this.pCenter; // Direzioni dei punti Point2D dirFin = pFin - this.pCenter; alfaIni = dirIni.Alfa(); // Calcola gli angoli alfaFin = dirFin.Alfa(); Validate(); } else if(trepunti == TrePunti.Tre_Punti) { throw new Exception("Construttore non completamente implementato"); } }
/// <summary> /// Arco per centro e due punti /// </summary> /// <param name="center">Centro</param> /// <param name="radius">Raggio (opzionale)</param> /// <param name="pIni">Punto iniziale</param> /// <param name="pFin">Punto finale</param> /// <param name="useRadius">true: usa il raggio, false: lo calcola in base ai punti</param> public Arc2D(Point2D center, double radius, Point2D pIni, Point2D pFin, bool useRadius) : base(typeof(Arc2D)) { this.pCenter = center; Point2D dirIni = pIni - center; // Direzioni dei punti Point2D dirFin = pFin - center; double rIni = dirIni.Mod(); // Calcola i moduli double rFin = dirFin.Mod(); if(useRadius) { this.radius = radius; } else { this.radius = (rIni + rFin)*0.5; // Calcola raggio medio } alfaIni = dirIni.Alfa(); // Calcola gli angoli alfaFin = dirFin.Alfa(); dirIni.Normalize(); // Normalizza le direzioni dirFin.Normalize(); this.pIni = center + this.radius * dirIni; // Calcola i punti senza usare gli angoli, imprecisi this.pFin = center + this.radius * dirFin; Validate(); }
/// <summary>Costruttore di copia</summary> /// <param name="sorgente"></param> public SorgenteOttica(SorgenteOttica sorgente) : base(sorgente.Nome) { this.tipoSorgente = sorgente.tipoSorgente; this.arco = sorgente.arco; this.diametro = sorgente.diametro; this.divergenza = sorgente.divergenza; this.lambda = sorgente.lambda; this.nraggi = sorgente.nraggi; this.lineaRaggio = sorgente.lineaRaggio; Validate(); }
/// <summary> /// Arco /// </summary> public Arc2D() : base(typeof(Arc2D)) { pCenter = null; radius = 0.0; alfaIni = alfaFin = 0.0; bCircle = false; pIni = null; pFin = null; bValid = false; }
/// <summary>Costruttore vuoto</summary> public SorgenteOttica() : base() { tipoSorgente = TipoSorgente.collimata; lineaRaggio = new Line2D(); divergenza = new Angolo(0.0); Validate(); }