|
Очень сложная задача, выбрать отрезки
|
|||
---|---|---|---|
#18+
Есть таблица с черными участками (см рисунок), например black x1 y127915 Есть таблица с зелеными участками green x2y213468101314 Задача - найти красные участки. Те, которые входят в черные за исключением зеленых. Должно получится: red x3y3346710131415 Я пробовал сам решить задачу, через сортировку и выборку, пока не получилось. Смотрел геометрические типы в документации, есть lseg (отрезок), но нет такой операции как разности одного массива отрезков и массива других отрезков (как в нашем случае). ((( Как составить выборку? Задача практическая, не теоретическая. Заранее благодарю за ответы! -- Россия - отличная страна! ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2017, 03:41 |
|
Очень сложная задача, выбрать отрезки
|
|||
---|---|---|---|
#18+
PCContra, создаете массив из всех вершин (и черных и зеленых), сортируете его и сканируете последовательно. дальше просто отбираете те вершины, которые удовлетворяют условиям и формируете отрезки из них. наверняка есть способ получше, это первое что приходит в голову. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2017, 08:20 |
|
Очень сложная задача, выбрать отрезки
|
|||
---|---|---|---|
#18+
PCContra, Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2017, 11:46 |
|
Очень сложная задача, выбрать отрезки
|
|||
---|---|---|---|
#18+
PCContra, поэксперементировал с диапазонными типами данных: Код: sql 1. 2. 3. 4. 5. 6. 7.
--исключили из всех отрезков отрезки встречающие в green ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2017, 12:34 |
|
Очень сложная задача, выбрать отрезки
|
|||
---|---|---|---|
#18+
не очень оптимально и красиво, но смысл такой: CREATE OR REPLACE FUNCTION public.calc_red ( ) RETURNS TABLE ( x integer, y integer ) AS $body$ DECLARE black_x integer[100]; black_y integer[100]; red_x integer[100]; red_y integer[100]; green_x integer[100]; green_y integer[100]; r record; i integer; j integer; k integer; im integer; jm integer; km integer; BEGIN i=0; for r in SELECT 2 AS x, 7 AS y UNION SELECT 9 AS x, 15 AS y LOOP black_x[i]=r.x; black_y[i]=r.y; i=i+1; im=i; END LOOP; j=0; for r in SELECT 1 AS x, 3 AS y UNION SELECT 4 AS x, 6 AS y UNION SELECT 8 AS x, 10 AS y UNION SELECT 13 AS x, 14 AS y LOOP green_x[j]=r.x; green_y[j]=r.y; j=j+1; jm=j; END LOOP; i=0; while (i>=0) and (i<im) LOOP k=1; red_x[i]=black_x[i]; red_y[i]=black_y[i]; for j in 0..jm-1 LOOP if (red_x[i]>=green_x[j]) and (red_y[i]<=green_y[j])--черный внутри зеленого, удаляем then k=0; raise notice 'черный %..% внутри зеленого %..%, удаляем', red_x[i], red_y[i], green_x[i], green_y[i]; else if (red_x[i]>=green_x[j]) and (red_x[i]<=green_y[j]) --зеленый занимает левую часть черного, урезаем черный слева then red_x[i]=green_y[j]; raise notice 'зеленый % % занимает левую часть черного % %, урезаем черный слева', green_x[i], green_y[i], red_x[i], red_y[i]; else if (red_y[i]>=green_x[j]) and (red_y[i]<=green_y[j]) --зеленый занимает правую часть черного, урезаем черный справа then red_y[i]=green_x[j]; raise notice 'зеленый % % занимает правую часть черного % %, урезаем черный справа', green_x[i], green_y[i], red_x[i], red_y[i]; else if (red_x[i]<=green_x[j]) and (red_y[i]>=green_y[j]) then --зеленый внутри черного, делим черный пополам, левый оставляем, правый добавляем в конец черных raise notice 'зеленый % % внутри черного % %, делим черный пополам, левый оставляем, правый добавляем в конец черных', green_x[i], green_y[i], red_x[i], red_y[i]; im=im+1; black_x[im-1]=green_y[j]; black_y[im-1]=red_y[i]; red_y[i]=green_x[j]; end if; end if; end if; end if; END LOOP; if (red_x[i]<>red_y[i]) and (k=1) then x=red_x[i]; y=red_y[i]; return next; end if; i:=i+1; end loop; return; END; $body$ LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER COST 100 ROWS 1000; ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2017, 20:46 |
|
Очень сложная задача, выбрать отрезки
|
|||
---|---|---|---|
#18+
PCContra, если правильно понял задачу: Код: sql 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2017, 21:29 |
|
Очень сложная задача, выбрать отрезки
|
|||
---|---|---|---|
#18+
PCContra, перечитал. понял не правильно. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2017, 21:30 |
|
Очень сложная задача, выбрать отрезки
|
|||
---|---|---|---|
#18+
упс, не добавил подсветку Код: plsql 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. 92. 93. 94. 95. 96. 97. 98.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2017, 22:16 |
|
Очень сложная задача, выбрать отрезки
|
|||
---|---|---|---|
#18+
PCContra, как вариант Код: sql 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2017, 13:04 |
|
|
start [/forum/topic.php?fid=53&msg=39402774&tid=1996711]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
42ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
2ms |
others: | 344ms |
total: | 489ms |
0 / 0 |