Re: Нарисовать table
От: B0FEE664  
Дата: 07.07.23 16:18
Оценка:
Здравствуйте, Marty, Вы писали:

M>Есть таблица, в смысле — структура данных — таблица. Типа HTMLной. Есть rowspan/colspan у её ячеек. У текста в ячейках есть выравнивание — лево/право/по центру/по ширине. Ширина колонок не задаётся (auto), или задаётся в процентах от общего поля вывода. В ячейках лежат абзацы списком.

M>Есть ширина канваса для рисования. Есть возможность вычислить реальную длину выводимой строки в юнитах канваса.
M>Вопрос: где бы стыбрить/подсмотреть реализацию рисования такой таблицы? Или даже не реализацию, а просто мудрые мысли, как такую таблицу нарисовать? Ну, под рисованием я конечно же понимаю прежде всего вычисление размеров и положений отображаемых блоков с учетом их содержимого

Я лет двадцать назад писал такое и хочу сказать, что в общем виде на больших таблицах (> 1 000 000 000 строк) при нефиксированной ширине (или высоте) ячейки за приемлемое время подсчитать положение не получится.

Смотрите: раз у вас в ячейке многострочный текст, то его высота зависит от ширины ячейки в предположении, что слова переносятся, а не обрезаются.
Допустим
— у нас всего три колонки с фиксированными размерами (по ширине)
— в первой колонке выравнивание по центру по вертикали
— первая колонка — это одна ячейка
— в таблице миллиард строк


------------------------
| | |2a |
| |------|----|
| |aaaa | |
| |bbbbb | |
| |ccc | |
| this |------|----|
| |x |aaa |
| | |bbb |
| |------|----|
........................
| |------|----|
| | |aa |
| | cc|aaa |
------------------------

Тогда, если высота строки не фиксированная, то, чтобы найти центр по вертикали для первого столбца, придётся подсчитать общую высоту таблицы, а для этого придётся подсчитать высоту для каждой ячейки, но из-за слияния по вертикали этого не достаточно: ещё придётся расчитывать высоту исходя из взаимного расположения ячеек, так, например, если объединить первую и вторую ячейку во втором столбце и вторую и третью ячейки в третьем столбце, то общая высота изменится:

------------------------
| |aaaa | а |
| |bbbbb |----|
| |ccc |aaa |
| this |------|bbb |
| |x | |
| |------|----|
........................
| |------|----|
| | |aa |
| | cc|aaa |
------------------------

Задача усложняется, если для текста используются разные шрифты
Задача усложняется, если ширина колонки должна подбираться автоматически

В результате, если количество ячеек обозримо, то задача решается в три-четыре прохода:
1) расчёт ширины для каждой колонки
2) расчёт минимальной высоты для каждой ячейки
3) расчёт координат (с вертикальными размерами) для каждой ячейки
4) отрисовка видимых ячеек с заданным выравниванием текста.

Алгоритма, который не рассчитывает всю таблицу целиком, а только видимую её часть для строк с автоматическим (исходя из текста) расчётом высоты строк я придумать не смог. Основная проблема — это скроллирование по вертикали.
И каждый день — без права на ошибку...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.