コード例 #1
0
        private Tuple <Point, Point, double> FindInDeltaField(List <Point> xSeries, List <Point> ySeries, int lIndex)
        {
            List <Point> yLine = new List <Point>();
            double       d1    = xSeries[lIndex].X - _distance;
            double       d2    = xSeries[lIndex].X + _distance;

            for (int i = 0; i < ySeries.Count; ++i)
            {
                if (ySeries[i].X >= d1 && ySeries[i].X <= d2)
                {
                    yLine.Add(ySeries[i]);
                }
            }

            for (int i = 0; i < yLine.Count; ++i)
            {
                Point p1 = yLine[i];
                for (int j = i + 1; j < yLine.Count && (j - i) <= 7; ++j)
                {
                    Point  p2             = yLine[j];
                    double squareDistance = PointsDistances.SquareDistance(p1, p2);
                    if (squareDistance < _distance)
                    {
                        _distance = squareDistance;
                        _point1   = p1;
                        _point2   = p2;
                    }
                }
            }
            return(new Tuple <Point, Point, double>(_point1, _point2, _distance));
        }
コード例 #2
0
        public FindPairResult Find()
        {
            Point[][] l_u   = ConvexHull_LU(_points);
            Point[]   lower = l_u[0];
            Point[]   upper = l_u[1];
            int       i     = 0;
            int       j     = lower.Length - 1;

            List <PointPair> pairs = new List <PointPair>(lower.Length + upper.Length);

            while (i < upper.Length - 1 || j > 0)
            {
                pairs.Add(new PointPair(upper[i], lower[j]));

                if (i == upper.Length - 1)
                {
                    j--;
                }
                else if (j == 0)
                {
                    i += 1;
                }
                else if ((upper[i + 1].Y - upper[i].Y) * (lower[j].X - lower[j - 1].X) >
                         (lower[j].Y - lower[j - 1].Y) * (upper[i + 1].X - upper[i].X))
                {
                    i++;
                }
                else
                {
                    j--;
                }
            }

            double distance = PointsDistances.SquareDistance(pairs[0].Point1, pairs[0].Point2);
            Point  point1   = pairs[0].Point1;
            Point  point2   = pairs[0].Point2;

            for (int index = 1; index < pairs.Count; ++index)
            {
                var    pair = pairs[i];
                double d    = PointsDistances.SquareDistance(pair.Point1, pair.Point2);
                if (d > distance)
                {
                    distance = d;
                    point1   = pair.Point1;
                    point2   = pair.Point2;
                }
            }

            return(new FindPairResult(point1, point2));
        }
コード例 #3
0
        private void SearchClosestInLittleSequrnce(List <Point> xSeries)
        {
            double minDistance = double.MaxValue;

            _point1 = _point2 = default(Point);

            for (int i = 0; i < xSeries.Count - 1; ++i)
            {
                for (int j = i + 1; j < xSeries.Count; ++j)
                {
                    double distance = PointsDistances.SquareDistance(xSeries[i], xSeries[j]);
                    if (distance < minDistance)
                    {
                        minDistance = distance;
                        _point1     = xSeries[i];
                        _point2     = xSeries[j];
                    }
                }
            }

            _distance = minDistance;
        }
コード例 #4
0
 public FindPairResult(Point point1, Point point2) : this()
 {
     this.Point1   = point1;
     this.Point2   = point2;
     this.Distance = Math.Sqrt(PointsDistances.SquareDistance(point1, point2));
 }