/* [<][>][^][v][top][bottom][index][help] */
DEFINITIONS
This source file includes following definitions.
- GrpSimVectorData
- addPoline
- clr
- write
- write
- toLines
- add
- size
- XY
- DiagElem
- add
- setCol
- getCol
- get
- size
- delTail
- clr
- getType
- write
- write
- toString
- readStr
- Poline
- getType
- getKeyword
- write
- write
- toString
- 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;
}
*/
}