Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // начало ломаной
- Output.Add(Input[0]);
- // координаты текущего отрезка
- Point begin Input[0];
- Point end = Input[1];
- // угол для сверки
- double angle = Angle.Find(begin, end);
- // обработка всех точек
- for (int i = 2; i < Input.Length - 1; i++) {
- double currentAngle = Angle.Find(begin, Input[i]);
- if (Angle.Distance(currentAngle, angle) < Angle.Max) {
- end = Input[i];
- //TODO: можно также высчитывать угол по всем точкам отрезка
- } else {
- // сохраняем старый отрезок
- Output.Add(end);
- // создаём новый отрезок
- begin = Input[i];
- end = Input [++i];
- angle = Angle.Find(begin, end);
- }
- }
- Output.Add(end);
- bool crooked = false;
- for (int i = 1; i < Output.Length; i++) {
- // функция вычисления расстояния между точками и эпсилон для длины отрезков
- if (Point.Distance(Output[i], Output[i - 1]) < Point.Eps) {
- crooked = true;
- break;
- }
- }
- double Angle::Distance (double a, double b) {
- if (a > 270 && b < 90) {// 3*Pi/2, Pi/2, если используете радианы
- b += 360; // 2 *Pi
- } else if (b > 270 && a < 90) {
- a += 360;
- }
- return abs(a - b);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement