// ****************************************************************** 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); }
private void AggregateLimits(Limit limit) { bool isLockTaken = false; try { _spinLockLimit.Enter(ref isLockTaken); 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; } } } finally { if (isLockTaken) { _spinLockLimit.Exit(); } } }
// ****************************************************************** 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; } if (x > limit.Q1Top.X) { limit.Q1Top.X = x; } } else { limit.Q1Top.Y = y; if (x >= limit.Q2Top.X) { limit.Q1Top.X = x; } else { limit.Q1Top.X = limit.Q2Top.X; limit.Q2Top.X = x; } } } 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.Q4Bottom.X) { limit.Q4Bottom.X = x; } if (x < limit.Q3Bottom.X) { limit.Q3Bottom.X = x; } } else { limit.Q4Bottom.Y = y; if (x >= limit.Q3Bottom.X) { limit.Q4Bottom.X = x; } else { limit.Q4Bottom.X = limit.Q3Bottom.X; limit.Q3Bottom.X = x; } } } 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.Q1Right.Y) { limit.Q1Right.Y = y; } if (y < limit.Q4Right.Y) { limit.Q4Right.Y = y; } } else { limit.Q1Right.X = x; if (y >= limit.Q4Right.Y) { limit.Q1Right.Y = y; } else { limit.Q1Right.Y = limit.Q4Right.Y; limit.Q4Right.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; } if (y > limit.Q2Left.Y) { limit.Q2Left.Y = y; } } else { limit.Q2Left.X = x; if (y >= limit.Q3Left.Y) { limit.Q2Left.Y = y; } else { limit.Q2Left.Y = limit.Q3Left.Y; limit.Q3Left.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); }