Exemple #1
0
        /// <summary>
        /// 求圆柱体绕射模型表面的细分三角形
        /// </summary>
        /// <param name="originPoint">辐射源</param>
        /// <param name="diffractionPoint1">绕射点1</param>
        /// <param name="diffractionPoint">绕射点2</param>
        /// <param name="diffractionEdge">绕射棱</param>
        /// <param name="divisionNumber">细分系数</param>
        /// <param name="angleOfTwoTers">两个绕射面的夹角</param>
        /// <returns></returns>
        private static List <List <Triangle> > GetCirclarTruncatedConeSurfaceDivisionTriangles(Point originPoint, Point diffractionPoint1, Point diffractionPoint2, AdjacentEdge diffractionEdge, int divisionNumber, double angleOfTwoTers)
        {
            RayInfo launchRay1 = new RayInfo(originPoint, diffractionPoint1);                                  //从上一节点到绕射点1重新构造一条入射线
            RayInfo launchRay2 = new RayInfo(originPoint, diffractionPoint2);                                  //从上一节点到绕射点2重新构造一条入射线
            double  angleOfRay1AndEdge = launchRay1.GetAngleOfTwoStraightLines(diffractionEdge.SwitchToRay()); //获取射线1与劈边的夹角
            double  angleOfRay2AndEdge = launchRay2.GetAngleOfTwoStraightLines(diffractionEdge.SwitchToRay()); //获取射线2与劈边的夹角
            double  distanceToDiffractionPoint1 = originPoint.GetDistance(diffractionPoint1);
            double  distanceToDiffractionPoint2 = originPoint.GetDistance(diffractionPoint2);
            double  circleRadius1, circleRadius2;

            if (distanceToDiffractionPoint1 > distanceToDiffractionPoint2)
            {
                circleRadius1 = (distanceToDiffractionPoint1 - distanceToDiffractionPoint2) * Math.Sin(angleOfRay1AndEdge * Math.PI / 180);
                circleRadius2 = 2 * (distanceToDiffractionPoint1 - distanceToDiffractionPoint2) * Math.Sin(angleOfRay2AndEdge * Math.PI / 180);
            }
            else
            {
                circleRadius2 = (distanceToDiffractionPoint2 - distanceToDiffractionPoint1) * Math.Sin(angleOfRay2AndEdge * Math.PI / 180);
                circleRadius1 = 2 * (distanceToDiffractionPoint2 - distanceToDiffractionPoint1) * Math.Sin(angleOfRay1AndEdge * Math.PI / 180);
            }
            Point circleCenterPoint1 = GetCircleCenterPoint(launchRay1, diffractionPoint1, angleOfRay1AndEdge, diffractionEdge, circleRadius1);//在劈边上选一个与绕射射线同向且不是绕射点的点,作为圆盘的圆心
            Point circleCenterPoint2 = GetCircleCenterPoint(launchRay2, diffractionPoint2, angleOfRay2AndEdge, diffractionEdge, circleRadius2);
            //求圆盘面上的一对相互垂直的方向向量
            SpectVector circleVectorU = GetVectorInThePlaneOfCircle(diffractionEdge, circleCenterPoint1);                                                                                                                                                                                //先求圆所在平面上的一个向量
            SpectVector circleVectorV = GetQuadratureVectorInTheOfCircle(diffractionEdge, circleVectorU);                                                                                                                                                                                //再求一个与前面所求向量和劈边向量都正交的向量,该向量也在圆所在的平面上
            //圆与三角面的交点
            Point crossPointOfFace0AndCircle1 = GetCrossPointOfCircleWithTer(diffractionEdge.AdjacentTriangles[0].SwitchToSpaceFace(), circleCenterPoint1, circleRadius1, circleVectorU, circleVectorV, diffractionEdge.AdjacentTriangles[0].GetPointsOutOfTheLine(diffractionEdge)[0]); //圆与三角面1一侧的交点
            Point crossPointOfFace1AndCircle1 = GetCrossPointOfCircleWithTer(diffractionEdge.AdjacentTriangles[1].SwitchToSpaceFace(), circleCenterPoint1, circleRadius1, circleVectorU, circleVectorV, diffractionEdge.AdjacentTriangles[1].GetPointsOutOfTheLine(diffractionEdge)[0]); //圆与三角面2一侧的交点

            if (crossPointOfFace0AndCircle1 == null || crossPointOfFace1AndCircle1 == null)
            {
                LogFileManager.ObjLog.debug("求圆盘与绕射面的交点时有错");
                return(new List <List <Triangle> >());
            }
            SpectVector          circlePointVector;//从大的圆盘的圆心指向小的圆盘的圆心
            CirclarTruncatedCone circlarTrimcatedCone;

            if (distanceToDiffractionPoint1 > distanceToDiffractionPoint2)
            {
                circlePointVector = new SpectVector(circleCenterPoint2, circleCenterPoint1).GetNormalizationVector();
                SetUnitVectorVnCirclePlane(ref circleVectorU, ref circleVectorV, circleCenterPoint1, crossPointOfFace0AndCircle1, crossPointOfFace1AndCircle1, circlePointVector, angleOfTwoTers);
                circlarTrimcatedCone = new CirclarTruncatedCone(circleCenterPoint2, circleRadius2, circleCenterPoint1, circleRadius1);
            }
            else
            {
                circlePointVector = new SpectVector(circleCenterPoint1, circleCenterPoint2).GetNormalizationVector();
                SetUnitVectorVnCirclePlane(ref circleVectorU, ref circleVectorV, circleCenterPoint1, crossPointOfFace0AndCircle1, crossPointOfFace1AndCircle1, circlePointVector, angleOfTwoTers);
                circlarTrimcatedCone = new CirclarTruncatedCone(circleCenterPoint1, circleRadius1, circleCenterPoint2, circleRadius2);
            }
            return(circlarTrimcatedCone.GetConeSurfaceDivisionTriangles(divisionNumber, 360 - angleOfTwoTers, circleVectorU, circleVectorV));
        }
