マルチフォークツリーを描画するためのPythonツリーライブラリの使用法の概要

マルチフォークツリーを描画するためのPythonツリーライブラリの使用法の概要

Treeライブラリは、Python用のサードパーティライブラリです。このライブラリは、主にツリーの生成とツリーグラフィックの描画に使用されます。

1つは、Treeをインストールする

pip install Tree

Treeライブラリを使用するには、PILライブラリと連携して描画を行う必要があります。

2.公式ケース

PyPIのTreeライブラリによって提供されるデモを見てみましょう。PyPIアドレス:https://pypi.org/project/Tree/

# coding=utf-8
from Tree.core import Tree
from math import radians as rad
from PIL import Image


def main():
    branches = ((.5, rad(-30)), (.6, rad(30)), (.4, rad(60)))
    tree = Tree(pos=(0, 0, 0, -500), branches=branches)
    tree.grow(10)
    tree.move_in_rectangle()
    im = Image.new("RGB", tree.get_size(), (239, 239, 239))
    tree.draw_on(im, (85, 25, 0, 128, 53, 21), (0, 62, 21), 10)
    im.show()


if __name__ == '__main__':
    main()

演算結果:

コードを実行して三叉神経ツリーを生成し、PILを使用してツリーを画像として表示します。次に、Treeライブラリの使用法を紹介します。

三、ツリーライブラリ紹介

ツリーライブラリは、core.py、utils.py、draw.pyの3つの部分に分かれています。

ノードクラスノードおよび色変換関数は、utils.pyに実装されています。

グラフィックを描画するためのクラスDrawerは、draw.pyに実装されています。

core.pyには、ツリー状のツリーとブランチ生成関数が実装されています。

3つの部分は結合されています。使用時にutils.pyとdraw.pyのクラスと関数を直接呼び出す必要はなく、core.pyのTreeクラスを直接使用するだけです。

from Tree.core import Tree

ツリーライブラリでは、Python標準ライブラリmathとサードパーティライブラリPILが多くの場所で使用されています。それだけでなく、Treeライブラリを呼び出すときは、数学ライブラリとPILライブラリを使用してツリーの画像を生成する必要もあります。

数学ライブラリの使用については、https//blog.csdn.net/weixin_43790276/article/details/98476264を参照してください。

PILライブラリの使用については、https//blog.csdn.net/weixin_43790276/article/details/108478270を参照してください。

第四に、ツリーライブラリの使用

Treeクラスのオブジェクトをインスタンス化して、ツリーを生成します。ツリーを初期化するとき、pos、branchs、sigmaの3つのパラメーターがあります。

posは長さ4のタプル(リストも可能)で、ツリーの開始点と終了点の水平および垂直のピクセル座標(x0、y0、x1、y1)を表します。ソースコードは、に基づいてPythagoreanを使用します。これらの2つの座標。定理は木の長さを計算します(木が成長していないときは幹のみ)。始点と終点の間の位置関係が木の成長方向を決定します。これは、によって調整できます。座標の正と負の値。着信タプルの長さが4未満の場合、インデックスは範囲外で報告されます(十分なデータが見つかりません)。タプルの長さが4より大きい場合、最初の4つの値が取得されます。それ以上のデータは無効になります。

ブランチはリストまたはタプルです。リストにあるのと同じ数の値が、ツリーが成長するのと同じ数のブランチがあります。各ブランチのパラメーターもリストまたはタプルです。パラメーターには2つのデータが必要です。最初のデータは、親ブランチに対するブランチの長さの変化係数を表します(通常は1未満で、ブランチはトランクよりも短い)。 、2番目は相対ブランチを表します。親ブランチのオフセット角度、角度はラジアン単位です(デジタル角度は数学ライブラリのラジアンで変換できます)。ツリーを初期化するときに、ブランチの値が渡されない場合、デフォルトはNoneであるため、ソースコードでブランチを計算するときにエラーが報告されます。ソースコードで空のリストが渡されると、エラーが報告されます。 PILを使用してツリーを表示する場合は、展開できないため、ツリーを渡す必要があります。空のブランチパラメータ。

シグマはタプルです(リストも可能ですが、PEP仕様に準拠していないことを示すプロンプトが表示されます)タプルには2つの値があり、最初の値はブランチの長さを調整するために使用され、 2番目は、分岐の角度を調整するために使用されます(数学の円周率を乗算します)。sigmaパラメーターを使用して期待される効果を制御することは容易ではないため、デフォルト(0、0)を維持し、通常は値を渡さないでください。

