| Boolean: ReLoad https://boolean.forumenko.com/ |
|
| Контейнер данных https://boolean.forumenko.com/topic10.html |
Страница 1 из 1 |
| Автор: | impersonalis [ 10-02, 23:56 ] |
| Заголовок сообщения: | Контейнер данных |
Рано или поздно появляется необходимость во всевозможных структурах хранения объектов – списках и т.п. Все те немногочисленные статьи, что до сегодняшнего момента мне попадались. Сводились к подключению сторонних библиотек. На мой же взгляд решение гораздо проще и всё это время, буквально лежало перед глазами. Адекватный перегружаемый интерфейс класса-контейнера с иерархической структурой предоставляет нам трёхмерная квази-модель полностью построенная на пивотах. Сама работа с контейнером сводится в таком случае к командам: :arrow: Для организации структуры и работы с ней -
FreeEntity EntityHandle EntityParent entity,parent[,global] GetParent ( entity ) CountChildren ( entity ) GetChild (entity,index)
EntityName$ ( entity ) Object Handle Рассмотрим пример создания древа. Пример весьма «корявый», но богатый на применение различных функций работы со структурой. Код: Graphics3D 800,600,32 SetBuffer BackBuffer() Local root=CreatePivot() NameEntity root,"директор" For i=1 To 3 NameEntity CreatePivot(root),"руководитель"+Str(i) For j=1 To Rand(1,4) NameEntity CreatePivot(FindChild(root,"руководитель"+Str(i))),"работник"+Str(j) Next Next Local a Local b Print EntityName(root) For i=1 To CountChildren(root) a=GetChild(root,i) Print "->"+EntityName(a) For j=1 To CountChildren(a) b=GetChild(a,j) Print "-->"+EntityName(b) Next Next WaitKey() End Как дополнительные внутренние поля элементов структуры вы можете использовать иные типовые характеристики Entity: позицию по 3 координатам (3 х 4 байта) и углы вращения (3 переменных со значением от -180 до 180 [весьма проблематичным может оказаться автоматическая коррекция границы]). Их удобно использовать для предварительной идентификации листка древа. Саму же работу со структурой легко реализовать при помощи рекурсивных функций, что упростит работу с ними и повысит наглядность. Вот как это может выглядеть: Код: Graphics3D 800,600,32 SetBuffer BackBuffer() Local a Local b Local root=CreatePivot() NameEntity root,"директор" PositionEntity root,24*5,24*5*500,0 For i=1 To 3 a=CreatePivot(root) NameEntity a,"руководитель"+Str(i) PositionEntity a,24*Rnd(6,8),24*Rnd(6,8)*200,0 For j=1 To Rand(1,4) b=CreatePivot(a) NameEntity b,"работник"+Str(j) PositionEntity b,24*Rnd(8,12),24*Rnd(8,12)*100,0 Next Next Function W(r%,prefix$) Print prefix$+EntityName(r) Print prefix$+" часов работы "+EntityX(r)+"; зарплата "+EntityY(r) Print "" prefix$=prefix$+"-" For i=1 To CountChildren(r) W(GetChild(r,i),prefix) Next End Function W(root,"") WaitKey() End Для хранения структур вы можете воспользоваться командами Object\Handle – сохраняя\загружая квази-адрес структуры в поле имени пивота. Минусов подобной организации я нашёл только два:
:arrow: Дополнительные расходы на память. Что есть – то есть. Однако подумайте об удобстве, которое вы на мой взгляд получаете. |
|
| Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
| Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |
|