# ThreeDTool
This module is needed to work with mathematical structures such as plane, line,
triangles and other polygons, polyhedron.
Этот модуль необходим для работы с математическими структурами, такими как плоскость, линия,
треугольники и другие многоугольники, многогранники.
An example of using the library is here:
Пример использования библиотеки здесь:
https://github.com/OnisOris/5X3D-slicer
# Пример применения модуля
## Установка последней версии ThreeDTool с github.com
Ставим модуль с помощью команды ниже с github.
```python
!pip install git+https://github.com/OnisOris/ThreeDTool
```
## Анализ положения квадратов
Создадим два квадрата с вершинами [[0, 0, 0], [1, 0, 0], [1, 1, 0], [0, 1, 0]] и [[1.5, 0, 0], [1.5, 1, 0], [0.5, 1, 0], [0.5, 0, 0]].
Они находятся в одной плоскости и пересекаются. Найдем точки пересечения.
```python
import ThreeDTool as tdt
import numpy as np
# Первый прямоугольник состоит из четырех вершин
pol1 = tdt.Polygon(np.array([[0, 0, 0], [1, 0, 0], [1, 1, 0], [0, 1, 0]]))
# Второй прямоугольник состоит тоже из четырех вершин
pol2 = np.array([[1.5, 0, 0], [1.5, 1, 0], [0.5, 1, 0], [0.5, 0, 0]])
# Создадим объект многоугольника, чтобы его можно было отобразить на графике
pol2 = tdt.Polygon(pol2)
# Функция для нахождения пересечений прямоугольников, возвращающая точки
points = pol1.points_from_polygon_polygon_intersection(pol2)
# Создадим объект класс обертку для точек, в него нужно помещать матрицу
# nx3, где n - количество точек
points = tdt.Points(points, s=20, color='red')
# Создадим объект Dspl, который кушает объекты с реализованным методом show(ax)
# и отображает эти объекты, когда применяем метод show к объекту Dspl
dp0 = tdt.Dspl([pol1, pol2, points])
# Отобразим наш график
dp0.show()
```
![alt text](readme_files/1.png "Title")
Для изучения данной функции повернем один из прямоугольников.
```python
# Попробуем его покрутить в пространстве по оси [1, 1, 1] на угол в 30 градусов
axis = [1, 1, 1]
# Переопределим вершины прямоугольника
pol2 = np.array([[1.5, 0, 0], [1.5, 1, 0], [0.5, 1, 0], [0.5, 0, 0]])
# Поворот прямоугольника
pol2 = tdt.rot_v(pol2, np.pi/6, axis)
# Создадим объект многоугольника, чтобы его можно было отобразить на графике
pol2 = tdt.Polygon(pol2)
# Найдем точки пересечения многоугольников
points = pol1.points_from_polygon_polygon_intersection(pol2)
line_s = tdt.Line_segment(point1=points[0], point2=points[1])
# Ось попробуем отобразить с помощью класса Fvec, который хранит в себе координату и вектор вида:
# [x, y, z, px, py, pz]
axis = tdt.Fvec([0, 0, 0], axis)
axis.length = 0.5
# Создадим объект класс обертку для точек, в него нужно помещать матрицу nx3,
# где n - количество точек
points = tdt.Points(points, s=20, color='red')
# Создадим объект Dspl, который кушает объекты с реализованным методом show(ax)
# и отображает эти объекты, когда применяем метод show к объекту Dspl
dp = tdt.Dspl([pol1, pol2, points, line_s, axis])
# Далее мы можем настраивать разные ракурсы графика, eval - угол наклона, axim -
# азимут (Угол между горизонтальной плоскостью меридиана и вертикальной
# плоскостью наблюдаемого объекта)
dp.ax.view_init(elev=40, azim=90)
# Отобразим наш график
dp.show()
```
![alt text](readme_files/2.png "Title")
Как мы можем видеть, прямоугольники пересеклись в области, указанной синей линией. Красная стрелка показывает ось поворота квадрата, который был до этого в плоскости.
```python
# Для повторного отображения необходимо воспользоваться методом
# create_subplot3D()
dp.create_subplot3D()
dp.ax.view_init(elev=80, azim=90)
dp.show()
```
![alt text](readme_files/3.png "Title")
```python
dp.create_subplot3D()
dp.ax.view_init(elev=00, azim=90)
dp.show()
```
![alt text](readme_files/4.png "Title")
# Создание отрезков
Создадим первый отрезок.
```python
import ThreeDTool as tdt
seg = tdt.Line_segment(point1=[-1, 9, -1], point2=[2, 12, 2])
dp = tdt.Dspl([seg])
dp.show()
```
![png](readme_files/5.png)
Создадим второй отрезок.
```python
seg2 = tdt.Line_segment(point1=[-200, -190, 0], point2=[200, 210, 0])
# Поменяем цвет линии
seg2.color = 'red'
dp2 = tdt.Dspl([seg2])
dp2.show()
```
![png](readme_files/6.png)
Найдем точку пересечения отрезков.
```python
point_inters = tdt.Points(tdt.point_from_segment_segment_intersection(seg, seg2), s=30, color='green')
point_inters.xyz
```
array([ 0., 10., 0.])
Изобразим отрезки и их пересечение.
```python
dp3 = tdt.Dspl([seg, seg2, point_inters])
dp3.show()
```
![png](readme_files/7.png)
# Генерация пятиосевой траектории
В данном разделе мы сгенерируем одну локсодрому - это траектория, представляющая собой объемную спираль. После этого создадим вектора поворота в каждой точке для задания положения объекта.
Скачаем файл с ограничесвающей STL моделью.
```python
!curl -O https://raw.githubusercontent.com/OnisOris/5X3D-slicer/main/tests/test_functions/test_models/cube.stl
```
```python
import trimesh
import ThreeDTool as tdt
import matplotlib as mpl
import numpy as np
# Путь до файла
path = "/content/cube.stl"
# Используем функцию open с параметром "r" (чтение)
with open(path, 'r') as f:
# Парсим координаты нормалей и вершин треугольников в triangles
triangles, name = tdt.parse_stl(f)
# Сохраним треугольники в tr. Каждый треугольник будет сохраняться в объект
# класса Triangle
tr = np.array([])
for item in triangles:
tr = np.hstack([tr, tdt.Triangle(item)])
# Создаем многогранник или полиэдр
polyhedron = tdt.Polyhedron(tr)
# Вычисление радиуса. Вычисляем максимальный радиус локсодромы.
r = np.array([np.linalg.norm(polyhedron.get_min_max()[0]),
np.linalg.norm(polyhedron.get_min_max()[1])])
rmax = np.max(r)/2
point_n = polyhedron.get_median_point() - [0, 0.5, 0.5]
# Генерация локсодромы
arr = tdt.generate_loxodromes(r=rmax, point_n=point_n, steps=0.001)
# Функция нарезания локосдромы объемом STL модели
cc = tdt.cut_curve(arr[2], path)
# Точка, с которой вычисляются вектора вертикального поворота (красные стрелки)
center_point = point_n
# Оборачиваем точку классом Points для удобства отображения
center_p = tdt.Points([center_point], s=50, color='green', text=True)
# Массив, куда мы сохраним пятизначные траектории
curves5x = np.array([])
for curve in cc:
# Класс обертка для пятиосевой траектории
out_curve = tdt.Curve5x()
for i, item in enumerate(curve.curve_array):
# Функция для вычисления вектора из двух точек
vector_z = tdt.vector_from_two_points(center_point, item)
vector_z[0] = 0
if i == curve.curve_array.shape[0] - 1:
point5 = out_curve[i - 1]
else:
vector_x = tdt.vector_from_two_points(curve.curve_array[i + 1],
item)
vector_x[2] = 0
point5 = np.hstack([item, vector_z, vector_x])
out_curve.union(point5)
tdt.angles_from_vector(point5)
curves5x = np.hstack([curves5x, out_curve])
# Отобразим все объекты, объеденив их в all_objects
# (траектории - curves5x и точка - center_p)
all_objects = np.hstack([curves5x, center_p])
dp = tdt.Dspl(all_objects)
# Отображение
dp.show()
```
![png](./readme_files/8.png)
# Нарезание моделей
В данном примере мы будем нарезать STL модель с помощью плоскости, которая будет постепенно подниматься с самой нижней точки на определенное расстояние - высоту слоя thick.
Использовать для работы мы будем тот же файл, что и ранее cube.stl
```python
!curl -O https://raw.githubusercontent.com/OnisOris/5X3D-slicer/main/tests/test_functions/test_models/cube.stl
```
```python
from ThreeDTool import *
import matplotlib as mpl
# Путь до файла
path = "/content/cube.stl"
file = open(path, "r")
parser = Parser_stl()
triangles, name = parser.parse_stl(file)
file.close()
def slicing(triangles, thiсk=0.1):
# Находим пограничные координаты модели:
max_xyz, min_xyz = max_min_points(triangles)
# Находим минимальную координату:
z_min = min_xyz[2]
# Находим самую высокую часть модели:
z_max = max_xyz[2]
# Найдем высоту модели:
hight = distance_between_two_points(z_min, z_max)
# Количество слоев:
amount_of_layers = hight / thiсk
plane_array = np.array([])
# Плоскость нарезания
slice_plane = Plane(0, 0, 1, -z_min)
points_array = []
# Пройдем по всем слоям
for _ in range(int(amount_of_layers)):
# Пройдемся по всем треугольникам
for triangle in triangles:
try:
position_index, points = position_analyze_of_triangle(triangle, slice_plane)
except TypeError:
logger.error(f"error")
if position_index == 2:
# Создаем плоскость треугольника
plane = Plane()
# Функция создания плоскости из треугольника
plane.create_plane_from_triangle(triangle, create_normal=True)
# Создаем линию пересечения плоскостей треугольника и плоскости слайсинга
line = Line()
line.line_from_planes(plane, slice_plane)
# Линии из вершин треугольников
line1 = Line()
line1.line_create_from_points(points[0, 0], points[0, 1])
line2 = Line()
line2.line_create_from_points(points[1, 0], points[1, 1])
# Точки пересечения линий
point1 = point_from_line_line_intersection(line, line1)
point2 = point_from_line_line_intersection(line, line2)
if point1.__class__ == np.ndarray:
points_array.append(point1)
if point2.__class__ == np.ndarray:
points_array.append(point2)
slice_plane.d -= 0.1
points_array = np.array(points_array)
u, idx = np.unique(points_array, axis=0, return_index=True)
points_array = u[idx.argsort()]
return points_array.T
points = slicing(triangles)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(points[0], points[1], points[2])
ax.set_xlabel('X Label')
ax.set_ylabel('Y Label')
ax.set_zlabel('Z Label')
plt.show()
```
![png](./readme_files/9.png)
Raw data
{
"_id": null,
"home_page": "https://github.com/OnisOris/ThreeDTool",
"name": "ThreeDTool",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.10",
"maintainer_email": null,
"keywords": "3D math geometry",
"author": "OnisOris",
"author_email": "onisoris@yandex.ru",
"download_url": "https://files.pythonhosted.org/packages/74/2f/a8eedea3cb7ff86d89903d353818694d3b9579b6894b926833c5089b31a7/threedtool-0.0.4.tar.gz",
"platform": null,
"description": "# ThreeDTool\r\n\r\n\r\nThis module is needed to work with mathematical structures such as plane, line, \r\ntriangles and other polygons, polyhedron.\r\n\r\n\u042d\u0442\u043e\u0442 \u043c\u043e\u0434\u0443\u043b\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c\u0438, \u0442\u0430\u043a\u0438\u043c\u0438 \u043a\u0430\u043a \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c, \u043b\u0438\u043d\u0438\u044f, \r\n\u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0438 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043c\u043d\u043e\u0433\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0438, \u043c\u043d\u043e\u0433\u043e\u0433\u0440\u0430\u043d\u043d\u0438\u043a\u0438.\r\n\r\nAn example of using the library is here:\r\n\r\n\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0437\u0434\u0435\u0441\u044c:\r\n\r\nhttps://github.com/OnisOris/5X3D-slicer\r\n\r\n# \u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043c\u043e\u0434\u0443\u043b\u044f\r\n\r\n## \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 ThreeDTool \u0441 github.com\r\n\u0421\u0442\u0430\u0432\u0438\u043c \u043c\u043e\u0434\u0443\u043b\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043d\u0438\u0436\u0435 \u0441 github.\r\n\r\n\r\n```python\r\n!pip install git+https://github.com/OnisOris/ThreeDTool\r\n```\r\n\r\n \r\n## \u0410\u043d\u0430\u043b\u0438\u0437 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043e\u0432\r\n\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0434\u0432\u0430 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0430 \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u0430\u043c\u0438 [[0, 0, 0], [1, 0, 0], [1, 1, 0], [0, 1, 0]] \u0438 [[1.5, 0, 0], [1.5, 1, 0], [0.5, 1, 0], [0.5, 0, 0]].\r\n\r\n\u041e\u043d\u0438 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u043e\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 \u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0442\u0441\u044f. \u041d\u0430\u0439\u0434\u0435\u043c \u0442\u043e\u0447\u043a\u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f.\r\n\r\n\r\n```python\r\nimport ThreeDTool as tdt\r\nimport numpy as np\r\n\r\n# \u041f\u0435\u0440\u0432\u044b\u0439 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0447\u0435\u0442\u044b\u0440\u0435\u0445 \u0432\u0435\u0440\u0448\u0438\u043d\r\npol1 = tdt.Polygon(np.array([[0, 0, 0], [1, 0, 0], [1, 1, 0], [0, 1, 0]]))\r\n\r\n# \u0412\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0442\u043e\u0436\u0435 \u0438\u0437 \u0447\u0435\u0442\u044b\u0440\u0435\u0445 \u0432\u0435\u0440\u0448\u0438\u043d\r\n\r\npol2 = np.array([[1.5, 0, 0], [1.5, 1, 0], [0.5, 1, 0], [0.5, 0, 0]])\r\n\r\n# \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u043c\u043d\u043e\u0433\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430, \u0447\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u043d\u0430 \u0433\u0440\u0430\u0444\u0438\u043a\u0435\r\npol2 = tdt.Polygon(pol2)\r\n\r\n# \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0439 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0430\u044f \u0442\u043e\u0447\u043a\u0438\r\npoints = pol1.points_from_polygon_polygon_intersection(pol2)\r\n\r\n# \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u043a\u043b\u0430\u0441\u0441 \u043e\u0431\u0435\u0440\u0442\u043a\u0443 \u0434\u043b\u044f \u0442\u043e\u0447\u0435\u043a, \u0432 \u043d\u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043c\u0435\u0449\u0430\u0442\u044c \u043c\u0430\u0442\u0440\u0438\u0446\u0443\r\n# nx3, \u0433\u0434\u0435 n - \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u043e\u0447\u0435\u043a\r\npoints = tdt.Points(points, s=20, color='red')\r\n\r\n# \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043e\u0431\u044a\u0435\u043a\u0442 Dspl, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u0443\u0448\u0430\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0441 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u043c show(ax)\r\n# \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u044d\u0442\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u043c\u0435\u0442\u043e\u0434 show \u043a \u043e\u0431\u044a\u0435\u043a\u0442\u0443 Dspl\r\ndp0 = tdt.Dspl([pol1, pol2, points])\r\n\r\n# \u041e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u043c \u043d\u0430\u0448 \u0433\u0440\u0430\u0444\u0438\u043a\r\ndp0.show()\r\n```\r\n\r\n\r\n![alt text](readme_files/1.png \"Title\")\r\n\r\n\u0414\u043b\u044f \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043e\u0432\u0435\u0440\u043d\u0435\u043c \u043e\u0434\u0438\u043d \u0438\u0437 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432.\r\n\r\n\r\n```python\r\n# \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0435\u0433\u043e \u043f\u043e\u043a\u0440\u0443\u0442\u0438\u0442\u044c \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u043f\u043e \u043e\u0441\u0438 [1, 1, 1] \u043d\u0430 \u0443\u0433\u043e\u043b \u0432 30 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432\r\naxis = [1, 1, 1]\r\n\r\n# \u041f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430\r\npol2 = np.array([[1.5, 0, 0], [1.5, 1, 0], [0.5, 1, 0], [0.5, 0, 0]])\r\n\r\n# \u041f\u043e\u0432\u043e\u0440\u043e\u0442 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430\r\npol2 = tdt.rot_v(pol2, np.pi/6, axis)\r\n\r\n# \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u043c\u043d\u043e\u0433\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430, \u0447\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u043d\u0430 \u0433\u0440\u0430\u0444\u0438\u043a\u0435\r\npol2 = tdt.Polygon(pol2)\r\n\r\n# \u041d\u0430\u0439\u0434\u0435\u043c \u0442\u043e\u0447\u043a\u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u043c\u043d\u043e\u0433\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432\r\npoints = pol1.points_from_polygon_polygon_intersection(pol2)\r\nline_s = tdt.Line_segment(point1=points[0], point2=points[1])\r\n\r\n# \u041e\u0441\u044c \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043b\u0430\u0441\u0441\u0430 Fvec, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u0440\u0430\u043d\u0438\u0442 \u0432 \u0441\u0435\u0431\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0443 \u0438 \u0432\u0435\u043a\u0442\u043e\u0440 \u0432\u0438\u0434\u0430:\r\n# [x, y, z, px, py, pz]\r\naxis = tdt.Fvec([0, 0, 0], axis)\r\naxis.length = 0.5\r\n\r\n# \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u043a\u043b\u0430\u0441\u0441 \u043e\u0431\u0435\u0440\u0442\u043a\u0443 \u0434\u043b\u044f \u0442\u043e\u0447\u0435\u043a, \u0432 \u043d\u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043c\u0435\u0449\u0430\u0442\u044c \u043c\u0430\u0442\u0440\u0438\u0446\u0443 nx3,\r\n# \u0433\u0434\u0435 n - \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u043e\u0447\u0435\u043a\r\npoints = tdt.Points(points, s=20, color='red')\r\n\r\n# \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043e\u0431\u044a\u0435\u043a\u0442 Dspl, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u0443\u0448\u0430\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0441 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u043c show(ax)\r\n# \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u044d\u0442\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u043c\u0435\u0442\u043e\u0434 show \u043a \u043e\u0431\u044a\u0435\u043a\u0442\u0443 Dspl\r\ndp = tdt.Dspl([pol1, pol2, points, line_s, axis])\r\n# \u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0440\u0430\u043a\u0443\u0440\u0441\u044b \u0433\u0440\u0430\u0444\u0438\u043a\u0430, eval - \u0443\u0433\u043e\u043b \u043d\u0430\u043a\u043b\u043e\u043d\u0430, axim -\r\n# \u0430\u0437\u0438\u043c\u0443\u0442 (\u0423\u0433\u043e\u043b \u043c\u0435\u0436\u0434\u0443 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c\u044e \u043c\u0435\u0440\u0438\u0434\u0438\u0430\u043d\u0430 \u0438 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439\r\n# \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c\u044e \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430)\r\ndp.ax.view_init(elev=40, azim=90)\r\n\r\n# \u041e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u043c \u043d\u0430\u0448 \u0433\u0440\u0430\u0444\u0438\u043a\r\ndp.show()\r\n\r\n```\r\n\r\n\r\n \r\n![alt text](readme_files/2.png \"Title\")\r\n \r\n\r\n\r\n\u041a\u0430\u043a \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u0438\u0434\u0435\u0442\u044c, \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u043b\u0438\u0441\u044c \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438, \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0441\u0438\u043d\u0435\u0439 \u043b\u0438\u043d\u0438\u0435\u0439. \u041a\u0440\u0430\u0441\u043d\u0430\u044f \u0441\u0442\u0440\u0435\u043b\u043a\u0430 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043e\u0441\u044c \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b\u043b \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u0432 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438.\r\n\r\n\r\n```python\r\n# \u0414\u043b\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u043c\r\n# create_subplot3D()\r\ndp.create_subplot3D()\r\ndp.ax.view_init(elev=80, azim=90)\r\ndp.show()\r\n```\r\n\r\n\r\n \r\n![alt text](readme_files/3.png \"Title\")\r\n \r\n\r\n\r\n\r\n```python\r\ndp.create_subplot3D()\r\ndp.ax.view_init(elev=00, azim=90)\r\ndp.show()\r\n```\r\n\r\n\r\n \r\n![alt text](readme_files/4.png \"Title\")\r\n \r\n# \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u0442\u0440\u0435\u0437\u043a\u043e\u0432\r\n\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u0435\u0440\u0432\u044b\u0439 \u043e\u0442\u0440\u0435\u0437\u043e\u043a.\r\n\r\n\r\n\r\n\r\n```python\r\nimport ThreeDTool as tdt\r\nseg = tdt.Line_segment(point1=[-1, 9, -1], point2=[2, 12, 2])\r\ndp = tdt.Dspl([seg])\r\ndp.show()\r\n```\r\n\r\n\r\n \r\n![png](readme_files/5.png)\r\n \r\n\r\n\r\n\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0432\u0442\u043e\u0440\u043e\u0439 \u043e\u0442\u0440\u0435\u0437\u043e\u043a.\r\n\r\n\r\n```python\r\nseg2 = tdt.Line_segment(point1=[-200, -190, 0], point2=[200, 210, 0])\r\n# \u041f\u043e\u043c\u0435\u043d\u044f\u0435\u043c \u0446\u0432\u0435\u0442 \u043b\u0438\u043d\u0438\u0438\r\nseg2.color = 'red'\r\ndp2 = tdt.Dspl([seg2])\r\ndp2.show()\r\n```\r\n\r\n\r\n \r\n![png](readme_files/6.png)\r\n \r\n\r\n\r\n\u041d\u0430\u0439\u0434\u0435\u043c \u0442\u043e\u0447\u043a\u0443 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u043e\u0442\u0440\u0435\u0437\u043a\u043e\u0432.\r\n\r\n\r\n```python\r\npoint_inters = tdt.Points(tdt.point_from_segment_segment_intersection(seg, seg2), s=30, color='green')\r\npoint_inters.xyz\r\n```\r\n\r\n\r\n\r\n\r\n array([ 0., 10., 0.])\r\n\r\n\r\n\r\n\u0418\u0437\u043e\u0431\u0440\u0430\u0437\u0438\u043c \u043e\u0442\u0440\u0435\u0437\u043a\u0438 \u0438 \u0438\u0445 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0435.\r\n\r\n\r\n```python\r\ndp3 = tdt.Dspl([seg, seg2, point_inters])\r\ndp3.show()\r\n```\r\n\r\n\r\n \r\n![png](readme_files/7.png)\r\n\r\n\r\n\r\n# \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u044f\u0442\u0438\u043e\u0441\u0435\u0432\u043e\u0439 \u0442\u0440\u0430\u0435\u043a\u0442\u043e\u0440\u0438\u0438\r\n\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u043c\u044b \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043e\u0434\u043d\u0443 \u043b\u043e\u043a\u0441\u043e\u0434\u0440\u043e\u043c\u0443 - \u044d\u0442\u043e \u0442\u0440\u0430\u0435\u043a\u0442\u043e\u0440\u0438\u044f, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0430\u044f \u0441\u043e\u0431\u043e\u0439 \u043e\u0431\u044a\u0435\u043c\u043d\u0443\u044e \u0441\u043f\u0438\u0440\u0430\u043b\u044c. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u0442\u043e\u0447\u043a\u0435 \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430.\r\n\r\n\u0421\u043a\u0430\u0447\u0430\u0435\u043c \u0444\u0430\u0439\u043b \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u0441\u0432\u0430\u044e\u0449\u0435\u0439 STL \u043c\u043e\u0434\u0435\u043b\u044c\u044e.\r\n\r\n\r\n```python\r\n!curl -O https://raw.githubusercontent.com/OnisOris/5X3D-slicer/main/tests/test_functions/test_models/cube.stl\r\n```\r\n\r\n\r\n```python\r\nimport trimesh\r\nimport ThreeDTool as tdt\r\nimport matplotlib as mpl\r\nimport numpy as np\r\n\r\n# \u041f\u0443\u0442\u044c \u0434\u043e \u0444\u0430\u0439\u043b\u0430\r\npath = \"/content/cube.stl\"\r\n\r\n# \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e open \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c \"r\" (\u0447\u0442\u0435\u043d\u0438\u0435)\r\nwith open(path, 'r') as f:\r\n # \u041f\u0430\u0440\u0441\u0438\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043d\u043e\u0440\u043c\u0430\u043b\u0435\u0439 \u0438 \u0432\u0435\u0440\u0448\u0438\u043d \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432 \u0432 triangles\r\n triangles, name = tdt.parse_stl(f)\r\n\r\n# \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u043c \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0438 \u0432 tr. \u041a\u0430\u0436\u0434\u044b\u0439 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u0432 \u043e\u0431\u044a\u0435\u043a\u0442\r\n# \u043a\u043b\u0430\u0441\u0441\u0430 Triangle\r\ntr = np.array([])\r\nfor item in triangles:\r\n tr = np.hstack([tr, tdt.Triangle(item)])\r\n\r\n# \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043c\u043d\u043e\u0433\u043e\u0433\u0440\u0430\u043d\u043d\u0438\u043a \u0438\u043b\u0438 \u043f\u043e\u043b\u0438\u044d\u0434\u0440\r\npolyhedron = tdt.Polyhedron(tr)\r\n\r\n# \u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0440\u0430\u0434\u0438\u0443\u0441\u0430. \u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0434\u0438\u0443\u0441 \u043b\u043e\u043a\u0441\u043e\u0434\u0440\u043e\u043c\u044b.\r\nr = np.array([np.linalg.norm(polyhedron.get_min_max()[0]),\r\n np.linalg.norm(polyhedron.get_min_max()[1])])\r\nrmax = np.max(r)/2\r\npoint_n = polyhedron.get_median_point() - [0, 0.5, 0.5]\r\n# \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043b\u043e\u043a\u0441\u043e\u0434\u0440\u043e\u043c\u044b\r\narr = tdt.generate_loxodromes(r=rmax, point_n=point_n, steps=0.001)\r\n# \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0430\u0440\u0435\u0437\u0430\u043d\u0438\u044f \u043b\u043e\u043a\u043e\u0441\u0434\u0440\u043e\u043c\u044b \u043e\u0431\u044a\u0435\u043c\u043e\u043c STL \u043c\u043e\u0434\u0435\u043b\u0438\r\ncc = tdt.cut_curve(arr[2], path)\r\n# \u0422\u043e\u0447\u043a\u0430, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u044e\u0442\u0441\u044f \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 (\u043a\u0440\u0430\u0441\u043d\u044b\u0435 \u0441\u0442\u0440\u0435\u043b\u043a\u0438)\r\ncenter_point = point_n\r\n# \u041e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0442\u043e\u0447\u043a\u0443 \u043a\u043b\u0430\u0441\u0441\u043e\u043c Points \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\r\ncenter_p = tdt.Points([center_point], s=50, color='green', text=True)\r\n# \u041c\u0430\u0441\u0441\u0438\u0432, \u043a\u0443\u0434\u0430 \u043c\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043c \u043f\u044f\u0442\u0438\u0437\u043d\u0430\u0447\u043d\u044b\u0435 \u0442\u0440\u0430\u0435\u043a\u0442\u043e\u0440\u0438\u0438\r\ncurves5x = np.array([])\r\nfor curve in cc:\r\n # \u041a\u043b\u0430\u0441\u0441 \u043e\u0431\u0435\u0440\u0442\u043a\u0430 \u0434\u043b\u044f \u043f\u044f\u0442\u0438\u043e\u0441\u0435\u0432\u043e\u0439 \u0442\u0440\u0430\u0435\u043a\u0442\u043e\u0440\u0438\u0438\r\n out_curve = tdt.Curve5x()\r\n for i, item in enumerate(curve.curve_array):\r\n # \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0442\u043e\u0447\u0435\u043a\r\n vector_z = tdt.vector_from_two_points(center_point, item)\r\n vector_z[0] = 0\r\n if i == curve.curve_array.shape[0] - 1:\r\n point5 = out_curve[i - 1]\r\n else:\r\n vector_x = tdt.vector_from_two_points(curve.curve_array[i + 1],\r\n item)\r\n vector_x[2] = 0\r\n point5 = np.hstack([item, vector_z, vector_x])\r\n out_curve.union(point5)\r\n tdt.angles_from_vector(point5)\r\n curves5x = np.hstack([curves5x, out_curve])\r\n# \u041e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u043c \u0432\u0441\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u043e\u0431\u044a\u0435\u0434\u0435\u043d\u0438\u0432 \u0438\u0445 \u0432 all_objects\r\n# (\u0442\u0440\u0430\u0435\u043a\u0442\u043e\u0440\u0438\u0438 - curves5x \u0438 \u0442\u043e\u0447\u043a\u0430 - center_p)\r\nall_objects = np.hstack([curves5x, center_p])\r\ndp = tdt.Dspl(all_objects)\r\n# \u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\r\ndp.show()\r\n```\r\n\r\n![png](./readme_files/8.png)\r\n\r\n\r\n# \u041d\u0430\u0440\u0435\u0437\u0430\u043d\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0435\u0439\r\n\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043d\u0430\u0440\u0435\u0437\u0430\u0442\u044c STL \u043c\u043e\u0434\u0435\u043b\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f \u0441 \u0441\u0430\u043c\u043e\u0439 \u043d\u0438\u0436\u043d\u0435\u0439 \u0442\u043e\u0447\u043a\u0438 \u043d\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 - \u0432\u044b\u0441\u043e\u0442\u0443 \u0441\u043b\u043e\u044f thick.\r\n\r\n\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0442\u043e\u0442 \u0436\u0435 \u0444\u0430\u0439\u043b, \u0447\u0442\u043e \u0438 \u0440\u0430\u043d\u0435\u0435 cube.stl\r\n\r\n\r\n```python\r\n!curl -O https://raw.githubusercontent.com/OnisOris/5X3D-slicer/main/tests/test_functions/test_models/cube.stl\r\n```\r\n\r\n```python\r\nfrom ThreeDTool import *\r\nimport matplotlib as mpl\r\n\r\n# \u041f\u0443\u0442\u044c \u0434\u043e \u0444\u0430\u0439\u043b\u0430\r\npath = \"/content/cube.stl\"\r\nfile = open(path, \"r\")\r\nparser = Parser_stl()\r\ntriangles, name = parser.parse_stl(file)\r\nfile.close()\r\n\r\ndef slicing(triangles, thi\u0441k=0.1):\r\n # \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u043f\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043c\u043e\u0434\u0435\u043b\u0438:\r\n max_xyz, min_xyz = max_min_points(triangles)\r\n # \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0443:\r\n z_min = min_xyz[2]\r\n # \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u0441\u0430\u043c\u0443\u044e \u0432\u044b\u0441\u043e\u043a\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u0438:\r\n z_max = max_xyz[2]\r\n # \u041d\u0430\u0439\u0434\u0435\u043c \u0432\u044b\u0441\u043e\u0442\u0443 \u043c\u043e\u0434\u0435\u043b\u0438:\r\n hight = distance_between_two_points(z_min, z_max)\r\n # \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u043b\u043e\u0435\u0432:\r\n amount_of_layers = hight / thi\u0441k\r\n plane_array = np.array([])\r\n # \u041f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c \u043d\u0430\u0440\u0435\u0437\u0430\u043d\u0438\u044f\r\n slice_plane = Plane(0, 0, 1, -z_min)\r\n points_array = []\r\n # \u041f\u0440\u043e\u0439\u0434\u0435\u043c \u043f\u043e \u0432\u0441\u0435\u043c \u0441\u043b\u043e\u044f\u043c\r\n for _ in range(int(amount_of_layers)):\r\n # \u041f\u0440\u043e\u0439\u0434\u0435\u043c\u0441\u044f \u043f\u043e \u0432\u0441\u0435\u043c \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430\u043c\r\n for triangle in triangles:\r\n try:\r\n position_index, points = position_analyze_of_triangle(triangle, slice_plane)\r\n except TypeError:\r\n logger.error(f\"error\")\r\n if position_index == 2:\r\n # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430\r\n plane = Plane()\r\n # \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 \u0438\u0437 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430\r\n plane.create_plane_from_triangle(triangle, create_normal=True)\r\n # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043b\u0438\u043d\u0438\u044e \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0435\u0439 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430 \u0438 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 \u0441\u043b\u0430\u0439\u0441\u0438\u043d\u0433\u0430\r\n line = Line()\r\n line.line_from_planes(plane, slice_plane)\r\n # \u041b\u0438\u043d\u0438\u0438 \u0438\u0437 \u0432\u0435\u0440\u0448\u0438\u043d \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432\r\n line1 = Line()\r\n line1.line_create_from_points(points[0, 0], points[0, 1])\r\n line2 = Line()\r\n line2.line_create_from_points(points[1, 0], points[1, 1])\r\n # \u0422\u043e\u0447\u043a\u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u043b\u0438\u043d\u0438\u0439\r\n point1 = point_from_line_line_intersection(line, line1)\r\n point2 = point_from_line_line_intersection(line, line2)\r\n if point1.__class__ == np.ndarray:\r\n points_array.append(point1)\r\n if point2.__class__ == np.ndarray:\r\n points_array.append(point2)\r\n slice_plane.d -= 0.1\r\n points_array = np.array(points_array)\r\n u, idx = np.unique(points_array, axis=0, return_index=True)\r\n points_array = u[idx.argsort()]\r\n return points_array.T\r\n\r\npoints = slicing(triangles)\r\n\r\nfig = plt.figure()\r\nax = fig.add_subplot(111, projection='3d')\r\nax.scatter(points[0], points[1], points[2])\r\nax.set_xlabel('X Label')\r\nax.set_ylabel('Y Label')\r\nax.set_zlabel('Z Label')\r\nplt.show()\r\n\r\n```\r\n\r\n\r\n \r\n![png](./readme_files/9.png)\r\n \r\n\r\n\r\n\r\n",
"bugtrack_url": null,
"license": null,
"summary": "This module is needed to work in geometric primitives.",
"version": "0.0.4",
"project_urls": {
"GitHub": "https://github.com/OnisOris/ThreeDTool",
"Homepage": "https://github.com/OnisOris/ThreeDTool"
},
"split_keywords": [
"3d",
"math",
"geometry"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "98f5db3d304a56afa94de0e44d7ebe5821c21968b1b69725b1927531509f9424",
"md5": "f1b0c211eaae722e435f0f6fcdefc56c",
"sha256": "536d377cac6b1729fd61f94955fffeab89d222c076d0f15a8f736163bcbc716d"
},
"downloads": -1,
"filename": "ThreeDTool-0.0.4-py3-none-any.whl",
"has_sig": false,
"md5_digest": "f1b0c211eaae722e435f0f6fcdefc56c",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.10",
"size": 51186,
"upload_time": "2024-08-26T12:43:01",
"upload_time_iso_8601": "2024-08-26T12:43:01.594678Z",
"url": "https://files.pythonhosted.org/packages/98/f5/db3d304a56afa94de0e44d7ebe5821c21968b1b69725b1927531509f9424/ThreeDTool-0.0.4-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "742fa8eedea3cb7ff86d89903d353818694d3b9579b6894b926833c5089b31a7",
"md5": "b5ab3218d7ecd5ac891b68fc34d68aa4",
"sha256": "0d141757839a65b7583831126b9b138e2dccdbb7a0c46244e30fe1ae63ad10d2"
},
"downloads": -1,
"filename": "threedtool-0.0.4.tar.gz",
"has_sig": false,
"md5_digest": "b5ab3218d7ecd5ac891b68fc34d68aa4",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.10",
"size": 46462,
"upload_time": "2024-08-26T12:43:03",
"upload_time_iso_8601": "2024-08-26T12:43:03.151808Z",
"url": "https://files.pythonhosted.org/packages/74/2f/a8eedea3cb7ff86d89903d353818694d3b9579b6894b926833c5089b31a7/threedtool-0.0.4.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-08-26 12:43:03",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "OnisOris",
"github_project": "ThreeDTool",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"requirements": [],
"lcname": "threedtool"
}