# -*- coding: utf-8 -*-
"""Objects-only Chamfer (mask z>zmin) for aligned MVS & NeRF clouds vs GT."""
import numpy as np
from scipy.spatial import cKDTree
from eval_pointclouds import read_ply

def chamfer(P, Q, subsample=100000):
    if len(P) > subsample:
        P = P[np.random.choice(len(P), subsample, replace=False)]
    if len(Q) > subsample:
        Q = Q[np.random.choice(len(Q), subsample, replace=False)]
    tq = cKDTree(Q); tp = cKDTree(P)
    d_PQ, _ = tq.query(P, k=1)
    d_QP, _ = tp.query(Q, k=1)
    return 0.5 * (d_PQ.mean() + d_QP.mean()), d_PQ.mean(), d_QP.mean()

def main():
    Q, _ = read_ply(r"mvs_project\gt\dense_pointcloud.ply")
    for label in ("mvs", "nerf"):
        P, _ = read_ply(rf"output\eval\{label}_aligned.ply")
        for zmin in (0.0, 0.3):
            Pz = P[P[:, 2] > zmin]
            Qz = Q[Q[:, 2] > zmin]
            cd, dPQ, dQP = chamfer(Pz, Qz)
            print(f"[{label}] z>{zmin}: n_recon={len(Pz)} n_gt={len(Qz)} | "
                  f"Chamfer={cd*100:.2f} cm | recon->GT={dPQ*100:.2f} cm | GT->recon={dQP*100:.2f} cm")

if __name__ == "__main__":
    main()
