1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
# -*- coding: utf-8 -*-
#
# Aaron Li
# 2015/06/19
"""
Class Region for regions on the spherical surface.
Used in astronomy to select/define a certian region, e.g, DS9.
"""
import sys
class Region(object):
"""
Basic region class for regions on the spherical surface,
similar definition as to DS9 regions.
Coordinate style: (ra, dec)
Unit: degree
ra: [0, 2\pi)
dec: [-\pi/2, \pi/2]
"""
# currently supported region types (similar to DS9)
REGION_TYPES = ["circle", "ellipse", "box", "annulus", "pie", "panda"]
def __init__(self, regtype, xc, yc,
radius=None, radius2=None,
width=None, height=None, rotation=None,
start=None, end=None):
if regtype.lower() not in self.REGION_TYPES:
raise ValueError("only following region types supported: %s" %\
" ".join(self.REGION_TYPES))
self.regtype = regtype.lower()
self.xc = xc
self.yc = yc
self.radius = radius
self.radius2 = radius2
self.width = width
self.height = height
self.rotation = rotation
def __repr__(self):
return "Region: %s" % self.regtype
def dump(self):
return {"regtype": self.regtype,
"xc": self.xc,
"yc": self.yc,
"radius": self.radius,
"radius2": self.radius2,
"width": self.width,
"height": self.height,
"rotation": self.rotation
}
def is_inside(self, point):
"""
Determine whether the given point is inside the region.
"""
x = point[0]
y = point[1]
if self.regtype == "box":
#print("WARNING: rotation box currently not supported!",
# file=sys.stderr)
xmin = self.xc - self.width/2.0
xmax = self.xc + self.width/2.0
ymin = self.yc - self.height/2.0
ymax = self.yc + self.height/2.0
if all([x >= xmin, x <= xmax, y >= ymin, y <= ymax]):
return True
else:
return False
else:
raise ValueError("region type '%s' currently not implemented" %\
self.regtype)
|