Python:球体的交集

2024-05-07

我对编程非常陌生,但我决定承担一个有趣的项目,因为我最近学会了如何以参数形式表示球体。当三个球体相交时,有两个不同的交点,除非它们仅在一个奇点处重叠。

球体的参数表示:

我的代码是根据答案修改的Python/matplotlib:绘制 3d 立方体、球体和向量? https://stackoverflow.com/questions/11140163/python-matplotlib-plotting-a-3d-cube-a-sphere-and-a-vector,添加了指定 x、y 和 z 原点以及球体半径的功能。很多类似的问题都是用 C++、Java 和 C# 写的,我根本无法理解(我几乎不知道自己在做什么,所以放轻松)。

My Code:

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)

问题:

  1. 显然,必须有更好的方法来找到截距。现在,代码以相等的间隔生成点,其中的间隔数是我在虚数下指定的np.mgrid。如果增加的话,交叉路口的机会应该会增加(我认为),但是当我尝试将其增加到10000j或以上,它只是吐出内存错误。

  2. 数组中存在明显的间隙,即使我可以访问超级计算机并且可以将值提高到令人厌恶的值,这种方法也很可能是错误的。现在,代码结果为空集。

  3. 代码效率极低,并不是说这是一个优先事项,而是人们喜欢三连的东西,对吗?

如果我在编码中犯了菜鸟错误或者在 Stack Overflow 上提问,请随意批评我。我们非常重视您的帮助。


Using scipy.optimize.fsolve如果初始猜测位于解的范围内,您可以找到给定函数的根。我用这种方法来解决你的问题,它似乎对我有用。唯一的缺点是它只为您提供一个交叉路口。要找到第二个,您必须修改初始条件,直到fsolve找到第二个根。

首先,我们通过定义每个球体的(任意)半径和中心来定义球体:

a1 = np.array([0,0,0])
r1 = .4
a2 = np.array([.3,0,0])
r2 = .5
a3 = np.array([0,.3,0])
r3 = .5

然后我们定义如何在给定角度的情况下转换回笛卡尔坐标u,v

def position(a,r,u,v):
    return a + r*np.array([np.cos(u)*np.sin(v),np.sin(u)*np.sin(v),np.cos(v)])

现在我们考虑一下我们需要求什么方程的根。对于任何交点,它都满足完美u1,v1,u2,v2,u3,v3职位position(a1,r1,u1,v1) = position(a2,r2,u2,v2) = position(a3,r3,u3,v3)是平等的。因此我们找到三个必须为零的方程,即两个位置向量的差。事实上,由于每个向量都有 3 个分量,因此我们有 9 个方程,足以确定 6 个变量。

我们找到最小化的函数为:

def f(args):
    u1,v1,u2,v2,u3,v3,_,_,_ = args
    pos1 = position(a1,r1,u1,v1)
    pos2 = position(a2,r2,u2,v2)
    pos3 = position(a3,r3,u3,v3)
    return np.array([pos1 - pos2, pos1 - pos3, pos2 - pos3]).flatten()

fsolve需要相同数量的输入和输出参数。由于我们有 9 个方程,但只有 6 个变量,我只使用了 3 个虚拟变量,以便尺寸匹配。需要展平最后一行的数组,因为fsolve仅接受一维数组。

现在可以使用 fsolve 和(相当随机的)猜测找到交集:

guess = np.array([np.pi/4,np.pi/4,np.pi/4,np.pi/4,np.pi/4,np.pi/4,0,0,0])

x0 = fsolve(f,guess)
u1,v1,u2,v2,u3,v3,_,_,_ = x0

您可以通过将收到的角度插入到结果中来检查结果是否正确position功能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python:球体的交集 的相关文章

