001/*
002 * Copyright (c) 2009 The openGion Project.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *     http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
013 * either express or implied. See the License for the specific language
014 * governing permissions and limitations under the License.
015 */
016package org.opengion.hayabusa.io;
017
018import java.awt.Shape;
019import java.awt.Polygon;
020import java.awt.geom.Ellipse2D;
021import java.awt.geom.Rectangle2D;
022
023/**
024 * ShapeList は、LineRenderer で使用される Shape(line間のドット)の形状を
025 * 管理しているクラスです。
026 * 内部的には、●、▲、■、◆、縦●、▼、縦■、横●、右三角、横■、左三角
027 * という繰返しになります。
028 *
029 * @og.rev 4.1.1.0 (2008/02/18) 新規作成
030 *
031 * @version  0.9.0      2008/02/04
032 * @author       Kazuhiko Hasegawa
033 * @since        JDK1.6,
034 */
035public class ShapeList {
036
037        /** The shape sequence. */
038        private static final Shape[] SHAPES = createStandardSeriesShapes();
039        private static final int         SLEN = SHAPES.length;                  // 6.4.1.1 (2016/01/16) PMD refactoring. Field hashcode has the same name as a method
040
041        /**
042         * シェープリストのサイズを返します。
043         *
044         * @return      サイズ
045         */
046        public int size() {
047                return SLEN;
048        }
049
050        /**
051         * インデックスに基づいた、シェープ を返します。
052         *
053         * @param       index   インデックス
054         *
055         * @return      指定のシェープ
056         */
057        public Shape getShape( final int index ) {
058                return SHAPES[index % SLEN];
059        }
060
061        /**
062         * 内部で管理するシェープリストを初期作成します。
063         *
064         * @return      シェープリスト
065         */
066        private static Shape[] createStandardSeriesShapes() {
067
068                Shape[] result = new Shape[11];
069
070                final double size = 6.0;
071                final double delta = size / 2.0;
072                int[] xpoints = null;
073                int[] ypoints = null;
074
075                // circle、●
076                result[0] = new Ellipse2D.Double(-delta, -delta, size, size);
077
078                // up-pointing triangle、▲
079                xpoints = intArray(0.0, delta, -delta);
080                ypoints = intArray(-delta, delta, delta);
081                result[1] = new Polygon(xpoints, ypoints, 3);
082
083                // square、■
084                result[2] = new Rectangle2D.Double(-delta, -delta, size, size);
085
086                // diamond、◆
087                xpoints = intArray(0.0, delta, 0.0, -delta);
088                ypoints = intArray(-delta, 0.0, delta, 0.0);
089                result[3] = new Polygon(xpoints, ypoints, 4);
090
091                // vertical ellipse、縦●
092                result[4] = new Ellipse2D.Double(-delta / 2, -delta, size / 2, size);
093
094                // down-pointing triangle、▼
095                xpoints = intArray(-delta, +delta, 0.0);
096                ypoints = intArray(-delta, -delta, delta);
097                result[5] = new Polygon(xpoints, ypoints, 3);
098
099                // vertical rectangle、縦■
100                result[6] = new Rectangle2D.Double(-delta / 2, -delta, size / 2, size);
101
102                // horizontal ellipse、横●
103                result[7] = new Ellipse2D.Double(-delta, -delta / 2, size, size / 2);
104
105                // right-pointing triangle、右三角
106                xpoints = intArray(-delta, delta, -delta);
107                ypoints = intArray(-delta, 0.0, delta);
108                result[8] = new Polygon(xpoints, ypoints, 3);
109
110                // horizontal rectangle、横■
111                result[9] = new Rectangle2D.Double(-delta, -delta / 2, size, size / 2);
112
113                // left-pointing triangle、左三角
114                xpoints = intArray(-delta, delta, delta);
115                ypoints = intArray(0.0, -delta, +delta);
116                result[10] = new Polygon(xpoints, ypoints, 3);
117
118                return result;
119        }
120
121        /**
122         * 引数の double 配列(または、羅列)を、int に変換します。
123         * 変換は、切り捨てで、int の範囲を超える場合は、動作は保証されません。
124         *
125         * @param       val  double配列(または、羅列)
126         *
127         * @return      intに変換した結果の配列
128         */
129        private static int[] intArray( final double ... val ) {
130                int[] rtn = new int[val.length] ;
131                for( int i=0;i<val.length; i++ ) {
132                        rtn[i] = (int)val[i];
133                }
134
135                return rtn;
136        }
137}