Exemplo n.º 1
0
        //全天日照时间
        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] + "小时");
        }
Exemplo n.º 2
0
        //判断面是阳面还是阴面,参数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;
            }
        }
Exemplo n.º 3
0
        //点是否被三角面遮挡
        //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);
        }
Exemplo n.º 4
0
        //遮挡分析
        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]);
        }
Exemplo n.º 5
0
 //计算面的法向量
 public void CalculateVectorNorm()
 {
     Vn = CalculateTools.Cross(p1, p2, p3);
 }