在相同的段中切圆,Python

时间:2015-07-14 10:01:22

标签: python geometry computational-geometry astronomy

我在天空中有一组近10000点。它们使用天空中的RA(右上升)和DEC(赤纬)绘制。绘制时,它们采用圆形。

enter image description here

我想要做的是 将圆圈切成8个相等的部分 并逐个删除每个部分并使用其余部分进行一些计算。

为此,我想到了这个插图,即使用弧切片。

我知道弧的等式由下式给出:

S = r * theta

其中

r --> radius
theta --> angle (in our case 45 degrees)

我想以某种方式喜欢这样做:

slice1 = []
for a,b in zip(ra,dec):
    if a>some value and a<some value and b>some value and b<some value:
        slice1.append(a,b)

如果它们是正方形,则变得非常简单,并且可以立即应用上述等式。

所以,一旦我得到了切片,我就可以做numpy.where()找出我的剩余部分。

只需提及min(RA),max(RA),min(DEC) and max(DEC),我就可以轻松将其切成四个切片。我为第一象限做的一个这样的例子将给我这个:

RA>0.0 and RA<max(RA) DEC>0.0 and DEC<max(DEC)

enter image description here

我不知道如何在我的情况下这样做(即进入8个象限!!),其中我只有我的数据点的x,y坐标!!

3 个答案:

答案 0 :(得分:5)

您应该使用math.atan2

angle = math.atan2(dec, ra)
if angle >= n*math.pi/4 and angle < (n+1)*math.pi/4:
    # point is inside slice number n

基本上,atan2将角度返回到x轴的点。通过将其划分为pi / 4的间隔,您可以获得切片。但要注意 - atan2返回-pi和pi之间的角度,因此您应该将切片从-4到3编号(或者您可以将pi添加到角度,或者以其他方式转换)。

编辑:修改你的代码,它看起来像这样:

slice1 = []
n = 0  #change 0 to desired slice number here (from -4 to 3)
for a,b in zip(ra,dec):
    angle = math.atan2(b,a)
    if angle >= n*math.pi/4 and angle < (n+1)*math.pi/4:
        slice1.append(a,b)

答案 1 :(得分:4)

您可以使用numpy运算符直接计算切片编号数组:

sliceno = numpy.int32((pi + numpy.arctan2(Y, X)) * (N / (2*pi)))

含义:

  • 使用-pi
  • 为每个点计算角度pi ... arctan2
  • pi移动以使其成为正间隔
  • 重新缩放至0 .. N-1
  • 转换为整数

答案 2 :(得分:2)

首先,使用您的公式找到象限。然后可以通过将abs(x)abs(y)进行比较来确定八分圆。

在下八分圆abs(x) >= abs(y)。另一个有abs(x) < abs(y)