grow(times = 1):ツリーの成長に使用されます。デフォルトでは、1回成長します。つまり、幹に基づいて1回成長し、最後は葉で、その他は枝です。デフォルトでは1回大きくなりますが、後でdraw_on()メソッドを呼び出すと、ゼロ除算エラーが発生するため、最小値を2回大きくする必要があり、値は2以上である必要があります。

age属性は、ツリーの年齢を表します。ageは、ツリーが成長した回数です()。

move_in_rectangle():ツリーの位置を移動し、ツリーの位置をキャンバスに適応させる(画像をキャンバスの中央に自動的に移動する)ために使用されます。これは、描画を支援する方法です。

get_size():ツリーのサイズを取得するために使用されます。返される結果は、ツリーの幅と高さ(width、height)をそれぞれ表すタプルです。

PILのnew()関数を使用して、3つのパラメーターを使用して描画用のキャンバスを作成します。最初のパラメータは、「RGB」(トゥルーカラー画像を表す赤、緑、青の3原色の略語)を使用して、画像のモードを示します。2番目のパラメーターは、キャンバスのサイズ(ピクセル単位で計算)を表します。これは、ツリーのサイズがトランクから成長した後に変更されるため、get_size()を使用して現在のツリーのサイズを動的に取得します。3番目のパラメーターはキャンバスの色を表し、デフォルト値は0で、黒いキャンバスは必要に応じて変更できます。

draw_on(canvas、stem_color、leaf_color、thickness、ages = None):ツリーの構造をキャンバスに描画するには、4つのパラメーターが必要です。

キャンバス、キャンバス。PILライブラリnew()を使用するキャンバスを渡します(他の描画ライブラリも使用できます)。

stem_colorは、幹の色と枝の色の変化の勾配を表します。タプルを渡します(RGBカラーは長さ3のタプルで表すことができます)。入力タプルの長さが3の場合、すべてのブランチは同じ色になり、グラデーションはありません。入力タプルの長さが6の場合。色のグラデーションは、ブランチの年齢に応じて実行されます(draw.pyの_get_color(age)ソースコードを参照)。タプルの長さが3ではなく6未満の場合、インデックスは次のように報告されます。範囲外です。長さが6より大きい場合、次のデータは無効になります。

leaf_color、葉の色。長さが3のタプルを渡します。長さが3未満の場合、パラメータ送信エラーが報告されます。長さが3を超える場合、次のデータは無効になります。ここでは、16進数の色を渡すこともできます。コード。

太さ、胴体の太さ。整数を渡すと、値が大きいほどトランクが太くなります。

基本的なメソッドとプロパティが導入されたので、簡単な例を見てみましょう。

# coding=utf-8
from Tree.core import Tree
from math import radians
from PIL import Image


pos = [0, 0, 0, -300]
branches = [[0.58, radians(-45)], [0.58, radians(45)]]
tree = Tree(pos=pos, branches=branches)
tree.grow(5)
print('tree age is: ', tree.age)
tree.move_in_rectangle()
image = Image.new("RGB", tree.get_size(), 0)
tree.draw_on(image, (80, 20, 10, 120, 60, 30), '#003E15', 15)
image.show()

演算結果:

tree age is:  5

V.ツリーライブラリの他のメソッドの概要

print('树干长度:', tree.length)
print('树叶长度:', tree.get_branch_length())
print(tree.get_branch_length(age=1))
print(tree.get_rectangle())

演算結果:

树干长度: 300.0
树叶长度: 19.690703039999992
174.0
(0.0, 0.0, 626.4380061192694, 613.2190030596347)

長さ属性は、木の幹の長さを示します。

get_branch_length():指定された年齢での枝の長さ、または年齢が指定されていない場合は葉の長さを返します。指定された年齢は無限にすることができます(結果は変化係数に基づいて導き出されます)。

get_rectangle():ツリーが何度も成長した後、ツリーが占める長方形の座標を返します。

print('树的节点数:', tree.get_node_sum())
print(tree.get_node_sum(3))
# print(tree.nodes)
print(tree.get_nodes())
# print(tree.get_branches())
delta = (10, 10, 10, 10)
tree.move(delta)

演算結果:

