public void Does_ReturnNull_When_TemplateValueIsNull()
        {
            //Arrange
            var startDateTime = new DateTimeOffset(new DateTime(2019, 04, 01, 12, 00, 00), TimeSpan.FromHours(2));
            var endDateTime   = new DateTimeOffset(new DateTime(2019, 04, 01, 18, 00, 00), TimeSpan.FromHours(-7));

            var points = new PointDate()
            {
                DateTimeStart = startDateTime,
                DateTimeEnd   = endDateTime
            };

            string templateValue = null;

            //Act
            var result = DateTimeTransformer.CalculateToRightDateTime(points, templateValue);

            //Assert
            Assert.IsFalse(result.HasValue);
        }
        public void Does_Return_1DayBefore_StartDateTime_When_TemplateValue_first_With_MinusTime()
        {
            //Arrange
            var startDateTime = new DateTimeOffset(new DateTime(2019, 04, 01, 12, 00, 00), TimeSpan.FromHours(2));
            var endDateTime   = new DateTimeOffset(new DateTime(2019, 04, 01, 18, 00, 00), TimeSpan.FromHours(-7));

            var points = new PointDate()
            {
                DateTimeStart = startDateTime,
                DateTimeEnd   = endDateTime
            };

            var templateValue = "first-1440";

            //Act
            var result = DateTimeTransformer.CalculateToRightDateTime(points, templateValue);

            //Assert
            Assert.AreEqual("2019/03/31 12:00:00", result.Value.ToString("yyyy/MM/dd HH:mm:ss"));
        }
        public void Does_Return_1DaysAfter_EndDateTime_When_TemplateValue_last_With_PlusTime_with_leading_zero()
        {
            //Arrange
            var startDateTime = new DateTimeOffset(new DateTime(2019, 04, 01, 12, 00, 00), TimeSpan.FromHours(2));
            var endDateTime   = new DateTimeOffset(new DateTime(2019, 04, 01, 18, 00, 00), TimeSpan.FromHours(-7));

            var points = new PointDate()
            {
                DateTimeStart = startDateTime,
                DateTimeEnd   = endDateTime
            };

            var templateValue = "last+001440";

            //Act
            var result = DateTimeTransformer.CalculateToRightDateTime(points, templateValue);

            //Assert
            Assert.AreEqual("2019/04/02 18:00:00", result.Value.ToString("yyyy/MM/dd HH:mm:ss"));
        }
        public void Does_ReturnDateTimeEnd_When_TemplateValue_last()
        {
            //Arrange
            var startDateTime = new DateTimeOffset(new DateTime(2019, 04, 01, 12, 00, 00), TimeSpan.FromHours(2));
            var endDateTime   = new DateTimeOffset(new DateTime(2019, 04, 01, 18, 00, 00), TimeSpan.FromHours(-7));

            var points = new PointDate()
            {
                DateTimeStart = startDateTime,
                DateTimeEnd   = endDateTime
            };

            var templateValue = "last";

            //Act
            var result = DateTimeTransformer.CalculateToRightDateTime(points, templateValue);

            //Assert
            Assert.AreEqual(endDateTime, result.Value);
        }
Example #5
0
        /// <summary>
        /// 获取下一个点,无则返回null
        /// </summary>
        /// <returns></returns>
        public PointDate moveNext()
        {
            PointDate   lOut = null;
            if(mNowNode!=null)
            {
                lOut = new PointDate();
                lOut.polygonId = polygonIndex;
                lOut.point = mNowNode.Value;
                LinkedListNode<zz2DPoint> lNextNode = mNowNode.Next;

                //考虑到没有 (凹/凸)点列表的情况
                while (lNextNode == null && polygonIndex < polygons.Count-1)
                {
                    lNextNode = polygons[++polygonIndex].First;
                }
                mNowNode = lNextNode;
            }
            mNowPointDate = lOut;
            return lOut;
        }
Example #6
0
 public PointDate toPointDate()
 {
     PointDate lOut = new PointDate();
     lOut.polygonId = polygonId;
     lOut.point = point;
     return lOut;
 }
Example #7
0
 public candidatePointInfo(PointDate pPointDate)
 {
     polygonId = pPointDate.polygonId;
     point = pPointDate.point;
     scores = 0;
 }
