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    }