root/graph/JavaPopWeb/src/jp/ac/nime/computer/grpsimulator/VecPr/GrpSimVectorData.java

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. GrpSimVectorData
  2. addPoline
  3. clr
  4. write
  5. write
  6. toLines
  7. add
  8. size
  9. XY
  10. DiagElem
  11. add
  12. setCol
  13. getCol
  14. get
  15. size
  16. delTail
  17. clr
  18. getType
  19. write
  20. write
  21. toString
  22. readStr
  23. Poline
  24. getType
  25. getKeyword
  26. write
  27. write
  28. toString
  29. readStr

package jp.ac.nime.computer.grpsimulator.VecPr;

import java.util.*;
import java.awt.*;
import java.awt.image.*;
import java.awt.geom.*;
/**
 * GrpSim用の座標指定タイプの画像データを表すクラス
 * 直線と矩形と楕円で構成される。
 * @author Kikuchi
 * @version 1.0.0
 */
public class GrpSimVectorData
{
        public static final int DIAGELEM_POLINE = 2;
        public static final String DIAGELEM_POLINE_WORD = "Poline";

        protected Vector v_;    // 図形
        
        /** コンストラクタ
         */
        public GrpSimVectorData() {
                v_ = new Vector(0, 100);        
        }
        // ライン設定
        public void addPoline(int num, int[] x, int[] y) {
                Poline poline = new Poline();
                for (int i = 0; i < num; i ++) {
                        poline.add(x[i], y[i]);
                }
                v_.add(poline);
        }
        
        /** クリア
         */
        public void clr() {
                for (int i = 0; i < v_.size(); i ++) {
                        DiagElem de = (DiagElem)v_.get(i);
                        de.clr();
                }
                v_.clear();
        }
        
        /** 描画
         * @param img 描画バッファ
         */
        public void write(BufferedImage img) {
                Graphics2D g = img.createGraphics();
                for (int i = 0; i < v_.size(); i ++) {
                        DiagElem de = (DiagElem)v_.get(i);
                        de.write(g);
                }
                g.dispose();
        }

        /** 描画 Zoom対応
         * @param img 描画バッファ
         * @param nZoom 拡大率(パーセント)
         * @param ofx   nZoom後の座標をoffsetして描画する
         * @param ofy   nZoom後の座標をoffsetして描画する
         */
        public void write(BufferedImage img, int nZoom, int ofx, int ofy) {
                Graphics2D g = img.createGraphics();
                for (int i = 0; i < v_.size(); i ++) {
                        DiagElem de = (DiagElem)v_.get(i);
                        de.write(g, nZoom, ofx, ofy);
                }
                g.dispose();
        }
        /** 文字列の配列にする。
         */
        public String[] toLines() {
                String[] lines = new String[v_.size()];
                for (int i = 0; i < v_.size(); i ++) {
                        DiagElem de = (DiagElem)v_.get(i);
                        lines[i] = de.toString();
                }
                return lines;
        }
        
        /** 文字列をデータに変換して記憶
         * @param str ファイルから読み込んだ1lineデータ
         */
        public void add(String str) {
                if (str.startsWith(DIAGELEM_POLINE_WORD)) {
                        Poline l = new Poline();
                        l.readStr(str);
                        v_.add(l);
                }
        }
        
        /** 構成図形要素の数を取得する
         * @return DiagElemの要素数
         */
        public int size() {
                return v_.size();
        }
        
        /** 点を表すクラス
         */
        public class XY {
                public XY(int x, int y) {
                        x_ = x;
                        y_ = y;
                }
                public int x_;
                public int y_;
        }

        /** 点列を現すクラス
         */
        public abstract class DiagElem {
                
                protected Vector        v_;                     // 点列
                protected Color         col_;           // 線の描画色
                protected int           thick_;         // 線の太さ

                public DiagElem() {
                        v_ = new Vector(0, 100);
                        setCol(0, 0, 0);        // 黒
                }
                public void add(int x, int y) {
                        v_.add(new XY(x, y));
                }
                public void setCol(int r, int g, int b) {
                        col_ = new Color(r, g, b);
                }
                public int getCol() {
                        return col_.getRGB();
                }
                public XY get(int n) {
                        if (n >= v_.size()) return null;
                        return (XY)v_.get(n);
                }
                public int size() {
                        return v_.size();
                }
                public void delTail() {
                        v_.remove(v_.size() - 1);
                }
                public void clr() {
                        v_.clear();
                }
                /** 図形要素のタイプを取得
                 */
                public abstract int getType();
                /** 描画
                 * @param g 描画先 Graphics2D 
                 */
                public abstract void write(Graphics2D g);
                /** 拡大縮小描画関数
                 * @param g 描画先 Graphics2D
                 * @param nZoom 拡大率(パーセント)
                 * @param ofx   nZoom後の座標をoffsetして描画する
                 * @param ofy   nZoom後の座標をoffsetして描画する
                 */
                public abstract void write(Graphics2D g, int nZoom, int ofx, int ofy);
                
