为了实现自适应显示,我的思路:
在绘制当前节点时,如果发现重叠,就将父节点的树枝长度加一,然后清除整个图像,重新绘制。
为此,需要在原来的二叉树节点中增加一个树枝长度属性
内部图像类的设计很关键,它提供随机写入能力,并且需要返回写入是否成功(如果写入点已经不为空,则返回假)
绘制单个节点的接口设计:
它尝试绘制节点,以及它的左右树枝
并在遇到重叠的情况下调整该节点的父节点的树枝长度(每次增加1),并停止绘制
如果没有遇到重叠,就子节点递归,完成整个绘制
整个过程动态调整树枝长度,每次调整后重叠的情况都比之前好一点,最终所有节点都不会重叠
我的收获:
类的接口设计很关键,好的接口设计可以提高代码内部重用性,使代码易写易懂
比如本设计中的绘制节点这个接口的设计
bool Tree::draw_node(Img& img, int w, int h, Node* n, Node* father)
返回bool是由于该方法在绘制时遇到重叠要立即停止递归
int w, int h是绘制节点的位置
Node* n 是当前需要绘制的节点
Node* father 是为了方便修改父节点的长度而考虑加入的
代码长度200行