densemaps.torch.point_to_triangle

Note

Torch and cuda-compatible implementation of:

[1] - “Deblurring and Denoising of Maps between Shapes”, by Danielle Ezuz and Mirela Ben-Chen.

Functions

compute_per_tri_max_edge_length(vert_emb, faces)

Computes the maximum edge length per triangle

compute_per_triangle_min_dist(vert_emb, ...)

Given a vertex in the pointcloud and each face on the surface, gives the minimum distance to between the vertex and each of the 3 points of the triangle.

mycdist(X, Y[, sqnormX, sqnormY, squared])

Compute pairwise euclidean distance between two collections of vectors in a k-dimensional space

nn_query_precise_torch(vert_emb, faces, ...)

Project a pointcloud on a p-dimensional triangle mesh

project_pc_to_triangles(vert_emb, faces, ...)

Project a pointcloud on a set of triangles in p-dimension.

project_to_mesh_multi(vert_emb, faces, ...)

Project a pointcloud on a p-dimensional triangle mesh

Classes

PointsTriangleProjLayer()

Torch implementation of the projection of points a set of triangles in p-dimension.

densemaps.torch.point_to_triangle.nn_query_precise_torch(vert_emb, faces, points_emb, return_dist=False, batch_size=None, clear_cache=True)

Project a pointcloud on a p-dimensional triangle mesh

Parameters:
  • vert_emb – (n1, p) coordinates of the mesh vertices

  • faces – (m1, 3) faces of the mesh defined as indices of vertices

  • points_emb – (n2, p) coordinates of the pointcloud

  • return_dist (bool) – Whether to return the distance to the nearest vertex

  • batch_size (int, optional) – If precompute_dmin is False, projects batches of points on the surface

  • clear_cache (bool) – Whether to clear cache after computation

Returns:

  • face_match (torch.Tensor) – (n2,) - indices of the face assigned to each point.

  • bary_coord (torch.Tensor) – (n2,3) - barycentric coordinates of each point within the face.

densemaps.torch.point_to_triangle.project_pc_to_triangles(vert_emb, faces, points_emb, precompute_dmin=True, batch_size=None, verbose=False)

Project a pointcloud on a set of triangles in p-dimension. Projection is defined as barycentric coordinates on one of the triangle. Line i for the output has 3 non-zero values at indices j,k and l of the vertices of the triangle point i is projected on.

Parameters:
  • vert_emb (torch.Tensor) – (n1, p) coordinates of the mesh vertices

  • faces (torch.Tensor) – (m1, 3) faces of the mesh defined as indices of vertices

  • points_emb (torch.Tensor) – (n2, p) coordinates of the pointcloud

  • precompute_dmin (bool) – Whether to precompute all the values of delta_min. Faster but heavier in memory.

  • batch_size (int, optional) – If precompute_dmin is False, projects batches of points on the surface

Returns:

  • face_match (torch.Tensor) – (n2,) - indices of the face assigned to each point.

  • bary_coord (torch.Tensor) – (n2,3) - barycentric coordinates of each point within the face.

densemaps.torch.point_to_triangle.compute_per_tri_max_edge_length(vert_emb, faces)

Computes the maximum edge length per triangle

Parameters:
  • vert_emb – (n1, p) coordinates of the mesh vertices

  • faces – (m1, 3) faces of the mesh defined as indices of vertices

Returns:

lmax – (m1,) maximum edge length

Return type:

torch.Tensor

densemaps.torch.point_to_triangle.mycdist(X, Y, sqnormX=None, sqnormY=None, squared=False)

Compute pairwise euclidean distance between two collections of vectors in a k-dimensional space

Parameters:
  • X – (n1, k) first collection

  • Y – (n2, k) second collection or (k,) if single point

  • squared (bool) – whether to compute the squared euclidean distance

Returns:

distmat – (n1, n2) or (n2,) distance matrix

Return type:

