Beispiel #1
0
 /// <summary>
 /// Costruttore
 /// </summary>
 public Raggio()
     : base()
 {
     corpoAttuale = null;
     t1r = 0.0;
     t2r = 1.0;
     lambda = 0.0;
 }
Beispiel #2
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();

			}
Beispiel #3
0
			/// <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;
			}
Beispiel #4
0
		/// <summary>
		/// Costruttore
		/// </summary>
		/// <param name="mat"></param>
		/// <param name="Nome"></param>
		public CorpoOttico(MaterialeOttico mat, string Nome) : this()
			{
			this.Materiale = mat;
			this.Nome = Nome;
			}
Beispiel #5
0
			/// <summary>
			/// Costruttore
			/// </summary>
			/// <param name="mat"></param>
		public CorpoOttico(MaterialeOttico mat) : this() 
			{
			this.Materiale = mat;
			}
Beispiel #6
0
		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;
			}
Beispiel #7
0
		/// <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>();
			}
Beispiel #8
0
		public abstract List<Raggio> CalcolaRaggi(Raggio rIncidente, MaterialeOttico ambiente);
Beispiel #9
0
		#pragma warning restore 1591
		/// <summary>
		/// Costruttore
		/// </summary>
		public Ambiente() 
			{
			matrice = new MaterialeOttico("vuoto", 1.0);
			oggetti = new List<OggettoOttico>();
			}
Beispiel #10
0
		/// <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;
			}