Example #8
0
    candidatePointInfo getCandidateConcavePoint(out PointDate lPointDataToSolve)
    {
        var lCandidatePointInfo = new candidatePointInfo();

        PointIterator lConcaveIterator = new PointIterator();
        lConcaveIterator.addPolygon(mOutSidePoint.getConcavePoints());
        foreach (var lHole in mHolePoint)
        {
            lConcaveIterator.addPolygon(lHole.getConcavePoints());
        }

        lPointDataToSolve = lConcaveIterator.moveNext();
        //if(lPointDataToSolve==null)
        //{
        //    //无凹点,返回自身所有的点
        //    return new zzSimplyPolygon[] { mOutSidePoint };
        //}

        zz2DPoint lPointToSolve = lPointDataToSolve.point;

        //遍历凹点
        while (lConcaveIterator.moveNext() != null)
        {
            zz2DPoint lNowPoint = lConcaveIterator.nowPointDate.point;
            if (canLink(lPointToSolve, lNowPoint))
            {

                var lNewCandidatePointInfo = new candidatePointInfo(lConcaveIterator.nowPointDate);
                lNewCandidatePointInfo.scoresUp();

                //对结果评分
                if (isConcaveCleared(lPointToSolve, lNowPoint))
                {
                    lNewCandidatePointInfo.scoresUp(candidatePointInfo.scoresOfClearSelfConcave);
                }

                if (isConcaveCleared(lNowPoint, lPointToSolve))
                {
                    lNewCandidatePointInfo.scoresUp(candidatePointInfo.scoresOfClearOtherConcave);
                }

                //优于前次结果,则替代之前的
                if (lNewCandidatePointInfo.scores > lCandidatePointInfo.scores)
                    lCandidatePointInfo = lNewCandidatePointInfo;

                //连接获得高分时,则不再遍历
                if (lCandidatePointInfo.scores
                    > candidatePointInfo.scoresOfClearSelfConcave + candidatePointInfo.scoresOfClearOtherConcave)
                    break;

            }
        }
        return lCandidatePointInfo;
    }
Example #9
0
    /// <summary>
    /// 凸剖凹边形,输出连接的两个点的信息
    /// </summary>
    /// <param name="pConcave"></param>
    /// <param name="Point1Data"></param>
    /// <param name="Point2Data"></param>
    /// <returns></returns>
    static zz2DConcave[] cut(zz2DConcave pConcave, PointDate Point1Data, PointDate Point2Data)
    {
        //if(Point1Data.polygonId!=0)
        //{
        //    Debug.LogError("Point1Data.polygonId!=0");
        //    return null;
        //}

        zz2DConcave lOut0 = new zz2DConcave();

        zzSimplyPolygon[] lCutedPolygon = zzSimplyPolygon.cut(Point1Data.point, Point2Data.point);
        var lHoles = pConcave.getHole();

        if (lCutedPolygon.Length==1)
        {
            if (Point1Data.polygonId == Point2Data.polygonId)
            {
                Debug.LogError("lCutedPolygon.Length==1 && Point1Data.polygonId == Point2Data.polygonId ");
            }
            //两点都在不同的孔上
            if (Point1Data.polygonId != 0 && Point2Data.polygonId != 0)
            {
                lOut0.setShape(pConcave.getOutSidePolygon());
                lOut0.addHole(lCutedPolygon[0]);
                //return new zz2DConcave[] { lOut0 };

            }
            else//一个点在孔上
            {
                lOut0.setShape(lCutedPolygon[0]);
                //for (int i = 0; i < lHoles.Length; ++i)
                //{
                //    if (Point1Data.polygonId != (i + 1) && Point2Data.polygonId != (i + 1))
                //        lOut0.addHole(lHoles[i]);
                //}

            }
            for (int i = 0; i < lHoles.Length; ++i)
            {
                int lHolePolygonID = getPolygonIDFromHoleIndex(i);
                if (Point1Data.polygonId != lHolePolygonID
                    && Point2Data.polygonId != lHolePolygonID)
                    lOut0.addHole(lHoles[i]);
            }

            return new zz2DConcave[] { lOut0 };
        }

        zz2DConcave lOut1 = new zz2DConcave();

        //两个点在相同的孔上
        if (Point1Data.polygonId != 0 && Point2Data.polygonId != 0)
        {
            lOut0.setShape(pConcave.mOutSidePoint);
            if (lCutedPolygon[0].bounds.Contains(lCutedPolygon[1].bounds))
            {
                lOut0.addHole(lCutedPolygon[0]);
                lOut1.setShape(lCutedPolygon[1]);
            }
            else if (lCutedPolygon[1].bounds.Contains(lCutedPolygon[0].bounds))
            {
                lOut0.addHole(lCutedPolygon[1]);
                lOut1.setShape(lCutedPolygon[0]);
            }
            else
                Debug.LogError("两个点在相同的孔上:bounds not contains another");
        }
        else
        {
            lOut0.setShape(lCutedPolygon[0]);
            lOut1.setShape(lCutedPolygon[1]);
        }

        int lHoleIndex = 0;
        foreach (var lHole in lHoles)
        {
            int lPolygonID = getPolygonIDFromHoleIndex(lHoleIndex);
            if (Point1Data.polygonId == lPolygonID || Point2Data.polygonId == lPolygonID)
                continue;

            int lIsInside = lCutedPolygon[0].isInside(lHole.getAllPoints().First.Value.position);
            if(lIsInside>0)
                lOut0.addHole(lHole);
            else if (lIsInside < 0)
                lOut1.addHole(lHole);
            else
                Debug.LogError("isInside == 0");

            ++lHoleIndex;
        }

        return new zz2DConcave[]{lOut0,lOut1};
    }