torch.Tensor

densemaps.torch.point_to_triangle.compute_per_triangle_min_dist(vert_emb, faces, points_emb, vert_sqnorm=None, points_sqnorm=None)

Given a vertex in the pointcloud and each face on the surface, gives the minimum distance to between the vertex and each of the 3 points of the triangle.

For a given face on the source shape and vertex on the target shape: \(\delta_min = \min_{i=1\cdots 3} \|A_{c_i,*} - b\|_2\) with notations from “Deblurring and Denoising of Maps between Shapes”.

Parameters:
  • vert_emb – (n1, p) coordinates of the mesh vertices

  • faces – (m1, 3) faces of the mesh defined as indices of vertices

  • points_emb – (n2, p) coordinates of the pointcloud

  • vertind – index of the vertex for which to compute dmin

  • vert_sqnorm – (n1,) squared norm of each vertex

  • points_sqnorm – (n2,) squared norm of each point

Returns:

delta_min – (m1,n2) delta_min for each face on the source shape.

Return type:

torch.Tensor

densemaps.torch.point_to_triangle.project_to_mesh_multi(vert_emb, faces, points_emb, vertinds, lmax, Deltamin, dmin=None, dmin_params=None)

Project a pointcloud on a p-dimensional triangle mesh

Parameters:
  • vert_emb – (n1, p) coordinates of the mesh vertices

  • faces – (m1, 3) faces of the mesh defined as indices of vertices

  • points_emb – (n2, p) coordinates of the pointcloud

  • vertinds – (l,) - indices of the vertices to project

  • lmax – (m1,) value of lmax (max edge length for each face)

  • Deltamin – (n2,) or (l,) value of Deltamin (distance to nearest vertex)

  • dmin

    (m1,n2) or (m1, l) - optional - values of dmin (distance to the nearest vertex of each face

    for each vertex). Can be computed on the fly

  • dmin_params (dict, optional) – if dmin is None, stores ‘vert_sqnorm’ a (n1,) array of squared norms of vertices embeddings, and ‘points_sqnorm’ a (n2,) array of squared norms of points embeddings. Helps speed up computation of dmin

Returns:

  • min_faceind – (l,) index of the face on which the vertex is projected

  • min_bary – (l, 3,) - barycentric coordinates on the chosen face

class densemaps.torch.point_to_triangle.PointsTriangleProjLayer

Torch implementation of the projection of points a set of triangles in p-dimension. Face pre-selection must be done beforehand, this is bruteforce.

Note

The notations (and the algorithm) are inspired from:

[1] “David Eberly, ‘Distance Between Point and Triangle in 3D’, Geometric Tools, LLC, (1999)”

forward(triangles=None, points=None, min_only=True, return_bary=True, return_dist=True, return_proj=True, verbose=False)

returns in order: [final_dists, projections, barycentric_coordinates, argmin_proj]

  • If return_dist is True, output contains the distances

  • If return_proj is True, output contains the projections

  • If return_bary is True, output contains the barycentric coordinates

  • If min_only is True, output contains the index of the closest triangle

Parameters:
  • triangles – (m, 3, p) coordinates of the mesh triangles

  • points – (n, p) coordinates of the points to project

  • min_only (bool) – whether to return results only for closest point on the triangle

  • return_bary (bool) – whether to return the barycentric coordinates

  • return_dist (bool) – whether to return the distances

  • return_proj (bool) – whether to return the projections

  • verbose (bool) – whether to print debug information

Returns:

  • final_dists – (n,) or (n,m) distances between the points and the triangles. (n,) if min_only is True

  • projections – (n,p) or (n,m,p) projections of the points on the triangles. (n,p) if min_only is True

  • barycentric_coordinates – (n,3) or (n,m,3) barycentric coordinates of the projections. (n,3) if min_only is True

  • argmin_proj – (n,) index of the closest triangle. Only if min_only is True