/// <summary> /// Costruttore /// </summary> public Raggio() : base() { corpoAttuale = null; t1r = 0.0; t2r = 1.0; lambda = 0.0; }
private void aggiungiToolStripMenuItem_Click(object sender, EventArgs e) { displayList.Clear(); Point2D ax1, ax2, ax3; // Punti assi ax1 = new Point2D(0,0); ax2 = new Point2D(finestra.P2.x,0); ax3 = new Point2D(0,finestra.P2.y); (new Line2D(ax1,ax2)).Display(displayList,3); // Assi (new Line2D(ax1,ax3)).Display(displayList,3); this.gradiprimi.Visible=true; this.percdiam.Visible=true; FormTrasfo ft = new FormTrasfo(); ft.ShowDialog(); Transform2D tr = Transform2D.Rotazione(ft.r) + Transform2D.Traslazione(ft.x,ft.y); //Transform2D tr = Transform2D.Traslazione(Math.Max(lente.ET,lente.CT),0.0); CorpoOttico corpolente = lente.CreaCorpoOttico(tr); MaterialeOttico ambiente = new MaterialeOttico("vuoto", 1.0); completo.Add(corpolente.Materiale); completo.Add(ambiente); completo.Add(corpolente); //((CorpoOttico)amb.GetOggetto("lente")).Display(displayList,0); //lenteIn.Display(displayList,0); completo.Display(displayList,0); //corpolente.Display(displayList,0); Invalidate(); }
/// <summary> /// Funzione principale di calcolo ottico /// </summary> /// <param name="rIncidente"></param> /// <param name="ambiente"></param> /// <returns></returns> public override List<Raggio> CalcolaRaggi(Raggio rIncidente, MaterialeOttico ambiente) { List<Raggio> lR = new List<Raggio>(); // Lista di raggi if(ambiente !=null) // Controllo iniziale { Raggio r1 = null; // Raggio entrante Raggio r2 = null; // Raggio uscente for(r1 = rIncidente; r1 != null; r1 = r2) // Ciclo di calcolo { r2 = null; Intersection fint = TrovaIntersezione(r1); // Trova prima intersezione di r1 con il corpo ottico if(fint != null) // Se non la trova, r2 resta null { List<Contorno> lc = Belongs(fint.p); // Trova i contorni cui appartiene la prima intersezione if(lc.Count > 2) // Se piu` di due tratti: errore throw new Exception("Intersezione unica di un raggio con piu` di due tratti, in CalcolaRaggio()"); if(lc.Count == 2) // Se due tratti: su vertice { if(Tangenti(lc[0].Tratto, lc[1].Tratto)) // Se tangenti, considero intersezione su uno dei due, equivalente { if(lc[0].Stato != lc[1].Stato) // Se hanno uno stato superficiale diverso, elimina il raggio { lc.Clear(); } else // altrimenti lc.Remove(lc[1]); // elimino l'ultimo contorno... } // ...e proseguo al prossimo if } if(lc.Count == 1) // Se una sola intersezione { Point2D versoreIn = r1.Vector(); // Versori entrante (Raggio gia` normalizzato) e normale. Point2D versoreNorm = Function2D.VersorOut(fint.p, lc[0].Tratto, r1.Point(fint.t1 - dimcar*FrazioneEpsilon)); switch(lc[0].Stato) { case StatoSuperficie.Opaca: { break; // Non fa nulla, raggio assorbito, nessun raggio in uscita } case StatoSuperficie.Riflettente: // Calcola raggio riflesso { r2 = new Raggio(new Line2D(fint.p, Ottica.Riflesso(versoreIn, versoreNorm), true),r1.Lambda); r2.CorpoAttuale = r1.CorpoAttuale; break; } case StatoSuperficie.Trasparente: { MaterialeOttico co1, co2; // Corpi ottici del raggio in ingresso ed uscita co1 = r1.CorpoAttuale; if(co1 == this.Materiale) // Se il raggio entrante si trova nel corpo ottico { co2 = ambiente; // quello uscente nell'ambiente } else // se no, da ambiente... { co2 = this.Materiale; // ...a corpo attuale } Point2D vrifr = Ottica.Rifratto(versoreIn, versoreNorm, co1.nRifrazione, co2.nRifrazione); if(vrifr != null) { r2 = new Raggio(new Line2D(fint.p, vrifr, true),r1.Lambda); r2.CorpoAttuale = co2; #warning Manca determinazione se il raggio parte dall'esterno o dall'interno } break; } } } r1.T2r = fint.t1; } lR.Add(r1); } } return lR; }
/// <summary> /// Costruttore /// </summary> /// <param name="mat"></param> /// <param name="Nome"></param> public CorpoOttico(MaterialeOttico mat, string Nome) : this() { this.Materiale = mat; this.Nome = Nome; }
/// <summary> /// Costruttore /// </summary> /// <param name="mat"></param> public CorpoOttico(MaterialeOttico mat) : this() { this.Materiale = mat; }
public static double FrazioneEpsilon = 1e-4; // Usata per il calcolo di un punto di poco fuori dalla superficie #endregion #region COSTRUTTORI /// <summary> /// Costruttore /// </summary> public CorpoOttico() { contorni = new LinkedList<Contorno>(); Materiale = new MaterialeOttico(); bValid = false; }
/// <summary> /// Restituisce la lista di raggi (sempre nulla, non interagisce) /// </summary> /// <param name="rIncidente"></param> /// <param name="ambiente"></param> /// <returns></returns> public override List<Raggio> CalcolaRaggi(Raggio rIncidente, MaterialeOttico ambiente) { return new List<Raggio>(); }
public abstract List<Raggio> CalcolaRaggi(Raggio rIncidente, MaterialeOttico ambiente);
#pragma warning restore 1591 /// <summary> /// Costruttore /// </summary> public Ambiente() { matrice = new MaterialeOttico("vuoto", 1.0); oggetti = new List<OggettoOttico>(); }
/// <summary> /// Crea corpo ottico dalla lente nella posizione standard /// </summary> /// <returns></returns> //public CorpoOttico CreaCorpoOttico() // { // #warning Creare funzione CreaCorpoOttivo(Transform2D) // CorpoOttico co = null; // if(this.IsValid) // { // Point2D pt1 = new Point2D(0, RL); // Punti caratteristici // Point2D pt2 = new Point2D(-ET, RL); // Point2D pt3 = new Point2D(-ET, -RL); // Point2D pt4 = new Point2D(0.0, -RL); // Point2D ct1 = new Point2D(XCC1,0.0); // Point2D ct2 = new Point2D(XCC2,0.0); // Tratto sup1, sup2; // Contorni // Tratto bordo1, bordo2; // if(TIPO1 == Lente.TipoSuperficie.piana) // sup1 = new Line2D(pt2,pt3); // else if(TIPO1 == Lente.TipoSuperficie.convessa) // sup1 = new Arc2D(pt2,pt3,ct1,Arc2D.TrePunti.Estremi_e_Centro); // else // sup1 = new Arc2D(pt3,pt2,ct1,Arc2D.TrePunti.Estremi_e_Centro); // if(TIPO2 == Lente.TipoSuperficie.piana) // sup2 = new Line2D(pt1,pt4); // else if(TIPO2 == Lente.TipoSuperficie.convessa) // sup2 = new Arc2D(pt4,pt1,ct2,Arc2D.TrePunti.Estremi_e_Centro); // else // sup2 = new Arc2D(pt1,pt4,ct2,Arc2D.TrePunti.Estremi_e_Centro); // bordo1 = new Line2D(pt1, pt2); // bordo2 = new Line2D(pt3,pt4); // string nome_materiale = GetNomeMateriale(); // Imposta i nomi // string nome_lente = GetNomeCorpoOttico(); // MaterialeOttico mat_lente = new MaterialeOttico(nome_materiale, this.N); // Crea il materiale // co = new CorpoOttico(mat_lente,nome_lente); // Crea il corpo ottico // co.Add(new Contorno(bordo1, StatoSuperficie.Opaca)); // Aggiunge i contorni // co.Add(new Contorno(sup1)); // co.Add(new Contorno(bordo2, StatoSuperficie.Opaca)); // co.Add(new Contorno(sup2)); // } // return co; // } public CorpoOttico CreaCorpoOttico(Transform2D tr = null) { CorpoOttico co = null; if(this.IsValid) { if(tr==null) { tr = new Transform2D(Matrix.Id(Transform2D.Dim2Dhom)); } Point2D pt1 = tr.Transform(new Point2D(0, RL)); // Punti caratteristici Point2D pt2 = tr.Transform(new Point2D(-ET, RL)); Point2D pt3 = tr.Transform(new Point2D(-ET, -RL)); Point2D pt4 = tr.Transform(new Point2D(0.0, -RL)); Point2D ct1 = tr.Transform(new Point2D(XCC1,0.0)); Point2D ct2 = tr.Transform(new Point2D(XCC2,0.0)); Tratto sup1, sup2; // Contorni Tratto bordo1, bordo2; if(TIPO1 == Lente.TipoSuperficie.piana) sup1 = new Line2D(pt2,pt3); else if(TIPO1 == Lente.TipoSuperficie.convessa) sup1 = new Arc2D(pt2,pt3,ct1,Arc2D.TrePunti.Estremi_e_Centro); else sup1 = new Arc2D(pt3,pt2,ct1,Arc2D.TrePunti.Estremi_e_Centro); if(TIPO2 == Lente.TipoSuperficie.piana) sup2 = new Line2D(pt1,pt4); else if(TIPO2 == Lente.TipoSuperficie.convessa) sup2 = new Arc2D(pt4,pt1,ct2,Arc2D.TrePunti.Estremi_e_Centro); else sup2 = new Arc2D(pt1,pt4,ct2,Arc2D.TrePunti.Estremi_e_Centro); bordo1 = new Line2D(pt1, pt2); bordo2 = new Line2D(pt3,pt4); string nome_materiale = GetNomeMateriale(); // Imposta i nomi string nome_lente = GetNomeCorpoOttico(); MaterialeOttico mat_lente = new MaterialeOttico(nome_materiale, this.N); // Crea il materiale co = new CorpoOttico(mat_lente,nome_lente); // Crea il corpo ottico co.Add(new Contorno(bordo1, StatoSuperficie.Opaca)); // Aggiunge i contorni co.Add(new Contorno(sup1)); co.Add(new Contorno(bordo2, StatoSuperficie.Opaca)); co.Add(new Contorno(sup2)); } return co; }