2023年7月10日月曜日

3D空間遺物分布の密集性指標

 Compactness index of 3D spatial relic distribution


I have improved the density index for the 3D spatial distribution of pottery fragments in the shell layer on the northern slope of the Ariyoshi Kita Shell Mound. I will tentatively call it "5m range density value". This index makes it possible to compare the density of pottery and other relics, different shell layers, and different ruins.


有吉北貝塚北斜面貝層における土器破片3D空間分布に関する密集性指標を改良しました。「5m範囲密集値」と仮称することにします。この指標で土器と他遺物とか、別貝層とか、別遺跡とかの密集性比較が可能となります。

1 3D空間遺物分布の新しい密集性指標 「5m範囲密集値」

1-1 「5m範囲密集値」の定義

遺物が3D空間に多数分布しているとき、ある遺物から5m範囲内にある他の全遺物を対象として、距離逆数を算出し、その合計を当該遺物の「5m範囲密集値」とします。

1-2 「5m範囲密集値」の意義

ある遺物と周辺全遺物の距離逆数の合計値を求めることで、その遺物の周辺にどれだけ他の遺物が密集しているか定量的に把握できます。また周辺の範囲を5mと限定することで、別の場所や別の遺物種類との密集性比較が可能となります。


有吉北貝塚北斜面貝層土器破片分布と5m範囲を示す半径5mの球体

1-3 「5m範囲密集値」を算出するBlenderPythonスクリプト

●「5m範囲密集値」を算出するBlenderPythonスクリプト

# 5m範囲以内にあるCUBEとの距離逆数の和(r値)を求め、その平均値(m値)と標準偏差値(s値)を利用して4段階区分(u値)してベイスカラーで表示するBlenderPythonスクリプトです。
# 平均値より標準偏差値が小さい場合に限り使えるスクリプトです。
# システムコンソール画面でr値、m値、s値、u値を表示します。

import bpy
from mathutils import Vector
import statistics

def calculate_r_value(cube_obj):
    r_value = 0.0
    all_cubes = bpy.context.selected_objects

    for other_cube in all_cubes:
        if other_cube != cube_obj and other_cube.type == 'MESH':
            distance = (other_cube.location - cube_obj.location).length
            if distance != 0 and (1 / distance) >= 0.2:  # 個々の計測値が0.2以上の場合のみ加算する
                r_value += 1 / distance

    return r_value

# 選択されたオブジェクトがCUBEであることを確認
selected_objects = bpy.context.selected_objects
cube_objects = [obj for obj in selected_objects if obj.type == 'MESH']
if not cube_objects:
    print("No CUBE objects selected.")
else:
    r_values = []
    for cube in cube_objects:
        r_value = calculate_r_value(cube)
        r_values.append(r_value)
        print(f"r value for {cube.name}: {r_value}")

    # 平均値と標準偏差値の計算と表示
    mean_value = statistics.mean(r_values)
    std_deviation = statistics.stdev(r_values)

    print(f"Mean value (s value): {mean_value}")
    print(f"Standard deviation (t value): {std_deviation}")

    for cube in cube_objects:
        r_value = calculate_r_value(cube)

        if r_value > (mean_value + std_deviation) or r_value == (mean_value + std_deviation):
            u_value = 0
        elif (mean_value + std_deviation) > r_value > mean_value or r_value == mean_value:
            u_value = 1
        elif mean_value > r_value > (mean_value - std_deviation) or r_value == (mean_value - std_deviation):
            u_value = 2
        elif r_value < (mean_value - std_deviation):
            u_value = 3

        print(f"u value for {cube.name}: {u_value}")

        # マテリアルの作成とベースカラーの設定
        material = bpy.data.materials.new(name=f"{cube.name}_Material")
        material.use_nodes = True
        principled_bsdf = material.node_tree.nodes.get("Principled BSDF")

        if u_value == 0:
            principled_bsdf.inputs["Base Color"].default_value = (1, 0, 0, 1)
        elif u_value == 1:
            principled_bsdf.inputs["Base Color"].default_value = (0.8, 0.2, 0.2, 1)
        elif u_value == 2:
            principled_bsdf.inputs["Base Color"].default_value = (0.1, 0.2, 0.8, 1)
        elif u_value == 3:
            principled_bsdf.inputs["Base Color"].default_value = (0, 0, 1, 1)

        if cube.data.materials:
            cube.data.materials[0] = material
        else:
            cube.data.materials.append(material)

2 有吉北貝塚北斜面貝層の土器破片「5m範囲密集値」の算出結果とその区分

2-1 「5m範囲密集値」の算出結果


有吉北貝塚北斜面貝層の土器破片「5m範囲密集値」の算出結果と区分


参考 有吉北貝塚北斜面貝層の土器破片「範囲非限定密集値」の算出結果と区分

(「範囲非限定密集値」とはある遺物と全遺物との距離逆数の合計値。以下同様。)

「5m範囲密集値」の最大値は331.8、平均104.6、最小0.7、標準偏差74.3となりました。今は比較するデータがありませんが、今後同じ方法で「5m範囲密集値」データが増えれば、「人口密度」値のようにその数値自体にイメージをもてる指標(尺度)として利用できるようになると考えます。

「範囲非限定密集値」は調査対象範囲の大小で値が変化してしまうので、異なる場所とか異なる遺物の比較を行うことができません。

2-2 密集値区分結果

密集値の様子をざっくり理解するために、次の式で密集値区分を行いました。

ただし、密集値(r値)、平均値(m値)、標準偏差値(s値)。

r>(m+s)あるいはr=(m+s)のとき 密集値区分 特大

(m+s)>r>mあるいはr=mのとき密集値区分 大

m>r>(m-s)あるいはr=(m-s)のとき密集値区分 中

(m-s)>rのとき密集値区分 小

密集値区分結果は「5m範囲密集値」と「範囲非限定密集値」で微細なところでは異なりますが、大局的にはほとんど同じになりました。


「5m範囲密集値」区分結果


「範囲非限定密集値」区分結果

「5m範囲密集値」区分結果


「範囲非限定密集値」区分結果

密集値分布をより詳しく観察するために、密集値の違いを色グラデーションで表現するなどの方法を次記事で検討します。


0 件のコメント:

コメントを投稿