                /** ファイルに書き出す時の文字列
                 * @return ファイルに書き出す時の文字列
                 */
                public abstract String toString();
                
                /** ファイルから読み出すときの関数
                 * @param str ファイルから読み出された一行
                 * @return 1:成功  0:このクラスに該当する文でない  -1:文法エラー
                 */
                public abstract int readStr(String str);
                
        }
        public class Poline extends DiagElem {
                /** 直線であることを返す
                 */
                public int getType() {
                        return DIAGELEM_POLINE;
                }
                /** キーワードを返す
                 */
                public String getKeyword() {
                        return DIAGELEM_POLINE_WORD;
                }
                
                /** 描画
                 * @param g 描画先 Graphics2D 
                 */
                public void write(Graphics2D g) {
                        g.setPaint(col_); // 色
                        // 図形
                        for (int i = 0; i < (v_.size() - 1); i ++) {
                                // 一つのライン
                                XY xy1 = get(i);
                                XY xy2 = get(i + 1);
                                g.draw(new Line2D.Double(xy1.x_, xy1.y_, xy2.x_, xy2.y_));
                        }
                }
                /** 拡大縮小描画関数
                 * @param g 描画先 Graphics2D
                 * @param nZoom 拡大率(パーセント)
                 * @param ofx   nZoom後の座標をoffsetして描画する
                 * @param ofy   nZoom後の座標をoffsetして描画する
                 */
                public void write(Graphics2D g, int nZoom, int ofx, int ofy) {
                        g.setPaint(col_); // 色
                        // 図形
                        for (int i = 0; i < (v_.size() - 1); i ++) {
                                // 一つのライン
                                int x1, y1, x2, y2;
                                x1 = (get(i).x_ * nZoom / 100) + ofx;
                                y1 = (get(i).y_ * nZoom / 100) + ofy;
                                x2 = (get(i + 1).x_ * nZoom / 100) + ofx;
                                y2 = (get(i + 1).y_ * nZoom / 100) + ofy;
                                g.draw(new Line2D.Double(x1, y1, x2, y2));
                        }                       
                }
                                                                                                                                
                /** ファイルに書き出す時の文字列
                 * @return ファイルに書き出す時の文字列
                 */
                public String toString() {
                        StringBuffer sb= new StringBuffer();
                        String ten = ", ";
                        // 最初にLineを示す記号
                        sb.append("Poline ");
                        // 次にラインのカラーを示す RGB
                        StringBuffer cs = new StringBuffer("00000000");
                        cs.append(Integer.toHexString(col_.getRGB()));
                        //sb.append("0x");
                        sb.append(cs.substring(cs.length() - 6, cs.length()));
                        sb.append(ten);
                        // 次に点の数を示す 数
                        sb.append(v_.size());
                        // 個数分の点のデータ
                        for (int i = 0; i < v_.size(); i ++) {
                                String str = new String(", " + get(i).x_ + ", " + get(i).y_);
                                sb.append(str);
                        }
                        return sb.toString();                                                    
                }
                /** ファイルから読み出すときの関数
                 * @param str ファイルから読み出された一行
                 * @return 1:成功  0:このクラスに該当する文でない  -1:文法エラー
                 */
                public int readStr(String str) {
                        // 先頭が Polineか調べる
                        if (!str.startsWith("Poline")) return 0;
                        
                        clr();  // 全部捨てる
                        try {
                                StringTokenizer st = new StringTokenizer(str.substring(6, str.length()), ",");
                                
                                // カラーデータを取り出す
                                int col = Integer.parseInt(st.nextToken().trim(), 16);
                                col_ = new Color(col);
                                // 点の数を取り出す
                                int numPT = Integer.parseInt(st.nextToken().trim());
                                while (st.hasMoreTokens()) {    
                                        // nextToken() で読んで行く
                                        int x = Integer.parseInt(st.nextToken().trim());
                                        int y = Integer.parseInt(st.nextToken().trim());
                                        add(x, y);
                                }
                        } catch ( Exception e ) {
                                System.out.println("Error Poline#readStr");
                                e.printStackTrace();
                                return -1;
                        }
                        return 1;
                }
        }
/*
        public class Box extends DiagElem {
                public static final int DIAGELEM_BOX = 3;
        }
        public class Circle extends DiagElem {
                public static final int DIAGELEM_CIRCLE = 4;
        }
*/
}

/* [<][>][^][v][top][bottom][index][help] */