# Circle in 3D space

Please refresh the page if equations are not rendered correctly.
---------------------------------------------------------------

## 直接找出圆所在的平面

import numpy as np

"""
Generate points along the circumference of a three-dimensional circle.

Parameters:
- centroid (list): Coordinates of the circle's centroid.
- normal (list): Normal vector of the circle's plane.
- num_points (int, optional): Number of points on the circle. Default is 50.

Returns:
- np.ndarray: Array containing points on the circle.
"""
theta = np.linspace(0, 2 * np.pi, num_points)

# Define coordinate axes in the circle's plane
v3 = normal
v1 = np.array([v3[2], 0, -v3[0]]) / np.linalg.norm([v3[2], 0, -v3[0]])
v2 = np.cross(v3, v1)

# Extract centroid coordinates
cx, cy, cz = centroid[0], centroid[1], centroid[2]

# Calculate points on the circle
ray_end = np.zeros([len(theta), 3])
ray_end[:, 0] = cx + radius * (v1[0] * np.cos(theta) + v2[0] * np.sin(theta))
ray_end[:, 1] = cy + radius * (v1[1] * np.cos(theta) + v2[1] * np.sin(theta))
ray_end[:, 2] = cz + radius * (v1[2] * np.cos(theta) + v2[2] * np.sin(theta))

return ray_end


## 先定义圆在旋转到所需平面

import numpy as np

import numpy as np

"""
Generate points along the circumference of a three-dimensional circle.

Parameters:
- centroid (list): Coordinates of the circle's centroid.
- normal (list): Normal vector of the circle's plane.
- num_points (int, optional): Number of points on the circle. Default is 50.

Returns:
- np.ndarray: Array containing points on the circle.
"""
theta = np.linspace(0, 2 * np.pi, num_points)

z1 = np.zeros(theta.shape[0])

A1 = np.arcsin(-normal[1] / np.sqrt(normal[1]**2 + normal[2]**2))
B1 = np.arcsin(normal[0] / np.sqrt(normal[0]**2 + normal[2]**2))
C1 = 0

Rx_A1 = np.array([[1, 0, 0], [0, np.cos(A1), np.sin(A1)], [0, -np.sin(A1), np.cos(A1)]])
Ry_B1 = np.array([[np.cos(B1), 0, -np.sin(B1)], [0, 1, 0], [np.sin(B1), 0, np.cos(B1)]])
Rz_C1 = np.array([[np.cos(C1), np.sin(C1), 0], [-np.sin(C1), np.cos(C1), 0], [0., 0., 1.]])

Rxyz1 = np.linalg.multi_dot((Rz_C1, Ry_B1, Rx_A1, np.array([x1, y1, z1])))

ray_end = np.zeros([len(theta), 3])
XC, YC, ZC = centroid[0], centroid[1], centroid[2]
ray_end[:, 0] = Rxyz1[0, :] + XC * np.ones(len(theta))
ray_end[:, 1] = Rxyz1[1, :] + YC * np.ones(len(theta))
ray_end[:, 2] = Rxyz1[2, :] + ZC * np.ones(len(theta))

return ray_end

normal = [1,1,1]
centroid = [1,1,1]

rayEnd = threeDimensionalCircle(centroid, normal, radius, numPoints = 50)


## 使用描述圆的节点作为Ray求与三角形网格的交点

import numpy as np
import trimesh

plane_origin = centerline[iSlice]
plane_normal = tangent_ubinder[iSlice]

# Create some rays
ray_origins = np.zeros([numPoints, 3])
ray_origins[:] = plane_origin
rayEnd = threeDimensionalCircle(plane_origin, plane_normal, radius, numPoints)

ray_directions = rayEnd - plane_origin

# Get the intersections
locations, index_ray, index_tri = mesh.ray.intersects_location(
ray_origins=ray_origins, ray_directions=ray_directions)


### trimesh函数解释：

Signature: mesh.ray.intersects_location(ray_origins,
ray_directions,
multiple_hits=True)
Docstring:

Return the location of where a ray hits a surface.

Parameters
----------
ray_origins:    (n,3) float, origins of rays
ray_directions: (n,3) float, direction (vector) of rays

Returns
---------
locations: (n) sequence of (m,3) intersection points
index_ray: (n,) int, list of ray index
index_tri: (n,) int, list of triangle (face) indexes


Everything not saved will be lost.