树的节点数: 63
15
[[(313.2190030596347, 313.2190030596347)], [(190.18242313317546, 190.1824231331754), (436.255582986094, 190.1824231331754)], [(89.26242313317545, 190.18242313317535), (190.18242313317543, 89.26242313317539), (436.255582986094, 89.26242313317539), (537.175582986094, 190.1824231331754)], [(47.87291764591453, 231.5719286204362), (47.87291764591458, 148.79291764591443), (148.79291764591454, 47.87291764591453), (231.57192862043632, 47.87291764591453), (394.8660774988331, 47.87291764591453), (477.64508847335486, 47.87291764591453), (578.5650884733549, 148.79291764591449), (578.5650884733549, 231.57192862043632)], [(47.87291764591453, 265.5214166204362), (13.923429645914553, 231.5719286204362), (13.92342964591461, 148.79291764591443), (47.87291764591458, 114.84342964591445), (114.84342964591457, 47.87291764591453), (148.79291764591454, 13.923429645914553), (231.57192862043632, 13.923429645914553), (265.5214166204363, 47.87291764591453), (360.9165894988331, 47.87291764591453), (394.8660774988331, 13.923429645914553), (477.64508847335486, 13.923429645914553), (511.59457647335483, 47.87291764591453), (578.5650884733549, 114.84342964591451), (612.5145764733549, 148.79291764591449), (612.5145764733549, 231.57192862043632), (578.5650884733549, 265.5214166204363)], [(61.79634729182908, 279.44484626635074), (33.949487999999974, 279.44484626635074), (0.0, 245.49535826635076), (0.0, 217.64849897452166), (5.684341886080802e-14, 162.71634729182898), (5.684341886080802e-14, 134.86948799999988), (33.94948800000003, 100.91999999999985), (61.796347291829136, 100.91999999999985), (100.92000000000002, 61.79634729182908), (100.92000000000002, 33.949487999999974), (134.869488, 0.0), (162.7163472918291, 0.0), (217.64849897452174, 0.0), (245.49535826635088, 0.0), (279.44484626635085, 33.949487999999974), (279.44484626635085, 61.79634729182908), (346.99315985291855, 61.79634729182908), (346.99315985291855, 33.949487999999974), (380.9426478529185, 0.0), (408.7895071447477, 0.0), (463.7216588274403, 0.0), (491.5685181192694, 0.0), (525.5180061192693, 33.949487999999974), (525.5180061192693, 61.79634729182908), (564.6416588274403, 100.91999999999996), (592.4885181192694, 100.91999999999996), (626.4380061192694, 134.86948799999993), (626.4380061192694, 162.71634729182904), (626.4380061192694, 217.64849897452177), (626.4380061192694, 245.49535826635088), (592.4885181192694, 279.44484626635085), (564.6416588274403, 279.44484626635085)]]

get_node_sum():トランクから指定された年齢までのノードの総数を返します。年齢が指定されていない場合は、現在のツリー内のノードの数を返します。指定された年齢は無限にすることができます(結果はブランチの数に基づいて導き出されます)。

ノード属性は現在のツリー内のすべてのノードオブジェクトを表し、各年齢ノードはリストを構成します。

get_nodes():現在のツリー内のすべてのノードの座標を返し、各年齢ノードがリストを構成します。

get_branches():現在のツリー内のすべてのブランチの座標を返します。座標の形式は(x0、y0、x1、y1)であり、各年齢のブランチがリストを構成します。このメソッドは、branchs属性とは関係ありません。branchsの値は、初期化中に渡されるパラメーターです。

move(delta):ツリーを移動し、デルタパラメーターを渡します。パラメーターの形式は、pos(x0、y0、x1、y1)と同じであり、4つの座標値はデルタ値に従って変換されます。

ツリーライブラリの6つの柔軟な使用

1.より良い木を描く

# coding=utf-8
from Tree.core import Tree
from math import radians
from PIL import Image


branches = [[0.7, radians(-50)], [0.45, radians(10)], [0.6, radians(30)]]
tree = Tree(pos=(0, 0, 0, -300), branches=branches)
tree.grow(9)
tree.move_in_rectangle()
image = Image.new("RGB", tree.get_size(), (250, 250, 250))
tree.draw_on(image, (80, 20, 10, 120, 60, 30), '#003E15', 12)
image.show()

演算結果:

2.木だけでなく、他のグラフィックも描画できます

# coding=utf-8
from Tree.core import Tree
from math import radians
from PIL import Image


tree = Tree(pos=(0, 0, 0, -100), branches=[[1.1, radians(30)]])
tree.grow(24)
tree.move_in_rectangle()
tree.move((100, 100, 100, 100))
size = tuple([s+200 for s in tree.get_size()])
image = Image.new("RGB", size, (250, 250, 250))
tree.draw_on(image, (255, 0, 0), (255, 0, 0), 15)
image.show()

演算結果:

木の成長と描画は非常にメモリを消費します。木の成長の数が多いと、メモリが不足します。

 

 

おすすめ

転載: blog.csdn.net/weixin_43790276/article/details/108561960