将圆切成相等的部分,Python

Slicing a circle in equal segments, Python

我有一套天上10000点的收盘价。它们是使用天空上的 RA(赤经)和 DEC(赤纬)绘制的。绘制时,它们呈圆形。

我想做的是 将圆切成 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)

我不知道如何在我的情况下执行此操作(即进入 8 个象限!!),其中 我只有数据点的 x、y 坐标!!

你应该使用 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 returns 从 x 轴到点的角度。通过将其划分为 pi/4 的间隔,您可以得到切片。但要注意 - atan2 returns -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)

首先,使用您的公式找到象限。然后可以通过比较 abs(x)abs(y).

来确定八分圆

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

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

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

含义:

  • arctan2
  • 计算每个点的角度-pi...pi
  • 平移 pi 使其成为正区间
  • 重新调整为 0..N-1
  • 转换为整数