001/**
002 * Copyright (c) 2011, The University of Southampton and the individual contributors.
003 * All rights reserved.
004 *
005 * Redistribution and use in source and binary forms, with or without modification,
006 * are permitted provided that the following conditions are met:
007 *
008 *   *  Redistributions of source code must retain the above copyright notice,
009 *      this list of conditions and the following disclaimer.
010 *
011 *   *  Redistributions in binary form must reproduce the above copyright notice,
012 *      this list of conditions and the following disclaimer in the documentation
013 *      and/or other materials provided with the distribution.
014 *
015 *   *  Neither the name of the University of Southampton nor the names of its
016 *      contributors may be used to endorse or promote products derived from this
017 *      software without specific prior written permission.
018 *
019 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
020 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
021 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
022 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
023 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
024 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
025 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
026 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
027 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
028 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
029 */
030package org.openimaj.image.feature.astheticode;
031
032import java.util.Arrays;
033
034import org.openimaj.image.contour.Contour;
035
036/**
037 * A detected Aestheticode
038 * 
039 * @author Sina Samangooei (ss@ecs.soton.ac.uk)
040 */
041public class Aestheticode {
042        /**
043         * The actual code
044         */
045        public int[] code;
046
047        /**
048         * The border object describing the shape of the code
049         */
050        public Contour root;
051
052        /**
053         * Construct with a code
054         * 
055         * @param code
056         *            the code
057         */
058        public Aestheticode(int[] code) {
059                this.code = code;
060                Arrays.sort(code);
061        }
062
063        /**
064         * Construct with another {@link Aestheticode}
065         * 
066         * @param acode
067         *            copy this {@link Aestheticode}
068         */
069        public Aestheticode(Aestheticode acode) {
070                this.code = acode.code.clone();
071                this.root = acode.root;
072        }
073
074        /**
075         * Construct with a border
076         * 
077         * @param root
078         *            the detected borders to construct a code from
079         */
080        public Aestheticode(Contour root) {
081                this.root = root;
082
083                this.code = new int[root.children.size()];
084                int i = 0;
085                for (final Contour child : root.children) {
086                        this.code[i++] = child.children.size();
087                }
088                Arrays.sort(code);
089        }
090
091        @Override
092        public int hashCode() {
093                return Arrays.hashCode(this.code);
094        };
095
096        @Override
097        public boolean equals(Object obj) {
098                if (!(obj instanceof Aestheticode)) {
099                        return false;
100                }
101
102                final Aestheticode that = (Aestheticode) obj;
103                if (that.code.length != this.code.length)
104                        return false;
105
106                for (int i = 0; i < this.code.length; i++) {
107                        if (this.code[i] != that.code[i])
108                                return false;
109                }
110
111                return true;
112        };
113
114        @Override
115        public String toString() {
116                String ret = "" + this.code[0];
117                for (int i = 1; i < code.length; i++) {
118                        ret += ":" + code[i];
119                }
120                return ret;
121        };
122}