Я чрезвычайно новичок в программировании, но я решил заняться интересным проектом, поскольку недавно я узнал, как представлять сферу в параметрической форме. При пересечении трех сфер существуют две точки пересечения, которые различны, если только они не перекрываются только в особой точке.
Параметрическое представление сферы:
Код, который я имею, модифицирован из ответа от Python/matplotlib: построение трехмерного куба, сферы и вектора? , добавив возможность диктовать начало координат x, y и z и радиус сферы. Многие подобные вопросы были написаны в C++, Java и С#, которые я вообще не могу понять (я едва знаю, что я делаю, так что будь проще для меня).
Мой код:
import numpy as np
def make_sphere_x(x, radius):
u, v = np.mgrid[0:2 * np.pi:5000j, 0:np.pi:2500j]
x += radius * np.cos(u) * np.sin(v)
return x
def make_sphere_y(y, radius):
u, v = np.mgrid[0:2 * np.pi:5000j, 0:np.pi:2500j]
y += radius * np.sin(u) * np.sin(v)
return y
def make_sphere_z(z, radius):
u, v = np.mgrid[0:2 * np.pi:5000j, 0:np.pi:2500j]
z += radius * np.cos(v)
return z
#x values
sphere_1_x = make_sphere_x(0, 2)
sphere_2_x = make_sphere_x(1, 3)
sphere_3_x = make_sphere_x(-1, 4)
#y values
sphere_1_y = make_sphere_y(0, 2)
sphere_2_y = make_sphere_y(1, 3)
sphere_3_y = make_sphere_y(0, 4)
#z values
sphere_1_z = make_sphere_z(0, 2)
sphere_2_z = make_sphere_z(1, 3)
sphere_3_z = make_sphere_z(-2, 4)
#intercept of x-values
intercept_x = list(filter(lambda x: x in sphere_1_x, sphere_2_x))
intercept_x = list(filter(lambda x: x in intercept_x, sphere_3_x))
print(intercept_x)
Проблемы:
-
Ясно, что должен быть лучший способ найти перехваты. Прямо сейчас код генерирует точки через равные интервалы с количеством интервалов, которое я определяю под мнимым числом в
np.mgrid
. Если это увеличить, шансы на пересечение должны увеличиться (я думаю), но когда я пытаюсь увеличить его до10000j
или выше, он просто выплевывает ошибку памяти. -
В массиве есть очевидные пробелы, и этот метод, скорее всего, будет ошибочным, даже если у меня есть доступ к суперкомпьютеру и я могу довести значение до непристойного значения. Прямо сейчас код приводит к нулевому набору.
-
Код крайне неэффективен, не то чтобы это приоритет, но людям нравятся вещи в тройках, верно?
Не стесняйтесь разжигать меня за ошибки новичка в кодировании или задавать вопросы о переполнении стека. Ваша помощь очень ценится.