示例#1
0
        public void DetectRelation()
        {
            CIntersection pintersec = new CGeometry.CIntersection(_CEdge1, _CEdge2);

            pintersec.DetectIntersection();

            switch (pintersec.enumIntersectionType)
            {
            case CEnumIntersectionType.NoNo:
                DetectPtEdge();
                break;

            case CEnumIntersectionType.FrFr:
                this.pEnumDisMode = CEnumDisMode.FrFr;
                this.cptEdgeDis   = new CGeometry.CptEdgeDis
                                        (0, 0, _CEdge1.FrCpt, _CEdge1, _CEdge2.FrCpt, _CEdge2, false);
                break;

            case CEnumIntersectionType.FrIn:
                this.pEnumDisMode = CEnumDisMode.FrIn;
                this.cptEdgeDis   = _CEdge1.FrCpt.DistanceTo(_CEdge2, false, _CEdge1);
                break;

            case CEnumIntersectionType.FrTo:
                this.pEnumDisMode = CEnumDisMode.FrTo;
                this.cptEdgeDis   = new CGeometry.CptEdgeDis
                                        (0, 1, _CEdge1.FrCpt, _CEdge1, _CEdge2.ToCpt, _CEdge2, false);
                break;

            case CEnumIntersectionType.InFr:
                this.pEnumDisMode = CEnumDisMode.InFr;
                this.cptEdgeDis   = _CEdge2.FrCpt.DistanceTo(_CEdge1, false, _CEdge2);
                break;

            case CEnumIntersectionType.InIn:
                this.pEnumDisMode = CEnumDisMode.InIn;
                this.cptEdgeDis   = pintersec.IntersectCpt.DistanceTo(_CEdge2);
                break;

            case CEnumIntersectionType.InTo:
                this.pEnumDisMode = CEnumDisMode.InTo;
                this.cptEdgeDis   = _CEdge2.ToCpt.DistanceTo(_CEdge1, false, _CEdge2);
                break;

            case CEnumIntersectionType.ToFr:
                this.pEnumDisMode = CEnumDisMode.ToFr;
                this.cptEdgeDis   = new CGeometry.CptEdgeDis
                                        (0, 0, _CEdge1.ToCpt, _CEdge1, _CEdge2.FrCpt, _CEdge2, false);
                break;

            case CEnumIntersectionType.ToIn:
                this.pEnumDisMode = CEnumDisMode.ToIn;
                this.cptEdgeDis   = _CEdge1.ToCpt.DistanceTo(_CEdge2, false, _CEdge1);
                break;

            case CEnumIntersectionType.ToTo:
                this.pEnumDisMode = CEnumDisMode.ToTo;
                this.cptEdgeDis   = new CGeometry.CptEdgeDis
                                        (0, 1, _CEdge1.ToCpt, _CEdge1, _CEdge2.ToCpt, _CEdge2, false);
                break;

            case CEnumIntersectionType.Overlap:
                DetectPtEdge();
                this.pEnumDisMode = CEnumDisMode.Overlap;
                break;

            default:
                break;
            }
        }
示例#2
0
        private void DetectPtEdge()
        {
            CEdge cedge1 = _CEdge1;
            CEdge cedge2 = _CEdge2;

            var FrcptEdgeDis = cedge1.FrCpt.DistanceTo(cedge2, false, cedge1);
            var TocptEdgeDis = cedge1.ToCpt.DistanceTo(cedge2, false, cedge1);
            var EdgeFrcptDis = cedge2.FrCpt.DistanceTo(cedge1, false, cedge2);
            var EdgeTocptDis = cedge2.ToCpt.DistanceTo(cedge1, false, cedge2);

            if (FrcptEdgeDis.dblDis <= TocptEdgeDis.dblDis &&
                FrcptEdgeDis.dblDis <= EdgeFrcptDis.dblDis &&
                FrcptEdgeDis.dblDis <= EdgeTocptDis.dblDis)
            {
                this.cptEdgeDis = FrcptEdgeDis;

                if (FrcptEdgeDis.t == 0)
                {
                    this.pEnumDisMode = CEnumDisMode.FrFr;
                }
                else if (FrcptEdgeDis.t == 1)
                {
                    this.pEnumDisMode = CEnumDisMode.FrTo;
                }
                else
                {
                    this.pEnumDisMode = CEnumDisMode.FrIn;
                }
            }
            else if (
                TocptEdgeDis.dblDis <= FrcptEdgeDis.dblDis &&
                TocptEdgeDis.dblDis <= EdgeFrcptDis.dblDis &&
                TocptEdgeDis.dblDis <= EdgeTocptDis.dblDis)
            {
                this.cptEdgeDis = TocptEdgeDis;
                if (TocptEdgeDis.t == 0)
                {
                    this.pEnumDisMode = CEnumDisMode.ToFr;
                }
                else if (TocptEdgeDis.t == 1)
                {
                    this.pEnumDisMode = CEnumDisMode.ToTo;
                }
                else
                {
                    this.pEnumDisMode = CEnumDisMode.ToIn;
                }
            }
            else if (
                EdgeFrcptDis.dblDis <= FrcptEdgeDis.dblDis &&
                EdgeFrcptDis.dblDis <= TocptEdgeDis.dblDis &&
                EdgeFrcptDis.dblDis <= EdgeTocptDis.dblDis)
            {
                this.cptEdgeDis = EdgeFrcptDis;
                if (EdgeFrcptDis.t == 0)
                {
                    this.pEnumDisMode = CEnumDisMode.FrFr;
                }
                else if (EdgeFrcptDis.t == 1)
                {
                    this.pEnumDisMode = CEnumDisMode.ToFr;
                }
                else
                {
                    this.pEnumDisMode = CEnumDisMode.InFr;
                }
            }
            else if (
                EdgeTocptDis.dblDis <= FrcptEdgeDis.dblDis &&
                EdgeTocptDis.dblDis <= TocptEdgeDis.dblDis &&
                EdgeTocptDis.dblDis <= EdgeFrcptDis.dblDis)
            {
                this.cptEdgeDis = EdgeTocptDis;
                if (EdgeTocptDis.t == 0)
                {
                    this.pEnumDisMode = CEnumDisMode.FrTo;
                }
                else if (EdgeTocptDis.t == 1)
                {
                    this.pEnumDisMode = CEnumDisMode.ToTo;
                }
                else
                {
                    this.pEnumDisMode = CEnumDisMode.InTo;
                }
            }
            else
            {
                throw new ArgumentException("impossible case!");
            }
        }