//全天日照时间 private void button3_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); Vertex3 Obp = new Vertex3(posX, posZ, posY); //获取日出、日落时间 double[] SUN = CountSun.SunRaiseSetTime(Y, M, D, Lon, Lat); if (listBox1.Items.Count > 0) { listBox1.Items.Clear(); } listBox1.Items.Add("日出时间:" + (int)SUN[0] + ":" + (int)((SUN[0] - (int)SUN[0]) * 60)); listBox1.Items.Add("日落时间:" + (int)SUN[1] + ":" + (int)((SUN[1] - (int)SUN[1]) * 60)); //计算日照时间 List <string> ShadowTime = CalculateTools.SinglePointTime(Obp, gl.model.model, Y, M, D, Lon, Lat); for (int i = 0; i < ShadowTime.Count - 1; i++) { listBox1.Items.Add("被遮挡时间:" + ShadowTime[i]); } listBox1.Items.Add("全天总日照时间:" + Convert.ToString(Math.Round((SUN[1] - SUN[0] - ShadowTime.Count * 10.0 / 60.0), 2)) + "小时"); //listBox1.Items.Add("全天总日照时间:" + ShadowTime[ShadowTime.Count - 1] + "小时"); }
//判断面是阳面还是阴面,参数Dn为太阳的方向向量 public void SunnySide(Vector3 Dn) { //Dn =CalculateTools.CalculateDirectionVector(Dec, Ha); double Angle = Math.Acos(CalculateTools.DotProduct(Vn, Dn) / (CalculateTools.CalculateNorm(Vn) * CalculateTools.CalculateNorm(Dn))); Angle = Angle / Math.PI * 180; if (Angle >= 90) { IsSunnySide = false; } else { IsSunnySide = true; } }
//点是否被三角面遮挡 //Tn-三角面的法向量,TP-三角面上的一个点,RP-射线的起点就待测点,Rd-射线的方向向量 public static bool IntersectJudge(Vector3 Tn, Vertex3 TP, Vertex3 RP, Vector3 Rd) { bool IsIntersectTri; // double t = (CalculateTools.DotProduct(Tn, TP) - CalculateTools.DotProduct(Tn, RP)) / CalculateTools.DotProduct(Tn, Rd); if (t > 0) { IsIntersectTri = true; } else { IsIntersectTri = false; } return(IsIntersectTri); }
//遮挡分析 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]); }
//计算面的法向量 public void CalculateVectorNorm() { Vn = CalculateTools.Cross(p1, p2, p3); }