コード例 #1
0
        //屏幕拾取点与模型中面的映射,即拾取点属于哪个面的判断,并返回该面中心点
        public static Vertex3 PointinWhichTri(Vertex3 ObP, t3DModel model)
        {
            Vertex3 Center = new Vertex3(0, 0, 0);
            int     t      = 0;

            for (int i = 0; i < model.numOfObjects; i++)
            {
                t3DObject pObject = model.pObject[i];        //模型中的体
                for (int j = 0; j < pObject.numOfFaces; j++) //体的面
                {
                    Vertex3[] p = new Vertex3[3];
                    for (int k = 0; k < 3; k++)
                    {
                        int     index = pObject.pFaces[j].vertIndex[k];
                        Vertex3 pi    = new Vertex3(pObject.pVerts[index].x, pObject.pVerts[index].y, pObject.pVerts[index].z);//每一个三角面顶点坐标
                        p[k] = pi;
                    }

                    Triangle Tri = new Triangle(p[0], p[1], p[2]);
                    if (PointinTriangle(Tri.p1, Tri.p2, Tri.p3, ObP))
                    {
                        Center = CenterP(Tri.p1, Tri.p2, Tri.p3);
                        break;
                        //goto finish;
                    }
                }
                t++;
            }
            // finish:
            return(Center);
        }
コード例 #2
0
        //计算单点日照时间
        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);
        }
コード例 #3
0
        //计算单点特定时刻是否被遮挡
        public static bool SinglePointShelter(Vertex3 ObP, t3DModel model, Vector3 Dn)
        {
            List <string> sunside = new List <string>();
            bool          Shelter = false;

            for (int i = 1; i < model.numOfObjects; i++)
            {
                t3DObject pObject = model.pObject[i];        //模型中的体
                for (int j = 0; j < pObject.numOfFaces; j++) //体的面
                {
                    Vertex3[] p = new Vertex3[3];
                    //获取面的顶点坐标
                    for (int k = 0; k < 3; k++)
                    {
                        int     index = pObject.pFaces[j].vertIndex[k];
                        Vertex3 pi    = new Vertex3(pObject.pVerts[index].x, pObject.pVerts[index].y, pObject.pVerts[index].z);//每一个三角面顶点坐标
                        p[k] = pi;
                    }
                    Triangle Tri = new Triangle(p[0], p[1], p[2]);

                    //计算三角面的法向量
                    Tri.CalculateVectorNorm();
                    //判断三角面是否是阳面,如果是阳面则做点是否被其遮挡判断
                    Tri.SunnySide(Dn);
                    if (Tri.IsSunnySide)
                    {
                        sunside.Add(i + ";" + j);
                        //if (IntersectJudge(Tri.Vn, Tri.p1, ObP, Dn))
                        //{
                        //    Shelter = true;
                        //    break;
                        //}
                    }
                }
                //if (Shelter) break;
            }
            return(Shelter);
        }