//计算单点日照时间 public static List <string> SinglePointTime(Vertex3 ObP, t3DModel model, int Y, int M, int D, double Lon, double Lat) { double Tr = CountSun.SunRaiseSetTime(Y, M, D, Lon, Lat)[0]; //日出时间 double Ts = CountSun.SunRaiseSetTime(Y, M, D, Lon, Lat)[1]; //日落时间 double t = 0; //遮挡时间 List <string> ShadowTime = new List <string>(); List <Vector3> dn = new List <Vector3>(); Vector3 Dn = null; //每隔10分钟判读一次观测被遮挡情况 for (double T = Tr; T <= Ts; T += 10.0 / 60.0) { int H = (int)T; int Min = (int)((T - H) * 60); H = H + Min / 60; Min = Min % 60; double[] sun = CountSun.CalculateSun(Y, M, D, H, Min, Lon, Lat);//计算太阳因子 Dn = CalculateDirectionVector(sun[2], sun[3]); dn.Add(Dn); //Vector3 Dn = CalculateDirectionVector(ObP.z,sun[0], sun[1]);//计算太阳单位方向向量 //Dn.x += ObP.x; //Dn.y -= ObP.y; //Dn.z += ObP.z; bool shelter = SinglePointShelter(ObP, model, Dn);//判断是否被遮挡 if (shelter) { t += 10; if (Min < 10) { ShadowTime.Add(H + ":0" + Min + "--" + H + ":" + (Min + 10)); } else { ShadowTime.Add(H + ":" + Min + "--" + H + ":" + (Min + 10)); } } } t = t / 60; //被遮挡时间 ShadowTime.Add(Convert.ToString(Math.Round((Ts - Tr - t), 2))); //日照时间 return(ShadowTime); }
//遮挡分析 private void button2_Click(object sender, EventArgs e) { double Lon = Convert.ToDouble(lon.Text); double Lat = Convert.ToDouble(lat.Text); int Y = Convert.ToInt32(TimeY.Text); int M = Convert.ToInt32(TimeM.Text); int D = Convert.ToInt32(TimeD.Text); int H = Convert.ToInt32(textBox1.Text); int Min = Convert.ToInt32(textBox2.Text); //判断所选点是哪个面并返回面中心 Vertex3 Obp = new Vertex3(posX, posZ, posY); //Vertex3 CenterTri= CalculateTools.PointinWhichTri(Obp, gl.model.model); //MessageBox.Show(Convert.ToString(CenterTri.x) + "+" + Convert.ToString(CenterTri.y) + "+" + Convert.ToString(CenterTri.z)); //单点遮挡判断 double [] SUN = CountSun.CalculateSun(Y, M, D, H, Min, Lon, Lat);//太阳因子,分别为高度、方位、赤角、时角 Vector3 Dn = CalculateTools.CalculateDirectionVector(SUN[2], SUN[3]); //Vector3 Dn = CalculateTools.CalculateDirectionVector(Obp.z,SUN[0],SUN[1]);//太阳单位方向向量 //Dn.x += Obp.x; //Dn.y -= Obp.y; //Dn.z += Obp.z; bool shadow = CalculateTools.SinglePointShelter(Obp, gl.model.model, Dn); this.WindowState = FormWindowState.Minimized; if (shadow) { MessageBox.Show("该点被遮挡!"); } else { MessageBox.Show("该点被照射!"); } this.WindowState = FormWindowState.Normal; if (listBox1.Items.Count > 0) { listBox1.Items.Clear(); } listBox1.Items.Add("太阳高度角:" + SUN[0]); listBox1.Items.Add("太阳方位角:" + SUN[1]); }