    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}