2024年5月15日水曜日

貝塚貝層中の遺物密集度表現とヒートマップ表現

 Relic density representation and heat map representation in the Shell Layer


I independently developed a 3D model that expresses the density of relics in the shell layer. I compared this 3D model with a heat map of the plane distribution of relics (created with QGIS). It matches very well. In the future, I would like to develop 3D heatmaps.


貝塚貝層中の遺物密集度を表現する3Dモデルを独自開発しました。この3Dモデルと遺物平面分布のヒートマップ(QGISで作成)を比較してみました。とてもよく合致します。将来は3Dヒートマップを開発したいと思います。

1 遺物密集度表現3Dモデルと遺物平面分布ヒートマップの対照

2024.05.14記事「技術メモ 遺物の3D密集度の直観的表現」で作成した「遺物密集度分級の表現例2」で作成した3Dモデルのオルソ投影図(上から)と同じ遺物の平面投影分布図のヒートマップ(カーネル密度推定)(QGISで作成)を比較していました。


遺物密集度3Dモデルと遺物平面分布図ヒートマップ

双方の図面から受ける分布特徴は良く一致します。従って、今回開発した「遺物密集度分級の表現例2」の3Dモデルは貝塚分析学習の用途に十分使えそうだと直観できました。

この3Dモデルは遺物密集度を計算するBlenderPythonスクリプトが出来たことにより可能となりました。


参考 3Dモデル画像 オルソ投影 上から

左 素3Dモデル、中 表現例1、右 表現例2

2 3Dヒートマップ

点群の平面分布図から作成するヒートマップ(カーネル密度推定)の様子を、ほぼそのまま3Dモデルにすることも可能であると考えます。その場合、密度大-小の区分はそれぞれ閉じたオブジェクトになり、順番に内包される関係になります。ロシア民芸品マトリョーシカのように次々に内包関係にあるオブジェクトを、わかりやすく表示するのは透明の使い方で高度な技術が必要であると思います。

将来、3Dヒートマップ作成にチャレンジしたいと思います。


仮想3Dヒートマップのイメージ

3 Blender3D空間にプロットされた遺物の密集度を計算して出力するBlenderPythonスクリプト

遺物を球で表現してある場合のスクリプトで、遺物を選択してからスクリプトを走らせると、遺物名称、xyz座標、半径10㎝バッファー内の遺物数をファイル出力します。


import bpy
import math

# 出力先のファイルパス
output_file = "E:/test/aaa.txt"

# バッファー内のオブジェクトを数える関数
def count_objects_within_buffer(center, radius, objects):
    count = 0
    for obj in objects:
        dist = (obj.location - center).length
        if dist <= radius and obj != center:
            count += 1
    return count

# 出力ファイルを開く
with open(output_file, 'w') as file:
    # 選択されたオブジェクトのリスト
    selected_objects = bpy.context.selected_objects
    
    # Sphereのみを対象にする
    selected_spheres = [obj for obj in selected_objects if obj.type == 'MESH' and obj.data.name.startswith("Sphere")]

    # 各Sphereについて情報を出力
    for obj in selected_spheres:
        name = obj.name
        location = obj.location
        radius = 0.1
        
        # 球形バッファー内のオブジェクトを数える
        count = count_objects_within_buffer(obj.location, radius, selected_spheres)
        
        # 情報をファイルに書き込む
        file.write("{},{:.3f},{:.3f},{:.3f},{}\n".format(name, location.x, location.y, location.z, count))

print("Output written to", output_file)

0 件のコメント:

コメントを投稿