//屏幕拾取点与模型中面的映射,即拾取点属于哪个面的判断,并返回该面中心点 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); }
//计算单点日照时间 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); }
//计算单点特定时刻是否被遮挡 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); }