Example #1
0
        public static VLCoverType IsPlanarCover(List <Line> lines, VLTriangle triangle, Line line)
        {
            //根据线段相交判断
            var p0        = line.GetEndPoint(0);
            var p1        = line.GetEndPoint(1);
            var intersect = lines.FirstOrDefault(c => c.VL_IsIntersect(line));

            if (intersect != null)
            {
                return(VLCoverType.Intersect);
            }
            //线段包含判断
            List <XYZ> points = new List <XYZ>();

            points.Add(line.GetEndPoint(0));
            points.Add(line.GetEndPoint(1));
            foreach (var point in points)
            {
                if (triangle.PlanarContains(point))
                {
                    return(VLCoverType.Contain);
                }
            }
            return(VLCoverType.Disjoint);
        }
Example #2
0
        /// <summary>
        /// 三角形包含点
        /// </summary>
        public static bool Contains(this VLTriangle triangle, XYZ point)
        {
            var    vB        = triangle.B - triangle.A;
            var    vC        = triangle.C - triangle.A;
            var    vP        = point - triangle.A;
            double dotB_B    = vB.DotProduct(vB);
            double dotB_C    = vB.DotProduct(vC);
            double dotB_P    = vB.DotProduct(vP);
            double dotC_C    = vC.DotProduct(vC);
            double dotC_P    = vC.DotProduct(vP);
            double inverDeno = 1 / (dotB_B * dotC_C - dotB_C * dotB_C);
            double u         = (dotC_C * dotB_P - dotB_C * dotC_P) * inverDeno;

            if (Math.Abs(u) < ConstraintsOfBeamAlignToFloor.XYZTolerance)
            {
                u = 0;
            }
            if (u < 0 || u > 1)
            {
                return(false);
            }
            double v = (dotB_B * dotC_P - dotB_C * dotB_P) * inverDeno;

            if (Math.Abs(v) < ConstraintsOfBeamAlignToFloor.XYZTolerance)
            {
                v = 0;
            }
            if (v < 0 || v > 1)
            {
                return(false);
            }
            return(u + v <= 1 + VLGeometryHelper.XYZTolerance);
        }
Example #3
0
        /// <summary>
        /// 一面两点 求线面交点
        /// t = (vT·pT - vT·pL)/(vT·vL)
        /// p = pL + t*vL
        /// </summary>
        public static XYZ GetIntersection(VLTriangle triangle, XYZ point, XYZ direction)
        {
            var pT = triangle.A;
            var vT = (triangle.B - triangle.A).CrossProduct(triangle.C - triangle.A);
            var t  = (vT.DotProduct(pT) - vT.DotProduct(point)) / vT.DotProduct(direction);
            var p  = point + t * direction;

            return(p);
        }
Example #4
0
 public VLTriangle(VLTriangle triangle, XYZ offset)
 {
     A = triangle.A + offset;
     B = triangle.B + offset;
     C = triangle.C + offset;
 }