예제 #1
0
        // ******************************************************************
        private Limit FindLimits(Point pt, ParallelLoopState state, Limit limit)
        {
            double x = pt.X;
            double y = pt.Y;

            // Top
            if (y >= limit.Q2Top.Y)
            {
                if (y == limit.Q2Top.Y)                 // Special
                {
                    if (y == limit.Q1Top.Y)
                    {
                        if (x < limit.Q2Top.X)
                        {
                            limit.Q2Top.X = x;
                        }
                        else if (x > limit.Q1Top.X)
                        {
                            limit.Q1Top.X = x;
                        }
                    }
                    else
                    {
                        if (x < limit.Q2Top.X)
                        {
                            limit.Q1Top.X = limit.Q2Top.X;
                            limit.Q1Top.Y = limit.Q2Top.Y;

                            limit.Q2Top.X = x;
                        }
                        else if (x > limit.Q1Top.X)
                        {
                            limit.Q1Top.X = x;
                            limit.Q1Top.Y = y;
                        }
                    }
                }
                else
                {
                    limit.Q2Top.X = x;
                    limit.Q2Top.Y = y;
                }
            }

            // Bottom
            if (y <= limit.Q3Bottom.Y)
            {
                if (y == limit.Q3Bottom.Y)                 // Special
                {
                    if (y == limit.Q4Bottom.Y)
                    {
                        if (x < limit.Q3Bottom.X)
                        {
                            limit.Q3Bottom.X = x;
                        }
                        else if (x > limit.Q4Bottom.X)
                        {
                            limit.Q4Bottom.X = x;
                        }
                    }
                    else
                    {
                        if (x < limit.Q3Bottom.X)
                        {
                            limit.Q4Bottom.X = limit.Q3Bottom.X;
                            limit.Q4Bottom.Y = limit.Q3Bottom.Y;

                            limit.Q3Bottom.X = x;
                        }
                        else if (x > limit.Q3Bottom.X)
                        {
                            limit.Q4Bottom.X = x;
                            limit.Q4Bottom.Y = y;
                        }
                    }
                }
                else
                {
                    limit.Q3Bottom.X = x;
                    limit.Q3Bottom.Y = y;
                }
            }

            // Right
            if (x >= limit.Q4Right.X)
            {
                if (x == limit.Q4Right.X)                 // Special
                {
                    if (x == limit.Q1Right.X)
                    {
                        if (y < limit.Q4Right.Y)
                        {
                            limit.Q4Right.Y = y;
                        }
                        else if (y > limit.Q1Right.Y)
                        {
                            limit.Q1Right.Y = y;
                        }
                    }
                    else
                    {
                        if (y < limit.Q4Right.Y)
                        {
                            limit.Q1Right.X = limit.Q4Right.X;
                            limit.Q1Right.Y = limit.Q4Right.Y;

                            limit.Q4Right.Y = y;
                        }
                        else if (y > limit.Q1Right.Y)
                        {
                            limit.Q1Right.X = x;
                            limit.Q1Right.Y = y;
                        }
                    }
                }
                else
                {
                    limit.Q4Right.X = x;
                    limit.Q4Right.Y = y;
                }
            }

            // Left
            if (x <= limit.Q3Left.X)
            {
                if (x == limit.Q3Left.X)                 // Special
                {
                    if (x == limit.Q2Left.X)
                    {
                        if (y < limit.Q3Left.Y)
                        {
                            limit.Q3Left.Y = y;
                        }
                        else if (y > limit.Q2Left.Y)
                        {
                            limit.Q2Left.Y = y;
                        }
                    }
                    else
                    {
                        if (y < limit.Q3Left.Y)
                        {
                            limit.Q2Left.X = limit.Q3Left.X;
                            limit.Q2Left.Y = limit.Q3Left.Y;

                            limit.Q3Left.Y = y;
                        }
                        else if (y > limit.Q2Left.Y)
                        {
                            limit.Q2Left.X = x;
                            limit.Q2Left.Y = y;
                        }
                    }
                }
                else
                {
                    limit.Q3Left.X = x;
                    limit.Q3Left.Y = y;
                }
            }

            if (limit.Q2Left.X != limit.Q3Left.X)
            {
                limit.Q2Left.X = limit.Q3Left.X;
                limit.Q2Left.Y = limit.Q3Left.Y;
            }

            if (limit.Q1Right.X != limit.Q4Right.X)
            {
                limit.Q1Right.X = limit.Q4Right.X;
                limit.Q1Right.Y = limit.Q4Right.Y;
            }

            if (limit.Q1Top.Y != limit.Q2Top.Y)
            {
                limit.Q1Top.X = limit.Q2Top.X;
                limit.Q1Top.Y = limit.Q2Top.Y;
            }

            if (limit.Q4Bottom.Y != limit.Q3Bottom.Y)
            {
                limit.Q4Bottom.X = limit.Q3Bottom.X;
                limit.Q4Bottom.Y = limit.Q3Bottom.Y;
            }

            return(limit);
        }
