问题:给定一个球体列表,找到所有被球体完全包围的空白空间。
详细信息:这是我正在研究的一个问题,我试图确定位于蛋白质中的空腔。我得到了构成蛋白质的原子列表((x,y,z)坐标和半径)。然后我运行我的算法,通过检查是否可以将探针(给定半径)放置在一个位置而不与其他球体发生碰撞,从而找到位于蛋白质边界内的所有空白空间。有两种类型的空隙,空隙和空腔。空隙空间是可以通向蛋白质或位于蛋白质外部的空间。空腔是完全被蛋白质原子包围的空隙。这是我们正在处理的样本“蛋白质”的图片。
可以三个维度查看here .
在蛋白质的中心附近有一个空腔,您看到的穿过蛋白质的隧道将被视为空隙空间,因为它没有被原子完全包围。
示例:给定一个包含 26 个原子的列表,这些原子在 3 维网格中从 (0,0,0) 到 (1,1,1) 均匀分布。每个原子的半径为 0.25,并且位于任意轴上的 0、0.5 或 1 上。在点 (0.5, 0.5, 0.5) 处没有原子。如果我们要绘制这些原子的 3D 图形,它将是一个中心缺失的立方体形状。空腔将指定为 (0.5,0.5,0.5),半径为 0.25。可以假设这个空腔四周都被蛋白质包围。
示例图片:
请注意,以上只是立方体和蛋白质的二维表示。它实际上是 3D。
对于更大且形状不规则的原子组,如何确定空隙空间与空腔?
我正在考虑实现一个递归算法来检查每个方向以查看它是否可以达到图形的最大和最小边界,但我不确定这是否是正确的方法。
额外:是否有不同的算法会说示例中的空腔实际上是一个空隙空间,因为有非常小的“路径”可以到达蛋白质的外部?空腔必须完全被原子包围才能存在。任何具有通向蛋白质外部的路径(在任何方向上,不一定是笔直的)的空隙空间都不会被视为空腔。
最佳答案
很酷的问题。这是一个应该可以解决问题的算法:
S .diam(X)对于球体的直径 X dist(X,Y)距离 X至 Y ;这与到 X 中心的距离相同到 Y 的中心减去半径之和。A和 B , 检查是否 S可以直接在A的中心之间通过和 B (即 diam(S) <= dist(A,B) ?)。C , 检查是否 S可以同时触摸所有三个球体A , B , 和 C ,如果不存在其他球体。如果S可以同时触摸所有 3 个,在 A 的中心之间画一个三角形, B , 和 C .
S 中心的可能位置同时触摸 A和 B形成一个圆圈。你想知道这个圆上是否有一个小于 diam(S) + diam(C) 的点远离中心C .这是简单的几何学。S 中心的初始位置?从无限?您一次可以回答这个连接的组件。事实上,您甚至可以一次回答这个“边连接”组件,其中如果任何两个非顶点点可以通过不通过任何顶点的路径链接,则组件是边连接的。您可以通过简单的图形搜索来计算这些组件。S 的中心分开从无限。有几种方法可以做到这一点:
S 到达的三角形开始,并绘制从那里可以到达的每一张脸。这有点微妙,但该算法只是“从任何地方开始,排队边缘,将每条边缘交叉到与该边缘形成最小角度的面上,并在没有剩余边缘时停止。”请记住,同一个三角形的另一边可能是形成最小角度的面。第 3 步是正确的,因为如果你没有击中任何球体 C同时“围绕”A 之间的边缘“滚动”和 B ,那么您可以到达该边缘的任何一侧。换句话说,任何阻止你走向无穷大的位置都必须涉及 S触摸至少 3 个球体。
请注意,“特殊”情况会产生一些微妙之处,例如 S 时一次接触 4 个球体。您可以在执行第 3 步和第 4 步之前重新对形状进行三角测量,从而避免这些细微差别。
关于java - 确定一个球体是否被放置在它周围的其他球体完全包围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10392896/
我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/