随机推荐

  • 有没有办法将 Bootstrap 3.0 插件与 jQuery.noConflict() 一起使用?

    目前 我们的页面上加载了 2 个不同版本的 jQuery 1 4 2 和 1 10 1 和 window jQuery 对象当前指向 1 4 2 我们使用版本 1 10 1 的 noConflict 将其设置为 jq1 var jq1 jQ
  • 如何在android中以编程方式阻止呼叫[重复]

    这个问题在这里已经有答案了 可能的重复 如何在 Android 中阻止来电 https stackoverflow com questions 1083527 how to block calls in android 我正在 Androi
  • 如何使用 cron 作业运行 python 文件

    您好 我创建了一个 python 文件 例如file example py 该文件将输出 sensex 值 假设该文件在linux系统上的路径为 Desktop downloads file example py 我通常会运行该文件pyth
  • 为什么控制台不显示从选择器返回的 jQuery 对象的方法?

    我知道如果我输入 正文 我得到一个 jQuery 对象 然而 在 chrome 的控制台上 我只能看到 jQuery 对象的内部数组 尽管事实上 jQuery 方法是可以访问的 例如 body hide 为什么控制台没有向我显示所有可访问的
  • 如何查询最近7天的总计?

    我正在使用 SQL Server 2008 我想编写一个查询来提供给定天数的总活动量 具体来说 我想统计过去 7 天每天的总票数 我的桌子看起来像这样 VoteID VoteDate Vote BikeID 1 2012 01 01 08
  • VBA中工作表变化的递归调用

    我已经创建了包含多个工作表的工作簿 我正在尝试使用 WorkSheet ChangeSheet1 即工作表 1 上的某些更改正在复制到工作表 2 中 同样 如果有任何改变Sheet2我想做出类似的改变Sheet1以及 这样做时 两张表上都会
  • envsubst 不能进行就地替换吗?

    我有一个配置文件 其中包含一些 ENV VARIABLE 样式的变量 This is my file It might contain EXAMPLES of text 现在我希望将该变量替换为保存在实际环境变量中的值 所以我正在尝试这个
  • 在哪里可以找到 .net CLR 和 C# 的源代码?

    Microsoft net CLR 和 C 的源代码是否开放 如果是 在哪里可以下载 浏览 您可以借助以下链接下载 NET 的源代码网络海量下载器 http netmassdownloader codeplex com
  • NServiceBus 与 Windows ServiceBus

    有人能够阐明新发布的 Windows ServiceBus 本地 而不是 Azure 和 NServiceBus 之间的差异吗 寻找详细的答案 Windows SB 可能缺少什么 因为我熟悉 NSErviceBus 可以做什么 它是真正的服
  • 字体更改时处理运行时活动配置

    某些设备配置可能会在运行时发生变化 例如屏幕方向 键盘可用性和语言 当发生这样的变化时 Android会重新启动正在运行的Activity 我们可以使用我们自己的配置来处理这个问题 onConfigurationChanged 但是 如果从
  • Android 权限 BIND_NOTIFICATION_LISTENER_SERVICE 不起作用

    我正在 React Native 应用程序中工作 我正在努力在 Android 中使用Notification Services BIND NOTIFICATION LISTENER SERVICE 我正在尝试使用读取传入的通知Notifi
  • pgAdmin 服务器未显示[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 这里总共有n00b 个问题 我正在使用 pgAdmin 尝试管理远程 PostgreSQL 服务器 我单击连接图标 填写表格 然后单击 确定 该表格消
  • 如果变量的值在编译时已知/未知,则进行专门化

    如何在编译时 在实际编译和运行程序之前 其参数之一的值已知 未知的情况下专门化模板函数 我还不知道怎么办 idea 1 include
  • Pygame - 如何使 hitbox 与敌人的移动一起工作?

    我正在用 Pygame 制作一个 Python 游戏 目前正在研究 hitbox 程序应该暂停 设置play False 每当玩家与敌人碰撞时 只有当我注释掉所有敌人的移动 第 56 64 行 时它才 有效 但这显然不是最好的选择 我读过有
  • 如何在点击事件上调用 Angular 组件 [Angular]

    我不是 Angular 方面的专家 我也遵循了互联网上的一些答案 特别this https stackoverflow com questions 17636528 how do i load an html page in a div u
  • 在 Postgres 中以周为单位分割间隔

    这是另一个关于日期的 SQL 问题 我正在使用 PHP 和 Postgres 构建一个日历应用程序 它将显示几天 几周甚至几个月的事件 每个事件都有开始日期和结束日期 按范围选择它们不是问题 然而 如果 Postgres 可以在每周的第一天
  • 使用继承的 ES6 React 类时未触发 componentDidMount 方法

    我试图在 React 中使用 ES6 类 并希望所有组件都继承某些方法 但是一旦我尝试扩展扩展 React Component 类的组件 componentDidMount 方法就不会触发 因此什么也不会发生被渲染 我正在使用的代码 基础组
  • python 和回文

    我最近写了一个循环的方法 usr share dict words并使用我的返回回文列表ispalindrome x 方法 这是一些代码 有什么问题吗 它只会停止 10 分钟 然后返回文件中所有单词的列表 def reverse a ret
  • 不兼容的类型:HomeFragment 无法转换为 Android 中的 Fragment

    我在这部分代码中遇到错误 private void displayView int position update the main content by replacing fragments Fragment fragment null
  • Python:球体的交集

    我对编程非常陌生 但我决定承担一个有趣的项目 因为我最近学会了如何以参数形式表示球体 当三个球体相交时 有两个不同的交点 除非它们仅在一个奇点处重叠 球体的参数表示 我的代码是根据答案修改的Python matplotlib 绘制 3d 立