* このクラスのインスタンスは生成しない。
* @author 中田豊久
*/
class CNode {
/**
* x軸の位置
*
* 座標軸は以下の様。
*
* |
* ----+----> x plus
* |
* ↓y plus
*
*/
double m_dX;
/** y軸の位置
座標軸は{@link #m_dX}参照。 */
double m_dY;
/** 移動可能な最大のx軸の値 */
int m_nMaxX;
/** 移動可能な最大のy軸の値 */
int m_nMaxY;
/** 色。但し、nodeに画像が割り当てられている時は無視される。 */
Color m_color;
/** CArea ポインタ */
CArea m_Area;
/** 寿命を表現する変数。この変数の値だけ、寿命確認関数
* {link #IsLifeOK()}がコールされると、このノードは消滅する。*/
int m_nSpanOfLife;
/** コンストラクタ
* @param x 使用しない
* @param y 使用しない
* @param area nodeを配置する{@link CArea}クラス。
*/
CNode(int x,int y,CArea area){
m_Area = area;
m_color = Color.black;
// 寿命は、CParameters::m_nSpanOfLifeMaxとCParameters::m_nSpanO
// fLifeMinの間でランダムに設定される。
m_nSpanOfLife = (int)((ComplexPanel.m_Parameters.m_nSpanOfLifeMax -
ComplexPanel.m_Parameters.m_nSpanOfLifeMin) *
Math.random()) + ComplexPanel.m_Parameters.m_nSpanOfLifeMin;
}
/** x軸の値を取得する。 */
double getX(){return m_dX;}
/** x軸の値をセットする。
* @param x x軸の値 */
void setX(double x){m_dX = x;}
/** y軸の値を取得する。 */
double getY(){return m_dY;}
/** y軸の値をセットする。
* @param y y軸の値 */
void setY(double y){m_dY = y;}
/** 幅を取得する。 */
int getWidth(){return ComplexPanel.m_Parameters.m_nWidth;}
/** 高さを取得する。 */
int getHeight(){return ComplexPanel.m_Parameters.m_nHeight;}
/** スピードを取得する。 */
double getSpeed(){return 0;}
/**
* node位置を再計算する時にコールされる。
* {@link CRelation#recalc(CNode obj,CNode comp)}との違いは、この関
* 数は他のnodeとは関係なく動作するコードを記述して、CRelation.reca
* lcは2つのnodeがどのように影響しあうかを記述する。*/
void recalc(){}
/** node位置の再計算がすべて終了したことを通知する関数 */
void endRecalc(){}
/** 描画関数
* @param g Graphics*/
public void paint(Graphics g){
g.setColor(m_color);
g.fillRect((int)m_dX,(int)m_dY,getWidth(),getHeight());
return;
}
/** 寿命確認関数 この関数が、{link #m_nSpanOfLife}回数コールされると
* ノードは消滅する */
boolean IsLifeOK(){
/*
if(m_nSpanOfLife == 0)
return false;
m_nSpanOfLife--;
return true;
*/
return true;
}
}
/**
* node間の関係を実装するためのテンプレートインターフェース。
*
* 基本的なRelation派生Classの作り方
* クラス名
* XXX_YYY XXXクラスがYYYクラスに影響を受ける
* 注意 YYY_XXX とは別物
* (片方が影響されるだけの物もある)
*
* @author 中田豊久
*/
interface CRelation {
/** nodeの再計算の方法を定義する。{@link CNode#recalc()}を参照。
* @param obj 再計算する対象のnode
* @param comp nodeに影響を与えるnode */
void recalc(CNode obj,CNode comp);
/** nodeが関係するか、しないかを定義する。この関数で、trueを返すと
* 引数の第一引数のobj nodeは、第二引数のcomp nodeに影響を受けると
* 解釈される。falseの場合は影響を受けないと解釈される。
* @param obj 影響を受けるか、受けないかの対象となるnode
* @param comp 影響を与えるか、与えないかの対象となるnode */
boolean isRelation(CNode obj,CNode comp);
}
/**
* {@link CRelation}実装時に使用可能なテンプレートコードをまとめたクラス。
* CRelation派生クラスでこのクラスの静的関数をコールしても、独自に関数を
* 作成しても構わない。
* このクラスは、ボイド間が仲良くなる(近づきあう)関係を表現している。
* @author 中田豊久
*/
class CRelationSampleFriend {
static boolean isRelation(CNode obj,CNode comp,double dCircle){
if(dCircle >=
Math.sqrt(Math.pow(obj.getX()-comp.getX(),2)+Math.pow(obj.getY()-comp.getY(),2))){
return true;
}
return false;
}
static void recalc(CNode obj,CNode comp){
if(obj instanceof CNodeMove){
CNodeMove node = (CNodeMove)obj;
if(comp instanceof CNodeMove){
CNodeMove mate = (CNodeMove)comp;
// 角度の計算
double divRad = mate.getRad() - node.getRad();
// divRad の範囲は -Math.PI <= divRad < Math.PI
if(divRad < -Math.PI)
divRad += 2*Math.PI;
else if(divRad >= Math.PI)
divRad -= 2*Math.PI;
double divPos = Math.sqrt(
Math.pow(mate.getX()-node.getX(),2)+Math.pow(mate.getY()-node.getY(),2));
if(ComplexPanel.m_Parameters.m_dCircle == 0){
System.out.println("Error dCircle");
}else{
node.addRadNext(divRad* (((2*divPos)/ComplexPanel.m_Parameters.m_dCircle)-1) *
ComplexPanel.m_Parameters.m_dEffectRelateRad);
}
/* ある程度の良い位置関係に、関連するnodeがあるときに、色を
* 変えるテスト。
double range = ComplexPanel.m_Parameters.m_dCircle/3;
if(divPos >= ((ComplexPanel.m_Parameters.m_dCircle-range)/2) &&
divPos <= (((ComplexPanel.m_Parameters.m_dCircle-range)/2)+range)){
node.NearColor();
}
/**/
}
// Speedの計算
double divSpeed = comp.getSpeed() - node.getSpeed();
node.addSpeedNext(divSpeed*ComplexPanel.m_Parameters.m_dEffectRelateSpeed);
/* 他のnodeに影響を受けている時に色を変更する
node.NearColor();
/**/
}
}
}
/**
* {@link CRelation}実装時に使用可能なテンプレートコードをまとめたクラス。
* CRelation派生クラスでこのクラスの静的関数をコールしても、独自に関数を
* 作成しても構わない。
* このクラスは、嫌いあう(遠ざけあう)関係を表現している。
* @author 中田豊久
*/
class CRelationSampleHate {
static void recalc(CNode obj,CNode comp){
if(obj instanceof CNodeMove){
CNodeMove node = (CNodeMove)obj;
CVector vec =
new CVector(comp.getX()-node.getX(),comp.getY()-node.getY());
double mateRad = vec.getRad()+Math.PI;
if(mateRad < 0)
mateRad += 2*Math.PI;
else if(mateRad >= 2*Math.PI)
mateRad -= 2*Math.PI;
double divRad = mateRad - node.getRad();
// divRad の範囲は -Math.PI <= divRad < Math.PI
if(divRad < -Math.PI)
divRad += 2*Math.PI;
else if(divRad >= Math.PI)
divRad -= 2*Math.PI;
node.addRadNext(divRad*ComplexPanel.m_Parameters.m_dEffectRelateHateRad);
/* 他のnodeに影響を受けている時に色を変更する
node.NearColor();
/**/
}
}
}
/**
* 他のNodeに全く影響を受けないNode。自分勝手に動き回る。
* @author 中田豊久
*/
class CNodeMove extends CNode{
/**
*
* 進む方向を角度(rad)で表現する
* 3/2 PI rad
* |
* PI rad --+--> 0 rad
* |
* 1/2 PI rad
*/
double m_dRad;
/** 計算結果を保持する。*/
double m_dRadNext;
/**
* スピードを表現する。値1は、1 pixel / 一回の再計算
*/
double m_dSpeed;
/** 計算結果を保持する。*/
double m_dSpeedNext;
/** 計算結果を保持する。*/
double m_dXNext;
/** 計算結果を保持する。*/
double m_dYNext;
/** 方向性変更、スピード変更のイベント発生頻度を指定する。詳細は
* {@link CParameters#m_dNormalOccor}を参照。 */
double m_dOccor;
/** 方向変更の割合を指定する。詳細は{@link CParameters#m_dNormalOccor}
* を参照。*/
double m_dDiv;
/** x軸の値をセット */
void setX(double x){
m_dXNext = m_dX = x;
}
/** y軸の値をセット */
void setY(double y){
m_dYNext = m_dY = y;
}
/** コンストラクタ */
CNodeMove(int x,int y,CArea area){
super(x,y,area);
m_dRadNext = m_dRad = Math.random()*2*Math.PI;
m_dXNext = m_dX = x * Math.random();
m_dYNext = m_dY = y * Math.random();
m_dSpeedNext = m_dSpeed = ComplexPanel.m_Parameters.m_dSpeed;
m_nMaxX = x;
m_nMaxY = y;
DefaultOccor();
DefaultColor();
}
/** 通常時の方向変更、速度変更の頻度と割合をセットする。 */
void DefaultOccor(){
m_dOccor = ComplexPanel.m_Parameters.m_dNormalOccor;
m_dDiv = ComplexPanel.m_Parameters.m_dNormalDiv;
}
/** 異常時の方向変更、速度変更の頻度と割合をセットする。 */
void MoreOccor(){
m_dOccor = ComplexPanel.m_Parameters.m_dMoreOccor;
m_dDiv = ComplexPanel.m_Parameters.m_dMoreDiv;
}
/** 通常使用する色を指定する。 */
void DefaultColor(){
m_color = Color.magenta;
}
/** 他のnodeと関係を持っている時の色を指定する。*/
void NearColor(){
m_color = ComplexPanel.m_Parameters.m_NearColor;
}
/** 幅を取得する。 */
int getWidth(){
if(getNodeImage()==null)
return ComplexPanel.m_Parameters.m_nWidth;
else{
int x;
while(-1==(x=getNodeImage()[0].getWidth(null)));
return x;
}
}
/** 高さを取得する。 */
int getHeight(){
if(getNodeImage()==null)
return ComplexPanel.m_Parameters.m_nHeight;
else{
int x;
while(-1==(x=getNodeImage()[0].getHeight(null)));
return x;
}
}
/** 角度を取得する。 */
double getRad(){return m_dRad;}
void addRadNext(double rad){
m_dRadNext += rad;
regularRadNext();
}
/** 角度を0 <= x < 2*Math.PIに変換する。 */
void regularRadNext(){
if(m_dRadNext >= (2*Math.PI))
m_dRadNext -= (2*Math.PI);
else if(m_dRadNext < 0)
m_dRadNext += (2*Math.PI);
return;
}
/** スピードに引数の値を追加する。 */
void addSpeedNext(double speed){
m_dSpeedNext += speed;
}
/** スピードをパラメータで示された最大値{@link CParameters#m_dSpeedMax}
* 、最小値{@link CParameters#m_dSpeedMin}の間に変換する。 */
void regularSpeedNext(){
if(m_dSpeedNext > ComplexPanel.m_Parameters.m_dSpeedMax)
m_dSpeedNext = ComplexPanel.m_Parameters.m_dSpeedMax;
else if(m_dSpeedNext < ComplexPanel.m_Parameters.m_dSpeedMin)
m_dSpeedNext = ComplexPanel.m_Parameters.m_dSpeedMin;
}
/** スピードを取得する。 */
double getSpeed(){return m_dSpeed;}
/** 自分の位置を再計算する。 */
void recalc(){
if(Math.random() <= m_dOccor){
addRadNext((Math.random()-0.5)/m_dDiv);
addSpeedNext((Math.random()-0.5)*ComplexPanel.m_Parameters.m_dEffectSpeed);
}
DefaultOccor();
return;
}
/** 再計算終了時に、スピード、角度を調整し、新しいx軸、y軸の値をセ
* ットする。*/
void endRecalc(){
// m_dRadNextの最大値を設定する
double var = m_dRadNext-m_dRad;
if(var < -ComplexPanel.m_Parameters.m_dChangeRadMax){
m_dRadNext = m_dRad-ComplexPanel.m_Parameters.m_dChangeRadMax;
regularRadNext();
}else if(var > ComplexPanel.m_Parameters.m_dChangeRadMax){
m_dRadNext = m_dRad+ComplexPanel.m_Parameters.m_dChangeRadMax;
regularRadNext();
}
// Speedの値を調整する
double varSpeed = m_dSpeedNext-m_dSpeed;
if(varSpeed < -ComplexPanel.m_Parameters.m_dChangeSpeedMax)
m_dSpeedNext = m_dSpeed-ComplexPanel.m_Parameters.m_dChangeSpeedMax;
else if(varSpeed > ComplexPanel.m_Parameters.m_dChangeSpeedMax)
m_dSpeedNext = m_dSpeed+ComplexPanel.m_Parameters.m_dChangeSpeedMax;
regularSpeedNext();
/* アプレットのサイズの枠の中でnodeが動く場合のコード
* アプレットの端にnodeがぶつかるようになる。
m_dXNext += getSpeed() * Math.cos(m_dRadNext);
if((int)m_dXNext+getWidth() > m_nMaxX){
m_dXNext = m_nMaxX-getWidth();
MoreOccor();
}else if(m_dXNext < 0.0){
m_dXNext = 0.0;
MoreOccor();
}
m_dYNext += getSpeed() * Math.sin(m_dRadNext);
if((int)m_dYNext+getHeight() > m_nMaxY){
m_dYNext = m_nMaxY-getHeight();
MoreOccor();
}else if(m_dYNext < 0.0){
m_dYNext = 0.0;
MoreOccor();
}
/**/
/* 枠を無視した仮想無限の空間でnodeを動作させる時のコード。左右
* 、上下がつながっていて、例えば右から出たnodeは即座に左から画
* 面に入ってくる。
*/
m_dXNext += getSpeed()*Math.cos(m_dRadNext);
if(m_dXNext<0)
m_dXNext += m_nMaxX-getWidth();
else
m_dXNext %= m_nMaxX-getWidth();
m_dYNext += getSpeed()*Math.sin(m_dRadNext);
if(m_dYNext<0)
m_dYNext += m_nMaxY-getHeight();
else
m_dYNext %= m_nMaxY-getHeight();
/**/
return;
}
/**
* 描画関数
*/
public void paint(Graphics g){
m_dRad = m_dRadNext;
m_dX = m_dXNext;
m_dY = m_dYNext;
m_dSpeed = m_dSpeedNext;
Image nodeImage[]=null;
if(null == (nodeImage=getNodeImage())){
g.setColor(m_color);
g.fillRect((int)m_dX,(int)m_dY,
getWidth(),getHeight());
/* 現在のスピードを表示する
g.drawString(""+getSpeed(),(int)m_dX,(int)m_dY);
/**/
DefaultColor();
}else{
int n = (int)(m_dRad*getNodeImageCount()/(2*Math.PI));
g.drawImage(ComplexPanel.m_Parameters.m_imageCNodeMove[n],
(int)m_dX,(int)m_dY,null);
}
}
/** nodeのイメージ画像を取得する。{@link CParameters#m_imageCNodeMove}
* 参照。*/
Image[] getNodeImage(){
return ComplexPanel.m_Parameters.m_imageCNodeMove;
}
/** nodeのイメージ画像数を取得する。{@link CParameters#m_nImageCNodeMoveCount}
* 参照 */
int getNodeImageCount(){
return ComplexPanel.m_Parameters.m_nImageCNodeMoveCount;
}
}
/**
* {@link CNodeMove}が{@link CNodeHate}に影響を受けるコード
* @author 中田豊久
*/
class CNodeMove_CNodeHate implements CRelation {
public boolean isRelation(CNode obj,CNode comp){
return CRelationSampleFriend.isRelation(
obj,comp,ComplexPanel.m_Parameters.m_dCircle*2);
}
public void recalc(CNode obj,CNode comp){
CRelationSampleFriend.recalc(obj,comp);
return;
}
}
/**
* {@link CNodeMove}が{@link CNodeHateNomove}に影響を受けるコード
* @author 中田豊久
*/
class CNodeMove_CNodeHateNomove implements CRelation {
public boolean isRelation(CNode obj,CNode comp){
return CRelationSampleFriend.isRelation(
obj,comp,ComplexPanel.m_Parameters.m_dCircle*2);
}
public void recalc(CNode obj,CNode comp){
CRelationSampleHate.recalc(obj,comp);
return;
}
}
/**
* 他のNodeに影響を受けるNode
* @author 中田豊久
*/
class CNodeInfluence extends CNodeMove {
CNodeInfluence(int x,int y,CArea area){
super(x,y,area);
}
void DefaultColor(){
m_color = ComplexPanel.m_Parameters.m_NormalColor;
}
/*
* 描画関数 (nodeの周りに影響を受ける範囲の円を描画するためにだけに
* オーバライドした関数。
public void paint(Graphics g){
super.paint(g);
// 影響を受ける円のを描画する
g.setColor(Color.black);
g.drawOval(
(int)(m_dX-ComplexPanel.m_Parameters.m_dCircle),
(int)(m_dY-ComplexPanel.m_Parameters.m_dCircle),
(int)(ComplexPanel.m_Parameters.m_dCircle*2),
(int)(ComplexPanel.m_Parameters.m_dCircle*2));
}
*/
}
/**
* {@link CNodeInfluence}が{@link CNodeMove}に影響を受けるコード
* @author 中田豊久
*/
class CNodeInfluence_CNodeMove implements CRelation {
public void recalc(CNode obj,CNode comp){
CRelationSampleFriend.recalc(obj,comp);
}
public boolean isRelation(CNode obj,CNode comp){
return CRelationSampleFriend.isRelation(obj,comp,ComplexPanel.m_Parameters.m_dCircle);
}
}
/**
* {@link CNodeInfluence}が{@link CNodeInfluence}に影響を受けるコード
* @author 中田豊久
*/
class CNodeInfluence_CNodeInfluence implements CRelation {
public boolean isRelation(CNode obj,CNode comp){
return CRelationSampleFriend.isRelation(obj,comp,ComplexPanel.m_Parameters.m_dCircle);
}
public void recalc(CNode obj,CNode comp){
CRelationSampleFriend.recalc(obj,comp);
return;
}
}
/**
* {@link CNodeInfluence}が{@link CNodeInfluenceNomove}に影響を受けるコード
* @author 中田豊久
*/
class CNodeInfluence_CNodeInfluenceNomove implements CRelation {
public boolean isRelation(CNode obj,CNode comp){
return CRelationSampleFriend.isRelation(
obj,comp,ComplexPanel.m_Parameters.m_dCircle);
}
public void recalc(CNode obj,CNode comp){
CRelationSampleFriend.recalc(obj,comp);
return;
}
}
/**
* {@link CNodeInfluence}が{@link CNodeHate}に影響を受けるコード
* @author 中田豊久
*/
class CNodeInfluence_CNodeHate implements CRelation {
public boolean isRelation(CNode obj,CNode comp){
return CRelationSampleFriend.isRelation(
obj,comp,ComplexPanel.m_Parameters.m_dCircle*2);
}
public void recalc(CNode obj,CNode comp){
CRelationSampleHate.recalc(obj,comp);
return;
}
}
/**
* {@link CNodeInfluence}が{@link CNodeHateNomove}に影響を受けるコード
* @author 中田豊久
*/
class CNodeInfluence_CNodeHateNomove implements CRelation {
public boolean isRelation(CNode obj,CNode comp){
return CRelationSampleFriend.isRelation(
obj,comp,ComplexPanel.m_Parameters.m_dCircle*2);
}
public void recalc(CNode obj,CNode comp){
CRelationSampleHate.recalc(obj,comp);
return;
}
}
/**
* 周りから嫌われるNode
* @author 中田豊久
*/
class CNodeHate extends CNodeMove {
CNodeHate(int x,int y,CArea area){
super(x,y,area);
}
void DefaultColor(){
m_color = Color.red;
}
void NearColor(){
super.NearColor();
m_color = Color.pink;
}
/*
int getWidth(){return (int)((double)super.getWidth()*1.5);}
int getHeight(){return (int)((double)super.getHeight()*1.5);}
*/
Image[] getNodeImage(){return null;}
}
/**
* {@link CNodeHate}が{@link CNodeInfluence}に影響を受けるコード
* @author 中田豊久
*/
class CNodeHate_CNodeInfluence implements CRelation {
public boolean isRelation(CNode obj,CNode comp){
return CRelationSampleFriend.isRelation(
obj,comp,ComplexPanel.m_Parameters.m_dCircle);
}
public void recalc(CNode obj,CNode comp){
CRelationSampleHate.recalc(obj,comp);
return;
}
}
/**
* {@link CNodeHate}が{@link CNodeInfluenceNomove}に影響を受けるコード
* @author 中田豊久
*/
class CNodeHate_CNodeInfluenceNomove implements CRelation {
public boolean isRelation(CNode obj,CNode comp){
return CRelationSampleFriend.isRelation(
obj,comp,ComplexPanel.m_Parameters.m_dCircle);
}
public void recalc(CNode obj,CNode comp){
CRelationSampleHate.recalc(obj,comp);
return;
}
}
/**
* {@link CNodeHate}が{@link CNodeHate}に影響を受けるコード
* @author 中田豊久
*/
class CNodeHate_CNodeHate implements CRelation {
public boolean isRelation(CNode obj,CNode comp){
return CRelationSampleFriend.isRelation(
obj,comp,ComplexPanel.m_Parameters.m_dCircle);
}
public void recalc(CNode obj,CNode comp){
CRelationSampleFriend.recalc(obj,comp);
return;
}
}
/**
* {@link CNodeHate}が{@link CNodeHate}に影響を受けるコード
* @author 中田豊久
*/
class CNodeHate_CNodeHateNomove implements CRelation {
public boolean isRelation(CNode obj,CNode comp){
return CRelationSampleFriend.isRelation(
obj,comp,ComplexPanel.m_Parameters.m_dCircle);
}
public void recalc(CNode obj,CNode comp){
CRelationSampleFriend.recalc(obj,comp);
return;
}
}
/**
* 動かない嫌われるnode
* @author 中田豊久
*/
class CNodeHateNomove extends CNode {
CNodeHateNomove(int x,int y,CArea area){
super(x,y,area);
m_color = Color.red;
}
int getWidth(){return (int)((double)super.getWidth()*1.5);}
int getHeight(){return (int)((double)super.getHeight()*1.5);}
}
/**
* 動かない影響を受けるnode
* @author 中田豊久
*/
class CNodeInfluenceNomove extends CNode {
CNodeInfluenceNomove(int x,int y,CArea area){
super(x,y,area);
m_color = Color.black;
}
int getWidth(){return 10;}
int getHeight(){return 10;}
}
/**
* ベクトルを扱うライブラリクラス
* ボイドアプレットに依存していないので再利用が可能。
* java.util.Vectorとは全く無関係。
* @author 中田豊久
*/
class CVector {
/** メンバ変数 */
double m_x;
/** メンバ変数 */
double m_y;
/** コンストラクタ
* @param x x軸値
* @param y y軸値
*/
CVector(double x,double y){
m_x = x;
m_y = y;
}
/** 現在のx,yの値を使用して、角度(radians)を返す
* @return 角度(radians)
*/
double getRad(){
// 返す角度の範囲は 0 <= rad < 2*Math.PI
if(m_y == 0){
if(m_x >= 0)
return 0;
else
return Math.PI;
}else if(m_x == 0){
if(m_y >= 0)
return Math.PI/2;
else
return 3*Math.PI/2;
}
double rad = Math.acos(m_x/Math.sqrt(Math.pow(m_x,2)+Math.pow(m_y,2)));
if(m_y < 0)
return -rad;
return rad;
}
/** 引数として与えられたベクトルに対して自分のベクトルをプラス方向
* に回転すれば角度が近づくか、マイナス方向に回転すれば近づくかを返
* す。
* 例えば、引数ベクトルが(1,1) 自分のベクトルが(1,-1)の場合、自分の
* ベクトルをマイナス方向に回転させると、引数ベクトルに近づくのでこ
* の関数はマイナス方向を示す -1 を返す。
* @param vec 対象となるベクトル
* @return 1の場合はプラス方向、2の場合はマイナス方向。
*/
int towordPlusMinus(CVector vec){
if((m_x == 0 && m_y == 0) ||
(vec.m_x == 0 && vec.m_y == 0)){
return 0;
}
int nDiff;
switch(nDiff = diffWorld(vec)){
case 0:
case 2:
double x = ((double)vec.m_y/vec.m_x)-((double)m_y/m_x);
if(x == 0)
return 0;
else{
if(nDiff==0)
return x>0?1:-1;
else
return x>0?-1:1;
}
case -1:
return -1;
case 1:
return 1;
}
return 0; // bug
}
/** {@link #getWorld()}により求められる象現の差分を求める。同じ象現
* の場合、差分は0。隣の象現に互いがある場合、1。対角線上に互いの
* 象現が存在する場合、2となる。
* @param vec 比較対象のベクトル
* @return 差分値(0-2)
*/
int diffWorld(CVector vec){
int w = getWorld();
int w2 = vec.getWorld();
if(w == w2)
return 0;
else if(Math.abs(w-w2)==2)
return 2;
else if(Math.max(w,w2)-Math.min(w,w2)==1)
return 1;
else
return -1;
}
/**
* m_x,m_yを以下の4つの象現に分ける
*
* 1. ○ 2. ● 3. | 4. |
* | | | | | |
* +-● ○-+- ●-+- -+-○
* | | | | | |
* ○ ●
*
* @return 象現の番号(1-4)
*/
int getWorld(){
if(m_x > 0 && m_y >= 0){
return 1;
}else if(m_x <= 0 && m_y > 0){
return 2;
}else if(m_x < 0 && m_y <= 0){
return 3;
}else if(m_x >= 0 && m_y < 0){
return 4;
}
return 0;// bug
}
}