1 package nom.tam.image.tile.operation; 2 3 /* 4 * #%L 5 * nom.tam FITS library 6 * %% 7 * Copyright (C) 1996 - 2024 nom-tam-fits 8 * %% 9 * This is free and unencumbered software released into the public domain. 10 * 11 * Anyone is free to copy, modify, publish, use, compile, sell, or 12 * distribute this software, either in source code form or as a compiled 13 * binary, for any purpose, commercial or non-commercial, and by any 14 * means. 15 * 16 * In jurisdictions that recognize copyright laws, the author or authors 17 * of this software dedicate any and all copyright interest in the 18 * software to the public domain. We make this dedication for the benefit 19 * of the public at large and to the detriment of our heirs and 20 * successors. We intend this dedication to be an overt act of 21 * relinquishment in perpetuity of all present and future rights to this 22 * software under copyright law. 23 * 24 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 25 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 26 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 27 * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR 28 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 29 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 30 * OTHER DEALINGS IN THE SOFTWARE. 31 * #L% 32 */ 33 34 import java.util.Arrays; 35 36 /** 37 * The area represented by a 2D tile in an image, including its location inside the image and its size. FITS tiles are 38 * always 2-dimentional, but really images of any dimensions may be covered with such tiles. 39 * 40 * @see nom.tam.image.ImageTiler 41 */ 42 public class TileArea { 43 44 private int[] startPoint; 45 46 private int[] endPoint; 47 48 /** 49 * Sets the pixel boundaries where this tile ends. Alternatively you can specify the tile size with 50 * {@link #size(int...)} 51 * 52 * @param newEndPoint the pixel indices along all image dimensions that specify where this tile ends. The tile will 53 * end before reaching these indices and will not include them. 54 * 55 * @return itself 56 * 57 * @see #start(int...) 58 * @see #size(int...) 59 */ 60 public TileArea end(int... newEndPoint) { 61 endPoint = Arrays.copyOf(newEndPoint, newEndPoint.length); 62 return this; 63 } 64 65 /** 66 * Returns the dimensionality of the tile area. 67 * 68 * @return The dimensionality of the tile area or 0 if the tile is uninitialized. 69 * 70 * @since 1.17 71 */ 72 public int dimension() { 73 return startPoint == null ? 0 : startPoint.length; 74 } 75 76 /** 77 * @param other the tile to test intersection with 78 * 79 * @return true if the tile intersects with the specified other tile? 80 * 81 * @throws IllegalArgumentException if the two tiles have different dimensionalities. 82 */ 83 public boolean intersects(TileArea other) throws IllegalArgumentException { 84 if (other.dimension() != dimension()) { 85 throw new IllegalArgumentException( 86 "Tiles of different dimensionalities (" + other.dimension() + " vs " + dimension() + "."); 87 } 88 89 for (int i = dimension(); --i >= 0;) { 90 if ((other.startPoint[i] >= endPoint[i]) || (startPoint[i] >= other.endPoint[i])) { 91 return false; 92 } 93 } 94 95 return true; 96 } 97 98 /** 99 * Sets the size of this tile area. Alternatively you can specify where the tiles ends in the image via 100 * {@link #end(int...)}. 101 * 102 * @param sizes the tile size in pixels. If the sizes are specified in the leading dimensions only, the tile sizes 103 * in the remaining dimensions will default to 1. 104 * 105 * @return itself 106 * 107 * @see #start(int...) 108 * @see #end(int...) 109 */ 110 public TileArea size(int... sizes) { 111 endPoint = new int[startPoint.length]; 112 for (int index = 0; index < startPoint.length; index++) { 113 endPoint[index] = startPoint[index] + (index < sizes.length ? sizes[index] : 1); 114 } 115 return this; 116 } 117 118 /** 119 * Sets the pixel boundaries where this tile begins. {@link #size(int...)} 120 * 121 * @param newStartPoint the pixel indices along all image dimensions that specify where this tile begins. The tile 122 * will include the pixels at the specified indices. 123 * 124 * @return itself 125 * 126 * @see #start(int...) 127 * @see #size(int...) 128 */ 129 public TileArea start(int... newStartPoint) { 130 startPoint = Arrays.copyOf(newStartPoint, newStartPoint.length); 131 return this; 132 } 133 }