|
Вопрос про расчет
|
|||
---|---|---|---|
#18+
Здравствуйте! Есть такая задачка про координатную плоскость. Даны 2 отрезка с конкретными точками на плоскости XY. Нужно найти точку пересечения этих двух отрезков. Решение (то есть формула) нахождения точки пересечения есть. Возьмем пример: Начало первого отрезка: x1: 270, y1: 80 Конец первого отрезка: x2: 400, y2: 50 Начало второго отрезка: x3: 300, y3: 50 Конец второго отрезка: x4: 500, y4: 50 Видим, что второй отрезок горизонтальный и очевидно, что заданным данным есть пересечение в точке X = 400 и Y = 50. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2020, 20:10 |
|
Вопрос про расчет
|
|||
---|---|---|---|
#18+
Вначале решал в excel-ом файле и по формуле (используется частный случай, когда два отрезка не вертикальны) получаем, что отрезки пересекаются. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2020, 20:11 |
|
Вопрос про расчет
|
|||
---|---|---|---|
#18+
Далее пишу консольное приложение на C# C# Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2020, 20:15 |
|
Вопрос про расчет
|
|||
---|---|---|---|
#18+
Учитывая, что в C# иcпользуется тип данных double. Почему так? По логике же есть пересечение отрезков. Как будто на C# неправильно считает. Как следовало правильно написать для таких случаев? Или тут надо выделять отдельный частный случай, когда один из отрезков не вертикальный, а второй - горизонтальный? Или искать другую формулу для пересечения отрезков? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2020, 20:17 |
|
Вопрос про расчет
|
|||
---|---|---|---|
#18+
Тип double нельзя сравнивать на равно, можно на почти равно, т.е. Код: c# 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2020, 20:31 |
|
Вопрос про расчет
|
|||
---|---|---|---|
#18+
потому, что надо было вычислительную математику учить ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2020, 21:06 |
|
Вопрос про расчет
|
|||
---|---|---|---|
#18+
Dima T Тип double нельзя сравнивать на равно, можно на почти равно, т.е. Код: c# 1.
Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
то теперь в консоле пишет что пересекаются отрезки. Можно еще добавить для оператора <= Код: c# 1. 2. 3. 4. 5. 6. 7. 8.
Как вариант можно выполнить округление до заданного знака (Math.Round(double, int32) ) и уже после этого выполнить сравнение. В коде много подобных выражений сравнении и каждая корректировка может быть ошибочной. Чтобы их не трогать, то возможно сделать как в виде перегрузки оператора <(double left, double right) ? Понятно что в структуре PointStruct не сделаешь так, за исключением если первый входной параметр в перегрузке оператора будет как PointStruct , но тут входные параметры получаются такие как PointStruct.X и PointStruct.Y . ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2020, 23:01 |
|
Вопрос про расчет
|
|||
---|---|---|---|
#18+
ferzmikk Dima T Тип double нельзя сравнивать на равно, можно на почти равно, т.е. Код: c# 1.
Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Только такой следующий вариант рабочий, с использованием округлении с заданным количеством дробных разрядов в возвращаемом значении, но без использования epsilon: Код: c# 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2020, 12:47 |
|
|
start [/forum/topic.php?fid=20&fpage=11&tid=1398577]: |
0ms |
get settings: |
12ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
75ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
2ms |
others: | 235ms |
total: | 418ms |
0 / 0 |