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     */
016    package org.opengion.hayabusa.io;
017    
018    import java.awt.Shape;
019    import java.awt.Polygon;
020    import java.awt.geom.Ellipse2D;
021    import 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     */
035    public class ShapeList {
036    
037            /** The shape sequence. */
038            private static final Shape[] SHAPES = createStandardSeriesShapes();
039            private static final int         SIZE = SHAPES.length;
040    
041            /**
042             * シェープリスト?サイズを返します?
043             *
044             * @return      サイズ
045             */
046            public int size() {
047                    return SIZE;
048            }
049    
050            /**
051             * イン?クスに基づ?、シェー?を返します?
052             *
053             * @param       index   イン?クス
054             *
055             * @return      ??シェー?
056             */
057            public Shape getShape( final int index ) {
058                    return SHAPES[index % SIZE];
059            }
060    
061            /**
062             * ?で管?るシェープリストを初期作?します?
063             *
064             * @return      シェープリス?
065             */
066            private static Shape[] createStandardSeriesShapes() {
067    
068                    Shape[] result = new Shape[11];
069    
070                    double size = 6.0;
071                    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( 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    }