Вот что-то, что первое, что пришло на ум кажется, что могло бы работать:
Создают словарь с двойным ключом и список значений rectangle+boolean, как это:
Dictionary< Дважды, List< KeyValuePair< Прямоугольник, булевская переменная>>> прямоугольники;
Для каждого прямоугольника в Вашем наборе, найдите соответствующий список для x0 и значений x1, и добавьте прямоугольник к тому списку с булевым значением истинных для x0 и лжи для x1. Таким образом, у Вас теперь есть полный список всех x-координат, которые каждый прямоугольник или вводит (верный) или листы (ложь) направление X
Захват все ключи из того словаря (все отличные x-координаты), отсортируйте их и цикл через них в порядке, удостоверьтесь, что можно достигнуть и текущее x-значение и следующее также (Вам нужны они оба). Это дает Вам, отдельные полосы прямоугольников
Пример, 5 прямоугольников, тянут друг на друге, от до e:
aaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbb
aaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbb
aaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbb
aaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbb
aaaaaaaadddddddddddddddddddddddddddddbbbbbb
aaaaaaaadddddddddddddddddddddddddddddbbbbbb
ddddddddddddddddddddddddddddd
ddddddddddddddddddddddddddddd
ddddddddddddddeeeeeeeeeeeeeeeeee
ddddddddddddddeeeeeeeeeeeeeeeeee
ddddddddddddddeeeeeeeeeeeeeeeeee
ccccccccddddddddddddddeeeeeeeeeeeeeeeeee
ccccccccddddddddddddddeeeeeeeeeeeeeeeeee
cccccccccccc eeeeeeeeeeeeeeeeee
cccccccccccc eeeeeeeeeeeeeeeeee
cccccccccccc
cccccccccccc
Вот список x-координат:
v v v v v v v v v
|aaaaaaa|aa|aaaa | bbbbbbbbbb|bb|bbb
|aaaaaaa|aa|aaaa | bbbbbbbbbb|bb|bbb
|aaaaaaa|aa|aaaa | bbbbbbbbbb|bb|bbb
|aaaaaaa|aa|aaaa | bbbbbbbbbb|bb|bbb
|aaaaaaaddd|dddddddddd|ddddddddddddddbb|bbb
|aaaaaaaddd|dddddddddd|ddddddddddddddbb|bbb
| ddd|dddddddddd|dddddddddddddd |
| ddd|dddddddddd|dddddddddddddd |
| ddd|ddddddddddeeeeeeeeeeeeeeeeee
| ddd|ddddddddddeeeeeeeeeeeeeeeeee
| ddd|ddddddddddeeeeeeeeeeeeeeeeee
ccccccccddd|ddddddddddeeeeeeeeeeeeeeeeee
ccccccccddd|ddddddddddeeeeeeeeeeeeeeeeee
cccccccccccc eeeeeeeeeeeeeeeeee
cccccccccccc eeeeeeeeeeeeeeeeee
cccccccccccc
cccccccccccc
список был бы (где каждому v просто дают координату, запускающуюся в 0 и повышающуюся):
0: +a, +c
1: +d
2: -c
3: -a
4: +e
5: +b
6: -d
7: -e
8: -b
Каждая полоса таким образом была бы (прямоугольники, отсортированные сверху донизу):
0-1: a, c
1-2: a, d, c
2-3: a, d
3-4: d
4-5: d, e
5-6: b, d, e
6-7: b, e
7-8: b
для каждой полосы, перекрытие было бы:
0-1: none
1-2: a/d, d/c
2-3: a/d
3-4: none
4-5: d/e
5-6: b/d, d/e
6-7: none
7-8: none
я предположил бы, что изменение вида + вводит/оставляет, алгоритм для проверки главной нижней части был бы выполнимым также:
Для полосы 1-2 выше, Вы выполните итерации как это:
0. empty set, zero sum
1. enter a, add a to set (1 rectangle in set)
2. enter d, add d to set (>1 rectangles in set = overlap, store this y-coordinate)
3. leave a, remove a from set (now back from >1 rectangles in set, add to sum: y - stored_y
4. enter c, add c to set (>1 rectangles in set = overlap, store this y-coordinate)
5. leave d, remove d from set (now back from >1 rectangles in set, add to sum: y - stored_y)
6. multiply sum with width of strip to get overlapping areas
Вы не должны были бы на самом деле поддерживать фактический набор здесь также, просто количество прямоугольников, которые Вы внутри, каждый раз, когда это идет от 1 до 2, хранит y, и каждый раз, когда это идет от 2 вниз к 1, вычислите, текущий y - сохранил y, и суммируйте это различие.
Hope это было понятно, и как я сказал, это первое, что пришло на ум, не протестировано всегда.
Check the sys.columns
system catalog view:
SELECT *
FROM sys.columns
WHERE is_computed = 1
This gives you all computed columns in this database.
If you want those for just a single table, use this query:
SELECT *
FROM sys.columns
WHERE is_computed = 1
AND object_id = OBJECT_ID('YourTableName')
This works on SQL Server 2005 and up.
UPDATE: There's even a sys.computed_columns
system catalog view which also contains the definition (expression) of the computed column - just in case that might be needed some time.
SELECT *
FROM sys.computed_columns
WHERE object_id = OBJECT_ID('YourTableName')