Exemplo n.º 1
0
            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);
            }
Exemplo n.º 2
0
            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);
            }