Exemple #2
0
        /// <summary>
        /// 求射线射到棱上后得到的绕射射线List
        /// </summary>
        public static List <RayInfo> GetDiffractionRays(Point originPoint, Point diffractionPoint, AdjacentEdge diffractionEdge, int numberOfRay)
        {
            if ((originPoint == null) || (diffractionPoint == null) || (diffractionEdge == null))
            {
                LogFileManager.ObjLog.debug("求绕射射线的方法中输入的参数有null");
                return(new List <RayInfo>());
            }
            double angleOfTwoTers = GetAngleOfTwoTers(diffractionEdge.AdjacentTriangles[0], diffractionEdge.AdjacentTriangles[1], diffractionEdge); //获得两个三角面的夹角

            if (angleOfTwoTers > 178)
            {
                //      LogFileManager.ObjLog.debug("输入的绕射面的 夹角大于178度");
                return(new List <RayInfo>());
            }
            else
            {
                RayInfo     inRay             = new RayInfo(originPoint, new SpectVector(originPoint, diffractionPoint));                                                                                                                                                                //从上一节点到绕射点重新构造一条入射线
                double      angleOfRayAndEdge = inRay.GetAngleOfTwoStraightLines(diffractionEdge.SwitchToRay());                                                                                                                                                                         //获取射线与劈边的夹角
                Point       circleCenterPoint = GetCircleCenterPoint(angleOfRayAndEdge, inRay, diffractionEdge, diffractionPoint);                                                                                                                                                       //在劈边上选一个与绕射射线同向且不是绕射点的点,一般选公共棱的某个顶点,当夹角为90度时,绕射射线为圆盘,圆心为绕射点
                double      circleRadius      = GetCircleRadius(angleOfRayAndEdge, diffractionPoint, circleCenterPoint, numberOfRay);                                                                                                                                                    //所作圆的半径
                SpectVector circleVectorU     = GetVectorInThePlaneOfCircle(diffractionEdge, circleCenterPoint);                                                                                                                                                                         //先求圆所在平面上的一个向量
                SpectVector circleVectorV     = GetQuadratureVectorInTheOfCircle(diffractionEdge, circleVectorU);                                                                                                                                                                        //再求一个与前面所求向量和劈边向量都正交的向量,该向量也在圆所在的平面上
                //圆与三角面的交点
                Point crossPointOfFace0AndCircle = GetCrossPointOfCircleWithTer(diffractionEdge.AdjacentTriangles[0].SwitchToSpaceFace(), diffractionPoint, circleRadius, circleVectorU, circleVectorV, diffractionEdge.AdjacentTriangles[0].GetPointsOutOfTheLine(diffractionEdge)[0]); //圆与三角面1一侧的交点
                Point crossPointOfFace1AndCircle = GetCrossPointOfCircleWithTer(diffractionEdge.AdjacentTriangles[1].SwitchToSpaceFace(), diffractionPoint, circleRadius, circleVectorU, circleVectorV, diffractionEdge.AdjacentTriangles[1].GetPointsOutOfTheLine(diffractionEdge)[0]); //圆与三角面2一侧的交点
                if (crossPointOfFace0AndCircle == null || crossPointOfFace1AndCircle == null)
                {
                    LogFileManager.ObjLog.debug("求圆盘与绕射面的交点时有错");
                    return(new List <RayInfo>());
                }
                SpectVector circlePointVector;
                if (circleCenterPoint.equal(diffractionPoint))
                {
                    circlePointVector = diffractionEdge.LineVector.GetNormalizationVector();
                }
                else
                {
                    circlePointVector = new SpectVector(diffractionPoint, circleCenterPoint).GetNormalizationVector();
                }
                SetUnitVectorVnCirclePlane(ref circleVectorU, ref circleVectorV, circleCenterPoint, crossPointOfFace0AndCircle, crossPointOfFace1AndCircle, circlePointVector, angleOfTwoTers);
                List <Point> circumPoints = GetcircumPointOfTheCircle(diffractionEdge, circleCenterPoint, circleRadius, circleVectorU, circleVectorV, 360 - angleOfTwoTers, numberOfRay); //以某个角度划分获得所设圆上的点的list
                //根据绕射点和所设圆上的点,就可以求出绕射射线
                List <RayInfo> diffrationRay = GetRayListOfDiffraction(diffractionPoint, circumPoints);                                                                                   //包含绕射射线的list
                return(diffrationRay);
            }
        }