Advertisement
Guest User

Untitled

a guest
May 1st, 2016
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.37 KB | None | 0 0
  1. // начало ломаной
  2. Output.Add(Input[0]);
  3. // координаты текущего отрезка
  4. Point begin Input[0];
  5. Point end = Input[1];
  6. // угол для сверки
  7. double angle = Angle.Find(begin, end);
  8. // обработка всех точек
  9. for (int i = 2; i < Input.Length - 1; i++) {
  10. double currentAngle = Angle.Find(begin, Input[i]);
  11. if (Angle.Distance(currentAngle, angle) < Angle.Max) {
  12. end = Input[i];
  13. //TODO: можно также высчитывать угол по всем точкам отрезка
  14. } else {
  15. // сохраняем старый отрезок
  16. Output.Add(end);
  17. // создаём новый отрезок
  18. begin = Input[i];
  19. end = Input [++i];
  20. angle = Angle.Find(begin, end);
  21. }
  22. }
  23. Output.Add(end);
  24.  
  25. bool crooked = false;
  26. for (int i = 1; i < Output.Length; i++) {
  27. // функция вычисления расстояния между точками и эпсилон для длины отрезков
  28. if (Point.Distance(Output[i], Output[i - 1]) < Point.Eps) {
  29. crooked = true;
  30. break;
  31. }
  32. }
  33.  
  34. double Angle::Distance (double a, double b) {
  35. if (a > 270 && b < 90) {// 3*Pi/2, Pi/2, если используете радианы
  36. b += 360; // 2 *Pi
  37. } else if (b > 270 && a < 90) {
  38. a += 360;
  39. }
  40. return abs(a - b);
  41. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement