Vì vậy, khi bạn đặt "kích thước" của bố cục cây, tất cả những gì bạn đang làm là đặt giá trị bố cục cây sẽ nội suy các giá trị x và y thành. Vì vậy, không có lý do gì bạn không thể tính toán chiều rộng hoặc chiều cao bạn muốn và thay đổi nó trong bố trí trên mỗi cuộc gọi cập nhật.
tôi sao chép ví dụ bạn đã cung cấp cho một jsFiddle và thêm dòng sau vào chức năng cập nhật:
// compute the new height
var levelWidth = [1];
var childCount = function(level, n) {
if(n.children && n.children.length > 0) {
if(levelWidth.length <= level + 1) levelWidth.push(0);
levelWidth[level+1] += n.children.length;
n.children.forEach(function(d) {
childCount(level + 1, d);
});
}
};
childCount(0, root);
var newHeight = d3.max(levelWidth) * 20; // 20 pixels per line
tree = tree.size([newHeight, w]);
Lưu ý rằng đây là một tính khá thô và không chịu ảnh hưởng ở nơi trẻ em được WRT cha mẹ hoặc bất cứ điều gì - nhưng bạn có được ý tưởng.
Đối với thao tác các giá trị x của các nút, đơn giản nhất có thể đơn giản là sửa đổi các nút sau khi bố cục đã làm điều đó. Trong thực tế, bạn có thể thấy rằng đây đã được thực hiện trong ví dụ với các tọa độ y:
// Normalize for fixed-depth.
nodes.forEach(function(d) { d.y = d.depth * 180; });
Ông thực hiện điều này để ngay cả khi trẻ em được ẩn một mức độ nhất định của các nút nằm ở vị trí tương đương y, nếu không nếu bạn sụp đổ tất cả các trẻ em các cấp còn lại sẽ kéo dài để mất toàn bộ chiều rộng (hãy thử bình luận rằng dòng ra và xem những gì sẽ xảy ra khi bạn chuyển đổi toàn bộ các cấp vô hình).
Để đi xuống trên, tôi nghĩ bạn có thể dễ dàng lật qua mọi nơi bạn thấy x và y (và x0 và y0). Đừng quên làm tương tự với phép chiếu chéo để đảm bảo các đường thẳng của bạn cũng bị lật.
Bạn đã tìm hiểu cách thực hiện? – mariosangiorgio