private int CreateFlatEnds([NotNull] NeighboredSegmentsSubpart segmentsSubpartx, double rowDistance, [NotNull] Dictionary <FeaturePoint, SegmentInfo> flatEnds, [NotNull] ContinuationFinder continuationFinder, bool atStart) { var errorCount = 0; double sumLength = 0; SegmentProxyInfo first = null; foreach (SegmentProxyInfo info in GetSegmentProxies(segmentsSubpartx, continuationFinder, atStart)) { first = first ?? info; var segmentPartKey = new SegmentPart(info.SegmentProxy, 0, 1, complete: true); NeighboredSegmentsSubpart segmentsSubpart = info.Subpart; SegmentParts neighboredParts; segmentsSubpart.SegmentNeighbors.TryGetValue(segmentPartKey, out neighboredParts); var featurePointKey = new FeaturePoint( segmentsSubpart.BaseFeature, segmentsSubpart.TableIndex, segmentPartKey.PartIndex, segmentPartKey.SegmentIndex); SegmentInfo segmentInfo; if (!flatEnds.TryGetValue(featurePointKey, out segmentInfo)) { // TODO revise: neighboredParts can be null here, but SegmentInfo property is later expected to be NotNull segmentInfo = new SegmentInfo(neighboredParts); flatEnds.Add(featurePointKey, segmentInfo); } if (atStart) { segmentInfo.FlatStart = true; } else { segmentInfo.FlatEnd = true; } if (info != first) { errorCount += VerifyAngle(first, info, rowDistance, segmentsSubpart); } sumLength += info.SegmentProxy.Length; if (sumLength >= rowDistance) { break; } } return(errorCount); }
private int VerifyAngle([NotNull] SegmentProxyInfo first, [NotNull] SegmentProxyInfo compare, double lineWidth, [NotNull] SegmentsSubpart subpart) { if (ReportAngledEndError == null) { return(0); } double dir0; IPnt pnt0; double dir1; IPnt pnt1; if (first.SegmentProxy.SegmentIndex < compare.SegmentProxy.SegmentIndex) { dir0 = first.SegmentProxy.GetDirectionAt(0); pnt0 = first.SegmentProxy.GetPointAt(0); dir1 = compare.SegmentProxy.GetDirectionAt(0); pnt1 = compare.SegmentProxy.GetPointAt(0); } else { dir0 = first.SegmentProxy.GetDirectionAt(1); pnt0 = first.SegmentProxy.GetPointAt(1); dir1 = compare.SegmentProxy.GetDirectionAt(1); pnt1 = compare.SegmentProxy.GetPointAt(1); } // TODO revise length/angle calculation in case of intermittent segments double dx = pnt0.X - pnt1.X; double dy = pnt0.Y - pnt1.Y; double segmentLength = Math.Sqrt(dx * dx + dy * dy); return(HasInconsistentLineEnd(lineWidth, dir0, dir1, segmentLength) ? ReportAngledEndError(new AngleEndError(subpart, pnt1, pnt0)) : 0); }