compas-dev / compas-dev/compas_libigl
Clearer documentation for intersection_ray_mesh
- Dominant language
- C++
- Stars
- 5
- Forks
- 8
- PR merge metrics
- No merged PRs in 30d
Description
# Feature Request
As a developer for CityEnergyAnalyst, I want clearer documentation for intersection_ray_mesh so that I could understand the relationship between u, v, w and the vertices of the mesh. For example, is p_hit = u*p1 + v*p2 + w*p3 or w*p1 + v*p2 + u*p3? What's the relationship between this barycentric coordinate and another function provided by compas, barycentric_coordinates?
## Details
In the following example code, I want to reconstruct the coordinates of the intersection point between a ray vertically extruded from a point at XY plane and a triangular mesh.
the code is listed as below:
```python
import compas.geometry
import compas.datastructures
p0 = compas.geometry.Point(2, 0, 0)
p1 = compas.geometry.Point(3, 0, 13)
p2 = compas.geometry.Point(0, 0, 10)
p3 = compas.geometry.Point(0, 2, 10)
mesh = compas.datastructures.Mesh.from_points([[p1.x, p1.y, p1.z],
[p2.x, p2.y, p2.z],
[p3.x, p3.y, p3.z]])
ray = (p0, compas.geometry.Vector(0, 0, 1))
hits = compas.geometry.intersection_ray_mesh(ray, mesh.to_vertices_and_faces())
idx, u, v, t = hits[0]
print("intersection length:", t)
w = 1 - u - v # barycentric coordinates
print("barycentric coordinates:", u, v, w)
phit = compas.geometry.Point(
w * p1.x + v * p2.x + u * p3.x,
w * p1.y + v * p2.y + u * p3.y,
w * p1.z + v * p2.z + u * p3.z
)
print("intersection point", phit.x, phit.y, phit.z)
bary_coords = compas.geometry.barycentric_coordinates([p0.x, p0.y, p0.z], [p1, p2, p3])
print("reconstructed barycentric coordinates:", *bary_coords)
```
And the output is as such:
```
intersection length: 12.0
barycentric coordinates: -0.0 0.3333333432674408 0.6666666567325592
intersection point 1.9999999701976776 0.0 11.999999970197678
reconstructed barycentric coordinates: -1.3333333333333335 2.3333333333333335 0.0
```
It seems that w is corresponding to p1, v to p2 and u to p3. However, in the documentation, this is not clearly listed.
Further, the documentation listed the second and the third output to both the u coordinate. I believe that the third output should be v, instead of u.
Finally, the u, v, w is not identical as the reconstructed barycentric coordinates provided by `compas.geometry.barycentric_coordinates`. Instead of `[0, 0.33, 0.67]`, the compas function outputs `[-1.33, 2.33, 0]`. Could you help me understand the difference here?
**Describe the solution you'd like**
It would be nice if clear documentation for the role of u, v, w is listed; also, the typo in documentation should be fixed. Further, it would be beneficial to unify the two barycentric calculations in compas and in compas_libigl.
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.