網頁版幾何畫板開發筆記(二)

繼續 GeoPad. 數據結構

在GeoPad 中, 使用雙向鏈表作爲主數據結構, 關於選擇這一數據結構的主要考慮:
1. 雙向鏈表適合任意位置插入(主要是尾部添加), 任意位置刪除, 以及遍歷(雙向遍歷).
2. 雙向鏈表知足序列性, 知足對象建立順序的保持須要. app

除了雙向鏈表以外, 還有一些別的輔助用數據結構, 稍後筆記. 函數

對鏈表的通常性操做有: this

append_obj(obj): 將 obj 對象添加到鏈表末尾. 這個函數同時還更新一些別的數據
結構, 別的數據結構之後分析. 主要可認爲是append到雙向鏈表. 設計

delete_single_obj(obj): 刪除對象, 從鏈表中移除對該對象的引用. 當前這個函數可能處理
了多種事務, 能夠適當考慮分離(如 unlink_obj 分離出去). 對象

find_objs(filter): 遍歷全部幾何對象, 查找知足 filter 所給條件的全部對象. 至關於簡單的
遍歷雙向鏈表的狀況.
彷佛能夠實現相似的單個變體 find_one_obj(filter) 只找第一個知足條件的, 或最後一個?
遍歷的通常形式: for (var obj = this.head_obj; obj != null; obj = obj.next_obj) ...
反向的掃描爲: for (var obj = this.tail_obj; obj != null; obj = obj.prev_obj) ... 索引

 

======= 事務

除了使用雙向鏈表以外, 爲支持其它需求, 還有幾種輔助的數據結構: 開發

1. Object[] highlighted_objs. 用於支持跟蹤被高亮的對象. 構建對象上的點, 交點時, 須要
高亮一條線(圓)或兩條線(圓)等.
2. Object[] selected_objs. 用於支持跟蹤被選中的對象. 被選中的對象有順序性. 對
被選中的對象可能要有多種運算須要, 可能將來實現爲某種對象比較合適(? TODO)
 3. {} obj_by_id. 使用幾何對象 id 可快速查找到該對象的一個 map. 不須要遍歷鏈表.
  這個(索引)結構在 append_obj(), delete_single_obj() 中維護. io

另外, 在原來開發時爲支持建立新對象, 引入了 tmp_head, tmp_tail 臨時的對象概念, 如今
看起來這種引入不是很好, 它增長了複雜度, 代碼又有重複, 應該想辦法早點替代掉. (TODO)
(同時也就去掉了多餘的函數: append_to_tmp(), clear_tmp_objs() 等)

關於高亮(highlight)的函數:

1. highlight_objs(obj): 高亮指定的 obj(多是一個 array), 並取消原有對象的高亮.
  TODO: 也許加一個參數 keep_old, 不取消原有對象的高亮?

關於選擇(selection)的函數:

1. select_objs(obj, keep_old): 選中指定的 obj(多是一個 array), 並取消原有選中,
  根據 keep_old.
2. unselect_obj(obj): 取消指定對象的選中.
3. unselect_all(): 取消全部對象的選中. 
  TODO: 也許 unselect_obj(null) 能夠取代 unselect_all(), 以減小一個函數?

  對於 highlight 支持: 被高亮的對象, 還設置其 obj.highlight =true, 這樣對象在繪製
的時候知道本身是被高亮的.

  對於 selection支持: 被選中的對象, 設置其 obj.selected = true, 這樣對象在繪製等
操做的時候, 知道本身是被選中的.

  問題: 某些操做對這種狀態信息有特殊須要的可能嗎?

 

TODO: 因爲上述數據存在一致性問題, 設計一個 self_check() 函數進行檢查看起來是一個 不錯的主意.

相關文章
相關標籤/搜索