예제 #2
0
        private void AggregateLimits(Limit limit)
        {
            lock (_findLimitFinalLock)
            {
                if (limit.Q1Right.X >= _limit.Q1Right.X)
                {
                    if (limit.Q1Right.X == _limit.Q1Right.X)
                    {
                        if (limit.Q1Right.Y > _limit.Q1Right.Y)
                        {
                            _limit.Q1Right = limit.Q1Right;
                        }
                    }
                    else
                    {
                        _limit.Q1Right = limit.Q1Right;
                    }
                }

                if (limit.Q4Right.X > _limit.Q4Right.X)
                {
                    if (limit.Q4Right.X == _limit.Q4Right.X)
                    {
                        if (limit.Q4Right.Y < _limit.Q4Right.Y)
                        {
                            _limit.Q4Right = limit.Q4Right;
                        }
                    }
                    else
                    {
                        _limit.Q4Right = limit.Q4Right;
                    }
                }

                if (limit.Q2Left.X < _limit.Q2Left.X)
                {
                    if (limit.Q2Left.X == _limit.Q2Left.X)
                    {
                        if (limit.Q2Left.Y > _limit.Q2Left.Y)
                        {
                            _limit.Q2Left = limit.Q2Left;
                        }
                    }
                    else
                    {
                        _limit.Q2Left = limit.Q2Left;
                    }
                }

                if (limit.Q3Left.X < _limit.Q3Left.X)
                {
                    if (limit.Q3Left.X == _limit.Q3Left.X)
                    {
                        if (limit.Q3Left.Y > _limit.Q3Left.Y)
                        {
                            _limit.Q3Left = limit.Q3Left;
                        }
                    }
                    else
                    {
                        _limit.Q3Left = limit.Q3Left;
                    }
                }

                if (limit.Q1Top.Y > _limit.Q1Top.Y)
                {
                    if (limit.Q1Top.Y == _limit.Q1Top.Y)
                    {
                        if (limit.Q1Top.X > _limit.Q1Top.X)
                        {
                            _limit.Q1Top = limit.Q1Top;
                        }
                    }
                    else
                    {
                        _limit.Q1Top = limit.Q1Top;
                    }
                }

                if (limit.Q2Top.Y > _limit.Q2Top.Y)
                {
                    if (limit.Q2Top.Y == _limit.Q2Top.Y)
                    {
                        if (limit.Q2Top.X < _limit.Q2Top.X)
                        {
                            _limit.Q2Top = limit.Q2Top;
                        }
                    }
                    else
                    {
                        _limit.Q2Top = limit.Q2Top;
                    }
                }

                if (limit.Q3Bottom.Y < _limit.Q3Bottom.Y)
                {
                    if (limit.Q3Bottom.Y == _limit.Q3Bottom.Y)
                    {
                        if (limit.Q3Bottom.X < _limit.Q3Bottom.X)
                        {
                            _limit.Q3Bottom = limit.Q3Bottom;
                        }
                    }
                    else
                    {
                        _limit.Q3Bottom = limit.Q3Bottom;
                    }
                }

                if (limit.Q4Bottom.Y < _limit.Q4Bottom.Y)
                {
                    if (limit.Q4Bottom.Y == _limit.Q4Bottom.Y)
                    {
                        if (limit.Q4Bottom.X > _limit.Q4Bottom.X)
                        {
                            _limit.Q4Bottom = limit.Q4Bottom;
                        }
                    }
                    else
                    {
                        _limit.Q4Bottom = limit.Q4Bottom;
                    }
                }
            }
        }
