LSSTApplications  16.0-11-g09ed895+2,16.0-11-g12e47bd,16.0-11-g9bb73b2+6,16.0-12-g5c924a4+6,16.0-14-g9a974b3+1,16.0-15-g1417920+1,16.0-15-gdd5ca33+1,16.0-16-gf0259e2,16.0-17-g31abd91+7,16.0-17-g7d7456e+7,16.0-17-ga3d2e9f+13,16.0-18-ga4d4bcb+1,16.0-18-gd06566c+1,16.0-2-g0febb12+21,16.0-2-g9d5294e+69,16.0-2-ga8830df+6,16.0-20-g21842373+7,16.0-24-g3eae5ec,16.0-28-gfc9ea6c+4,16.0-29-ge8801f9,16.0-3-ge00e371+34,16.0-4-g18f3627+13,16.0-4-g5f3a788+20,16.0-4-ga3eb747+10,16.0-4-gabf74b7+29,16.0-4-gb13d127+6,16.0-49-g42e581f7+6,16.0-5-g27fb78a+7,16.0-5-g6a53317+34,16.0-5-gb3f8a4b+87,16.0-6-g9321be7+4,16.0-6-gcbc7b31+42,16.0-6-gf49912c+29,16.0-7-gd2eeba5+51,16.0-71-ge89f8615e,16.0-8-g21fd5fe+29,16.0-8-g3a9f023+20,16.0-8-g4734f7a+1,16.0-8-g5858431+3,16.0-9-gf5c1f43+8,master-gd73dc1d098+1,w.2019.01
LSSTDataManagementBasePackage
rotateBBoxBy90.py
Go to the documentation of this file.
1 #
2 # LSST Data Management System
3 # Copyright 2014 LSST Corporation.
4 #
5 # This product includes software developed by the
6 # LSST Project (http://www.lsst.org/).
7 #
8 # This program is free software: you can redistribute it and/or modify
9 # it under the terms of the GNU General Public License as published by
10 # the Free Software Foundation, either version 3 of the License, or
11 # (at your option) any later version.
12 #
13 # This program is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 # GNU General Public License for more details.
17 #
18 # You should have received a copy of the LSST License Statement and
19 # the GNU General Public License along with this program. If not,
20 # see <http://www.lsstcorp.org/LegalNotices/>.
21 #
22 import numpy
23 
24 import lsst.geom
25 
26 __all__ = ["rotateBBoxBy90"]
27 
28 
29 def rotateBBoxBy90(bbox, n90, dimensions):
30  """!Rotate a bounding box by an integer multiple of 90 degrees
31 
32  @todo document dimensions better; what does it specify?
33 
34  @param bbox bbox to rotate
35  @param n90 number of quarter rotations to perform
36  @param dimensions dimensions of the parent grid
37  @return rotated bounding box
38  """
39  while n90 < 0:
40  n90 += 4
41  n90 %= 4
42 
43  # sin/cos of the rotation angle
44  s = 0
45  c = 0
46  if n90 == 0:
47  s = 0
48  c = 1
49  elif n90 == 1:
50  s = 1
51  c = 0
52  elif n90 == 2:
53  s = 0
54  c = -1
55  elif n90 == 3:
56  s = -1
57  c = 0
58  else:
59  raise ValueError("n90 must be an integer")
60 
61  centerPixel = lsst.geom.Point2I(int(dimensions[0]/2), int(dimensions[1]/2))
62 
63  xCorner = numpy.array([(corner.getX() - centerPixel[0])
64  for corner in bbox.getCorners()])
65  yCorner = numpy.array([(corner.getY() - centerPixel[1])
66  for corner in bbox.getCorners()])
67  x0 = int((c*xCorner - s*yCorner).min())
68  y0 = int((s*xCorner + c*yCorner).min())
69  x1 = int((c*xCorner - s*yCorner).max())
70  y1 = int((s*xCorner + c*yCorner).max())
71 
72  # Fiddle things a little if the detector has an even number of pixels so that square BBoxes
73  # will map into themselves
74 
75  if n90 == 1:
76  if dimensions[0]%2 == 0:
77  x0 -= 1
78  x1 -= 1
79  elif n90 == 2:
80  if dimensions[0]%2 == 0:
81  x0 -= 1
82  x1 -= 1
83  if dimensions[1]%2 == 0:
84  y0 -= 1
85  y1 -= 1
86  elif n90 == 3:
87  if dimensions[1]%2 == 0:
88  y0 -= 1
89  y1 -= 1
90 
91  LLC = lsst.geom.Point2I(centerPixel[0] + x0, centerPixel[1] + y0)
92  URC = lsst.geom.Point2I(centerPixel[0] + x1, centerPixel[1] + y1)
93 
94  newBbox = lsst.geom.Box2I(LLC, URC)
95 
96  dxy0 = centerPixel[0] - centerPixel[1]
97  if n90%2 == 1 and not dxy0 == 0:
98  newBbox.shift(lsst.geom.Extent2I(-dxy0, dxy0))
99 
100  return newBbox
int min
int max
An integer coordinate rectangle.
Definition: Box.h:54
def rotateBBoxBy90(bbox, n90, dimensions)
Rotate a bounding box by an integer multiple of 90 degrees.