我有一条光线,我需要找到它所触及的最近的线段.如果我先对行段进行排序,我认为可以在O(log n)时间内执行此操作,但我不记得如何对它们进行排序...我认为某种树最适合,但我如何排序它们的起点和终点都是?如果可能的话,我还想快速插入这个数据结构.
一条光线与一条线段有很多代码,但我需要一条光线对比很多线段...我不知道google的条款.
指向相应文章的链接很好,C++代码甚至更好.谢谢!:)
PS:线段实际上是非自相交多边形的边缘,按CCW顺序排序......但我认为以不同的方式对它们进行排序可能有一些优势?
这都是2D.
第二个想法,我不完全确定这是可能的.某种空间分区可能有所帮助,但除此之外,我无法想出任何方式对线进行排序,以便可以将它们与任意射线进行比较.
JavaScript的数学集合实现在哪里?它应该包括交叉,联合,补充和(对于奖励积分)笛卡尔积的有效实现.
不,这不是功课.我有一个yubikey,它是一个USB键盘,键入从16个密钥代码中选择的序列,键入一个128位的一次性密码(otp).为了使其更有用,软件应根据生成的字符检测键盘布局,并将这些字符映射回"us"布局中的内容,以便与现有后端兼容.
所以我有93个不同的16个字符序列,代表yubikey可以在430个键盘布局中输入的所有内容.(为此目的,许多布局都是相同的.)特定otp的可能映射是每个16个字符的序列,其中包含otp中的每个字符.
为了有效地找到它,我使用反向索引将每个可能的字符映射到使用该字符的键盘布局列表.答案是otp中每个唯一字符的反向索引的每个条目的交集.这几乎总是与1个元素结合在一起.
用一个很好的实现来编写这个跨浏览器会更容易Set().
我遇到了完成我的申请所需的数学问题,所以我正在寻求帮助.
给出2个(或更多,但基本上为2个)矩形,每个矩形有2个已知点:左上角(x1,y1)和右下角(x2,y2)(我可以找到这些信息的长度,如果是需要解决问题).
TL(x1, y1)
+-----------------+
| |
| | TL(x3, y3)
| | +---------------------------+
+-----------------+ | |
BR(x2, y2) +---------------------------+
BR(x4, y4)
Run Code Online (Sandbox Code Playgroud)
无论如何确定它们是否有交叉,在区域中,我的意思是,如果这个矩形的任何部分放在另一个的任何部分上?
我搜索并找到了一些帮助,但它没有解决问题:
有两种情况,两个矩形不会相交:
一个矩形的左边缘位于另一个矩形的右边缘的右侧,意味着第一个矩形的左边缘完全位于第二个矩形的右侧,没有交叉点.
一个矩形的右边缘位于另一个矩形的左边缘的左侧,意味着第一个矩形的右边缘完全位于第二个矩形的左侧,没有交叉点.
一个矩形的顶部边缘位于另一个矩形的底部边缘下方,意味着第一个矩形完全位于第二个矩形的下方,没有交叉点.
一个矩形的下边缘位于另一个矩形的上边缘上方,意味着第一个矩形完全位于第二个上方,没有交叉点.
所以我试图扭转条件,即如果没有发生上述4,则矩形可能会相交.但我仍然可以找到2个矩形不满足任何条件但仍然不相交的条件(如上图).
任何帮助都非常感谢,请告诉我这样做的方法或算法或代码(仅限JS和PHP).
非常感谢!
[X]
来自python我在delphi5中寻找与此python代码(sets)相当的东西:
>>> x = set("Hello")
>>> x
set(['H', 'e', 'l', 'o'])
>>> y = set("Hallo")
>>> y
set(['a', 'H', 'l', 'o'])
>>> x.intersection(y)
set(['H', 'l', 'o'])
Run Code Online (Sandbox Code Playgroud) 鉴于这两个矩阵:
m1 = [ 1 1;
2 2;
3 3;
4 4;
5 5 ];
m2 = [ 4 2;
1 1;
4 4;
7 5 ];
Run Code Online (Sandbox Code Playgroud)
我正在寻找一个功能,例如:
indices = GetIntersectionIndecies (m1,m2);
Run Code Online (Sandbox Code Playgroud)
其输出将是
indices =
1
0
0
1
0
Run Code Online (Sandbox Code Playgroud)
如何在不使用循环的情况下找到这两个矩阵之间的行的交集索引?
我在检测与THREE.js的物体交叉点时遇到了问题.我的对象正在从2D几何体中挤出,如下所示:
var geoShape = new THREE.Shape(vertexes);
var geometry = new THREE.ExtrudeGeometry(geoShape, { bevelEnabled: false, amount: 3 });
var mesh = THREE.SceneUtils.createMultiMaterialObject(geometry,
[new THREE.MeshLambertMaterial({ color: '#493D26' })]
);
scene.add(mesh);
Run Code Online (Sandbox Code Playgroud)
然后我试图检测这样的交叉点:
container.mousedown(function (e) {
event.preventDefault();
var vector = new THREE.Vector3((e.clientX / window.innerWidth) * 2 - 1, -(e.clientY / window.innerHeight) * 2 + 1, 0.5);
projector.unprojectVector(vector, camera);
var raycaster = new THREE.Raycaster(camera.position, vector.sub(camera.position).normalize());
var intersects = raycaster.intersectObjects(scene.children);
console.log(intersects);
});
Run Code Online (Sandbox Code Playgroud)
每次,我的相交数组都是空的.如果我向场景中添加一个球体,我会得到交叉点,但只有当我放大到z <18时才会有任何建议吗?
我有三张不同基因组间隔的表.这是一个例子:
> a
chr interval.start interval.end names
1 chr1 5 10 a
2 chr1 6 10 b
3 chr2 7 10 c
4 chr3 8 10 d
> b
chr interval.start interval.end names
1 chr1 6 15 e
2 chr1 7 15 f
3 chr1 8 15 g
> c
chr interval.start interval.end names
1 chr1 7 12 h
2 chr1 8 12 i
3 chr5 9 12 j
4 chr10 10 12 k
5 chr20 11 12 l
Run Code Online (Sandbox Code Playgroud)
我试图在将信息转换为GRanges后找到所有表之间的公共间隔.基本上我想做像交叉(c,intersect(a,b))之类的东西.但是,因为我正在使用基因组坐标,所以我必须使用GRanges和GenomicRanges包,我不熟悉. …
对于A[:,3:]也在数组中的数组中的每个元素B,我想将值设置为0,这将创建数组result
import numpy as np
A = np.array([[1, 1, 10, 101, 102, 103, 0, 0],
[2, 2, 10, 102, 108, 0, 0, 0],
[3, 3, 11, 101, 102, 106, 107, 108]])
B = np.array([101, 106, 108])
result = np.array([[1, 1, 10, 0, 102, 103, 0, 0],
[2, 2, 10, 102, 0, 0, 0, 0],
[3, 3, 11, 0, 102, 0, 107, 0]])
Run Code Online (Sandbox Code Playgroud)
我知道有一种方法可以使用in1d和广播A作为一维数组,但我不知道如何去做.
任何帮助将不胜感激.
我正在寻找找到两个不同大小的矩阵的交集的最有效方法。每个矩阵都有三个变量(列)和不同数量的观察值(行)。例如,矩阵A:
a = np.matrix('1 5 1003; 2 4 1002; 4 3 1008; 8 1 2005')
b = np.matrix('7 9 1006; 4 4 1007; 7 7 1050; 8 2 2003'; 9 9 3000; 7 7 1000')
Run Code Online (Sandbox Code Playgroud)
如果我将每列的公差设置为col1 = 1,,col2 = 2和col3 = 10,则需要一个函数,使其输出in a和in b分别在各自公差之内,例如:
[x1, x2] = func(a, b, col1, col2, col3)
print x1
>> [2 3]
print x2
>> [1 3]
Run Code Online (Sandbox Code Playgroud)
您可以通过索引看到的元素2 a在的元素1的公差内b。
我想我可以遍历矩阵的每个元素a,检查它是否在的每个元素的公差范围内b,然后这样做。但是,对于非常大的数据集而言,效率似乎很低。 …
我有一个多数组,如下面的例子.
$array = array (
'role_1' =>
array (
0 => 'value_2',
0 => 'value_3',
),
'role_2' =>
array (
0 => 'value_1',
1 => 'value_2',
),
'role_3' =>
array (
0 => 'value_2',
1 => 'value_3',
),
)
Run Code Online (Sandbox Code Playgroud)
我喜欢循环子数组以获得只有交集.数组是动态创建的,可以有很多子数组role_[x],也有很多子数组内的键/值.关键是没有必要的,只有价值.键也是计数,而不是字符串.
结果我喜欢在这个例子中得到这个小数组.
$array = array( 'value_2' )
role_1与子阵列相似的索引"数组名称" 在交叉后不再相关.在结果中对我来说很重要的是值,只有每个子数组中存在的值.
我曾尝试使用源代码,但我认为它可能更简单.
$value_stack = array();
$result = array();
$i = 0;
foreach( $settings_ as $role => $values ) {
foreach( $values as $value ){
if( in_array( $value,$value_stack …Run Code Online (Sandbox Code Playgroud)