예제 #3
0
        // ******************************************************************
        private Limit FindLimits(IReadOnlyList <Point> listOfPoint, int start, int offset, Limit limit)
        {
            for (int index = start; index < listOfPoint.Count; index += offset)
            {
                Point pt = listOfPoint[index];

                double x = pt.X;
                double y = pt.Y;

                // Top
                if (y >= limit.Q2Top.Y)
                {
                    if (y == limit.Q2Top.Y)                     // Special
                    {
                        if (y == limit.Q1Top.Y)
                        {
                            if (x < limit.Q2Top.X)
                            {
                                limit.Q2Top.X = x;
                            }
                            else if (x > limit.Q1Top.X)
                            {
                                limit.Q1Top.X = x;
                            }
                        }
                        else
                        {
                            if (x < limit.Q2Top.X)
                            {
                                limit.Q1Top.X = limit.Q2Top.X;
                                limit.Q1Top.Y = limit.Q2Top.Y;

                                limit.Q2Top.X = x;
                            }
                            else if (x > limit.Q1Top.X)
                            {
                                limit.Q1Top.X = x;
                                limit.Q1Top.Y = y;
                            }
                        }
                    }
                    else
                    {
                        limit.Q2Top.X = x;
                        limit.Q2Top.Y = y;
                    }
                }

                // Bottom
                if (y <= limit.Q3Bottom.Y)
                {
                    if (y == limit.Q3Bottom.Y)                     // Special
                    {
                        if (y == limit.Q4Bottom.Y)
                        {
                            if (x < limit.Q3Bottom.X)
                            {
                                limit.Q3Bottom.X = x;
                            }
                            else if (x > limit.Q4Bottom.X)
                            {
                                limit.Q4Bottom.X = x;
                            }
                        }
                        else
                        {
                            if (x < limit.Q3Bottom.X)
                            {
                                limit.Q4Bottom.X = limit.Q3Bottom.X;
                                limit.Q4Bottom.Y = limit.Q3Bottom.Y;

                                limit.Q3Bottom.X = x;
                            }
                            else if (x > limit.Q3Bottom.X)
                            {
                                limit.Q4Bottom.X = x;
                                limit.Q4Bottom.Y = y;
                            }
                        }
                    }
                    else
                    {
                        limit.Q3Bottom.X = x;
                        limit.Q3Bottom.Y = y;
                    }
                }

                // Right
                if (x >= limit.Q4Right.X)
                {
                    if (x == limit.Q4Right.X)                     // Special
                    {
                        if (x == limit.Q1Right.X)
                        {
                            if (y < limit.Q4Right.Y)
                            {
                                limit.Q4Right.Y = y;
                            }
                            else if (y > limit.Q1Right.Y)
                            {
                                limit.Q1Right.Y = y;
                            }
                        }
                        else
                        {
                            if (y < limit.Q4Right.Y)
                            {
                                limit.Q1Right.X = limit.Q4Right.X;
                                limit.Q1Right.Y = limit.Q4Right.Y;

                                limit.Q4Right.Y = y;
                            }
                            else if (y > limit.Q1Right.Y)
                            {
                                limit.Q1Right.X = x;
                                limit.Q1Right.Y = y;
                            }
                        }
                    }
                    else
                    {
                        limit.Q4Right.X = x;
                        limit.Q4Right.Y = y;
                    }
                }

                // Left
                if (x <= limit.Q3Left.X)
                {
                    if (x == limit.Q3Left.X)                     // Special
                    {
                        if (x == limit.Q2Left.X)
                        {
                            if (y < limit.Q3Left.Y)
                            {
                                limit.Q3Left.Y = y;
                            }
                            else if (y > limit.Q2Left.Y)
                            {
                                limit.Q2Left.Y = y;
                            }
                        }
                        else
                        {
                            if (y < limit.Q3Left.Y)
                            {
                                limit.Q2Left.X = limit.Q3Left.X;
                                limit.Q2Left.Y = limit.Q3Left.Y;

                                limit.Q3Left.Y = y;
                            }
                            else if (y > limit.Q2Left.Y)
                            {
                                limit.Q2Left.X = x;
                                limit.Q2Left.Y = y;
                            }
                        }
                    }
                    else
                    {
                        limit.Q3Left.X = x;
                        limit.Q3Left.Y = y;
                    }
                }

                if (limit.Q2Left.X != limit.Q3Left.X)
                {
                    limit.Q2Left.X = limit.Q3Left.X;
                    limit.Q2Left.Y = limit.Q3Left.Y;
                }

                if (limit.Q1Right.X != limit.Q4Right.X)
                {
                    limit.Q1Right.X = limit.Q4Right.X;
                    limit.Q1Right.Y = limit.Q4Right.Y;
                }

                if (limit.Q1Top.Y != limit.Q2Top.Y)
                {
                    limit.Q1Top.X = limit.Q2Top.X;
                    limit.Q1Top.Y = limit.Q2Top.Y;
                }

                if (limit.Q4Bottom.Y != limit.Q3Bottom.Y)
                {
                    limit.Q4Bottom.X = limit.Q3Bottom.X;
                    limit.Q4Bottom.Y = limit.Q3Bottom.Y;
                }
            }

            return(limit);
        }