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); }
/// <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; }
public PointDate toPointDate() { PointDate lOut = new PointDate(); lOut.polygonId = polygonId; lOut.point = point; return lOut; }
public candidatePointInfo(PointDate pPointDate) { polygonId = pPointDate.polygonId; point = pPointDate.point; scores = 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; }
/// <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}; }