|
|
|
Нужен математик уже не могу
|
|||
|---|---|---|---|
|
#18+
Простая задача - найти точку пересечения двух прямых. Помню в школе решали и все ок получалось, но забыла формулы и весь алгоритм расчета. Нашла Inete вроде тот школьный метод. Но с ним чудеса, то вычисляет, то черти шо.. Вот метод Код: plaintext 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. Вот программа Код: plaintext 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. Для все ок Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Но все другие коор-ты не правильно вычисляются ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2007, 16:04 |
|
||
|
Нужен математик уже не могу
|
|||
|---|---|---|---|
|
#18+
помню в школе мы это дело решали дихотомией. зы. приведенное решение не читал. Мошт оно и лучше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2007, 17:33 |
|
||
|
Нужен математик уже не могу
|
|||
|---|---|---|---|
|
#18+
SATURN2 wrote: > Простая задача - найти точку пересечения двух прямых двумерных, трехмерных, отрезков, лучей, или бесконечных линий? -- We are all going to hell and I'm driving the bus Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2007, 17:34 |
|
||
|
Нужен математик уже не могу
|
|||
|---|---|---|---|
|
#18+
тьпу ты. А для простых прямых - не легче ли простую формулу вывести? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2007, 17:37 |
|
||
|
Нужен математик уже не могу
|
|||
|---|---|---|---|
|
#18+
Простой вопрос: зачем вы постоянно используете объект Double вместо примитива double? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2007, 17:38 |
|
||
|
Нужен математик уже не могу
|
|||
|---|---|---|---|
|
#18+
Ну, вот живой глюк Так все ОК Код: plaintext 1. А так в результате пересечения нет С(0,0) Код: plaintext Помогите, так не хочется в библиотеку идти. Чего-то методу не хватает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2007, 17:40 |
|
||
|
Нужен математик уже не могу
|
|||
|---|---|---|---|
|
#18+
ErV Простая задача - найти точку пересечения двух прямых двумерных, трехмерных, отрезков, лучей, или бесконечных линий? Двух отрезков в двумерном пространстве тот самый любительА для простых прямых - не легче ли простую формулу вывести? Что вы имеете в виду? Метод вверху и так прост. Софтверный проктологПростой вопрос: зачем вы постоянно используете объект Double вместо примитива double? Плохо знаю жаву ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2007, 17:48 |
|
||
|
Нужен математик уже не могу
|
|||
|---|---|---|---|
|
#18+
SATURN2 тот самый любительА для простых прямых - не легче ли простую формулу вывести? Что вы имеете в виду? Метод вверху и так прост. А вот на форуме жава у товарища expp возникла такая же простая мысль как и у меня. зы. опять же не читал "верхний метод". уж больно много понаписано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2007, 17:55 |
|
||
|
Нужен математик уже не могу
|
|||
|---|---|---|---|
|
#18+
Класно вам - вы умные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2007, 18:04 |
|
||
|
Нужен математик уже не могу
|
|||
|---|---|---|---|
|
#18+
Во всем этом меня смущает один момент Код: plaintext 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. 88. 89. 90. 91. a1, b1 и c1 при положении линии по-вертикали и совпадении одной координатой x со второй линией будут равны нулю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2007, 18:14 |
|
||
|
Нужен математик уже не могу
|
|||
|---|---|---|---|
|
#18+
Софтверный проктолог Во всем этом меня смущает один момент ... В том то ж и дело. Глючный метод. Но мне кажется, что в школе мы использовали что очень похожее (надо будет проверить). Кстати, а так все в порядке Line first = new Line(300, 100, 100, 100); Line second = new Line(100, 100, 100, 200); Метод приведенный тут преподовали по "вышке". Уже все забыла:( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2007, 18:31 |
|
||
|
Нужен математик уже не могу
|
|||
|---|---|---|---|
|
#18+
SATURN2 Кстати, а так все в порядке Line first = new Line(300, 100, 100, 100); Line second = new Line(100, 100, 100, 200); Это да, как и у вас. Сам метод решения я не проверял (а просто показал, что можно сделать по-другому и что вы не ошиблись в кодировании). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2007, 18:32 |
|
||
|
Нужен математик уже не могу
|
|||
|---|---|---|---|
|
#18+
А, вообще б не плохо б было сделать раздел "Алгоритмы расчета, математика, геометрия ..." ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2007, 18:50 |
|
||
|
Нужен математик уже не могу
|
|||
|---|---|---|---|
|
#18+
SATURN2А, вообще б не плохо б было сделать раздел "Алгоритмы расчета, математика, геометрия ..." И будете там вместе с десятком школьников задачки решать? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2007, 18:51 |
|
||
|
Нужен математик уже не могу
|
|||
|---|---|---|---|
|
#18+
SATURN2 wrote: > Двух отрезков в двумерном пространстве "Код вверху" я ковырять не буду, так как мне влом восстанавливать алгоритм по чужому коду. Можно решить задачу как систему уравнений. (не тестил, опечатки могут быть) Пусть p1start - начало первого отрезка, p1end - конец p2start - начало второго p2end - конец, тогда v1 = p1end-p1start v2 = p2end-p2start тогда ищется точки I, для которой справедливо: I = p1star + v1*t1 = p2start +v2*t2, где t1 и t2 скаляры в диапазоне от 0 до 1. А теперь разворачиваем уравнение: p1start +v1*t1 = p2start +v2*t2 v1*t1 - v2*t2 = p2start - p1start; Поскольку аргументы двухкомпонентные, разворачиваем: v1.x*t1 - v2.x*t2 = p2start.x - p1start.x; v1.y*t1 - v2.y*t2 = p2start.y - p1start.y; ищем t1 и t2: t1 = (p2start.y - p1start.y + v2.y*t2)/v1.y t2 = (v1.x*t1 - p2start.x + p1.start.x)/v2.x Раскрываем скобки: t1 = p2start.y/v2.y - p1start.y/v2.y + v2.y*t2/v1.y t2 = v1.x*t1/v2.x - p2start.x/v2.x + p1.start.x/v2.x Подставляем t2 в t1: t1 = p2start.y/v2.y - p1start.y/v2.y + (v1.x*t1/v2.x - p2start.x/v2.x + p1start.x/v2.x)*v2.y/v1.y раскрываем скобки: t1 = p2start.y/v2.y - p1start.y/v2.y + v1.x*t1*v2.y/(v2.x*v1.y) - p2start.x*v2.y/(v2.x*v1.y) + p1start.x*v2.y/(v2.x*v1.y) либо наоборот, закрываем :) t1 = (p2start.y - p1start.y)/v2.y + ((v1.x*t1 - p2start.x + p1start.x)*v2.y/(v2.x*v1.y) вычисляем значение t1, находим точку пересечения по I = p1start + v1 * t1; если t1 < 0 или > 1, значит, функции не пересекаются. Да, и здесь могут быть опечатки, и деления на ноль при определенных входных данных :) Второй вариант: геометрически. отрезки p1start - p1end и p2start и p2end образуют треугольник p1start - I - p2start, если линии пересекауются. вводим вектор diff = p2start - p1start. используем те же вектора v1 = p1end - p1start и v2 = p2end - p1start далее. обозначаем dot как дот.продукт (т.е. скалярное произведение, если оно по-русски так называется - dot(v1, v2) = v1.x*v2.y + v1.y*v2.y) далее: 1) Если dot(v1, diff) <= 0 и dot(v2,diff) >= 0, отрезки не пересекаются. 2) Если не жалко нормализовывать вектора (normalize(v1) = v1/length(v1), то можно добавить проверки: 2.1) если dot(normalize(v1), normalize(diff)) < 0 и dot(normalize(v2), normalize(diff)) < 0, то лучи исходящие из p1start и p2start, пересекаются, если dot(normalize(v1), normalize(diff)) > dot(normalize(v2), normalize(diff)) 2.2) если dot(normalize(v1), normalize(diff)) > 0 и dot(normalize(v2), normalize(diff)) > 0, то лучи исходящие из p1start и p2start, пересекаются, если dot(normalize(v1), normalize(diff)) < dot(normalize(v2), normalize(diff)) далее. После прохождения проверок имеем "треугольник" с основанием diff и боковыми сторонами, образованными лучами v1 и v2 и точкой их пересечение. Из вектора diff можно получить перпендикуляр к основанию, повернув вектор на 90градусов (называем его difft, где difft.x = -diff.y и difft.y = diff.x). Нафига это надо? А фишка в том, что получаем новую координатную систему, где diff - это ось x, а difft - ось y, и в новой координатной системе задача проще - так как обе точки будут иметь одинаковые y-координаты. (y-координаты в новой системе вычисляются через pnew = dot(normalize(difft), p) , x - вычисляются через pnew = dot(normalize(diff), p) После перевода в новую систему имеем задачу с ограничениями типа: pnew1start.y = pnew2start.y = 0 pnew1start.x = 0 Inew.x = vnew1.x*t1 = pnew2start.x + v2.x*t2 Inew.y = vnew1.y*t1 = vnew2.y*t2 Далее решаем математически. (потому что уже проще) ЗЫ. Да, и если сильно влом, то можно просто тупо взять маткад, вбить туда стартовые формулы и попросить его решить задачу символически для нужной переменной. -- We are all going to hell and I'm driving the bus Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2007, 19:01 |
|
||
|
Нужен математик уже не могу
|
|||
|---|---|---|---|
|
#18+
ErV wrote: > ... По-моему, я загнался... :-\ -- We are all going to hell and I'm driving the bus Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2007, 19:06 |
|
||
|
Нужен математик уже не могу
|
|||
|---|---|---|---|
|
#18+
Если у Вас до сих пор нет варианта корректно работающего для любых входных данных, то просто используйте следующие формулы. В Вашей нотации: На плоскости заданы два отрезка a и b, a - точками A1(A1x,A1y) и A2(A2x,A2y), а b - точками B1(B1x,B1y) и B2(B2x,B2y). const double EPS = 1.0D-16; double xdet, ydet; double det = (B1x - B2x) * (A2y - A1y) - (A1x - A2x) * (B2y - B1y); if(dabs(det) < EPS) printf("The two segments are either parallel or too close to being parallel\n"); else { xdet = (A1x*A2y - A1y*A2x) * (B1x - B2x) - (B1x*B2y - B1y*B2x) * (A1x - A2x); ydet = (B1x*B2y - B1y*B2x) * (A2y - A1y) - (A1x*A2y - A1y*A2x) * (B2y - B1y); printf("X - coordinate of the intersection is %d\n", xdet/det); printf("Y - coordinate of the intersection is %d\n", ydet/det); } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2007, 21:54 |
|
||
|
Нужен математик уже не могу
|
|||
|---|---|---|---|
|
#18+
Сходу, не проверяя никаких исходников... Задача имеет 3 варианта ответа: 1) Бесконечное количество решений (прямые совпадают) 2) Пустое множество решений (прямые параллельны) 3) Единственное решение (точка). Поиск необходимо осуществлять имеенно в этом порядке. Т.е. параллельность образующих векторов, векторное произведение и т.п. нужно вычислить перед тем как искать пункт (3). Всего! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2007, 22:05 |
|
||
|
Нужен математик уже не могу
|
|||
|---|---|---|---|
|
#18+
Короче, решение: стартовая система уравнений: p1x + v1x*t1 = p2x+v2x*t2 p1y+v1y*t1 = p2y+v2y*t2 где p1x, p1y - начало первого отрезка p2x, p2y - начало второго отрезка v1x, v1y - конец первого отрезка минус начало первого отрезка v2x, v2y - конец второго отрезка минус начало второго отрезка точка пересечения находится как: vec2(p1x + v1x*t1, p1y+v1y*y1) или vec2(p2x + v2x*t2, p2y+v2y*y2) а t1 или t2 находится как: Код: plaintext 1. 2. 3. 4. 5. 6. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2007, 00:24 |
|
||
|
Нужен математик уже не могу
|
|||
|---|---|---|---|
|
#18+
ErV - p2x v2y + p1x v2y + (p2y - p1y) v2x t1 = -------------------------------------, v1y v2x - v1x v2y - p2x v1y + p1x v1y + (p2y - p1y) v1x t2 = ------------------------------------- v1y v2x - v1x v2y Усе. Молодец 5 баллов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2007, 15:36 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=34956422&tid=1345689]: |
0ms |
get settings: |
4ms |
get forum list: |
8ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
156ms |
get topic data: |
6ms |
get forum data: |
1ms |
get page messages: |
30ms |
get tp. blocked users: |
1ms |
| others: | 190ms |
| total: | 400ms |

| 0 / 0 |
