46
群集波動 シミュレー Pedestrian¨ Wave Simulator 1996年 修士論文別冊 渡辺仁史研究室 樋 口智幸

群衆波動シミュレータの構築 修士論文別冊

Embed Size (px)

DESCRIPTION

1996年度,修士論文,樋口智幸

Citation preview

Page 1: 群衆波動シミュレータの構築 修士論文別冊

群集波動シミュレータ

Pedestrian¨Wave Simulator

1996年度 修士論文別冊

渡辺仁史研究室

樋口智幸

Page 2: 群衆波動シミュレータの構築 修士論文別冊

群集波動シミュレータ

■概要

本プログラムは以下のパ ッケージから成 る。

O modelS:駅 構内モデルの作成・描画・管理。

O gm:シ ミュレーションを実行する。

OwaVdet:ウ ェーヴレットを用いた時間周波―

を行 う。

クラス構成上重要な部分を以下に説明する。

■全体の構成

SelfFrarne

アプリケーション動作

メニュー、描百領域

ModelManager sirnu ator

オブジェクトの作成・管理 シミュレーションを実行

Bout S

移動経 路

Model〔Ob iect〕

Routesイ ンスタンスは、経路 とな

シミュレーシヨンに必要な情報は

由して各 Moddに与えられる。

駅歩行空間の一部分

RoOm PlotFrame

群集密度信号を

有する場結果表示

ModelManagerか らの情報 に

基づいて、Simulatorは群集の

移動経路 となる Routesク ラ

スを自動的にインスタンス化

する。

る一連のModdを保持する。

、Simulatorか らRoutesを 経

早稲田大学渡辺仁史研究室 1996年度修士論文

Page 3: 群衆波動シミュレータの構築 修士論文別冊

群集波動シミュレータ

■オブジェクト(Modeリ クラスの継承関係

*論文ではオブジェク トと表記している

が、Javr小_lm8・ObieCtと クラス名が衝

突するために、プログラム中では

M劇olと している。

継 密度信号を

有する場群集書産信号を変化させるディツタル・フィルタ

群集を発生させる

■ Sequenceク ラス

ウェーヴレットによる時間周波数解析を行うためのデータ系列。

KindeX,(data本体))の形を持つ2次元の Vectorで ある。

ウェーヴレットによ

る分解・再構成のた

めの系列

早稲田大学渡辺仁史研究室 1996年度修士論文

Page 4: 群衆波動シミュレータの構築 修士論文別冊

群集波動シミュレータ

■シミュレーション実行の流れ

Simulator上 でシミュレーション時間の設定を行う。シミュレーションを開始した時点で、Simulator

は自分が持つ各Routesに対 して実行時間を送る。これを受けて、Routesは それぞれの発生オブジェク

ト(Genmtor=Phtfom,Ouヽ ide)に対 して実行時間を指定し、Generatorは 自分が持つ発生情報(運行ダ

イヤグラム・発生人め に基づいて群集密度信号(Sequence)を 生成する。生成されたSequenceは 経路

の流れに従い、Filterに よって成分の変化を受けながら伝搬されていく。Roomに おいてそこを伝搬 し

たSequen∝ の総和が、その場における群集密度信号となる。

以下に、ソースコー ド中より主要な部分を抜粋する。

シミュレーション実行時間

早稲田大学渡辺仁史研究室 1996年度修士論文

Page 5: 群衆波動シミュレータの構築 修士論文別冊

群集波動シミュレータ

件′十

十 MOdeManagerjava verO.9 96/1/7十

* by 樋 口 智幸 :HIGUCⅢ TOMOYUKI十

中 早稲田大学大学院理工学研究科建設工学専攻中 Architcmal Engineering Course of Graduate School,

' WASEDA IJNMRS】『

Y+

十 Endl:higowatanabe.arch.waseda.ac.Jp十 uRL:htり JmW.Watanabe.achwaseda,acjpnig/摯

+Please 31Ve me any advices,ideas,inforrnations and cheers.

*

十くくHISTORYゝ>■ 96.4.18 Rotates models when SⅢ Fr‐KEY is down.ホ 96.4.22 class Aisle andObi∝ t are divided.中 96.4.29 Class Aisle andObieCt are packaged as a dass"Moder.中 claSS heModelisrenamed to"ModeManager".● 96.6.29 has mainc)me■Od and made stand― alone.* 96.8.08 0ff‐screenctwice血3Size of tt window)and‖ hand tool"(to mOVe tte screenp applied.中 96.12.28 Layers applied.■ 97.14 "Open"and"Save"applied.+ 97.1.7 "Scroubars:l are added.

中ノ

package models;

impOniava.aWl.十 ;

mportJava.awt.unage.FilteredLnageSource;mportJava.u● 1.Vector;

importjava.u■1.StringTolcdzer;

mpo■ java.udl.NoSuchElernentExc"tio■

importjava.udl.Enumerado■

mportsim.ErrorMessage;

public class ModelManager extends Panel{

bool― toMakeModel=false;int px,py; //mouseDown pomtint嵌 ,iy; /Oft‐ Top of dle visible screcn

int破 01t iyOld;int scrX,scrY;r/」 le center point of the screen

pnvate Vector modelmay=new vector(光Rectangle paintAre鶴 〃a recnttle area to r"amt

hage ors; 〃off_screen

private int aciveLayer=1; //dle number of acive layerCraphics grt

ObiPalette op; //Obi∝ tS palette(t001S)

public Serrame lm; //parent ialneboolean hasSelected;

private int scale=2;

boolean scrRescale=me; 〃スケールチ ェンジ・ フラグ(画 面書換用 )

WoBarib;private int layerMode=2;Rectangle a■ Area;

static hal String modelSorts□ ={"Aisle","Stairs","Square","Gate","Platfom","Outside"〕 ;

早稲田大学渡辺仁史研究室 1996年度修士論文

Page 6: 群衆波動シミュレータの構築 修士論文別冊

群集波動シミュレータ

〃,十■cOnSmctorsホ 十十

ModeWanag《 ObiPdette Op){setFon〈neW Fontc“ Dialog",Font.PLAIN,10));

resiz1560‐ 16,388-48);

“BackgrolmdColoF.White洸 〃画面の背景色を自に

scrX=sizeo.Widdl■ 10;scrY=sizeo.henght,10;破 =‐sizeo.widalノ 2;iy=― sizく ).height/2;破01d=嵌 ;lyOld=ly;〕

//1中■●Medlods中 十■十

〃*十ウhitialize十中*

public void mく )(Componentco=■is;

WЫく!((∞ =∞ .getParen〈 ))instanceOf SerFa“ ))(

}

h=(SelfFrame)∞ ;

Menu menu=new Menu(“ File,menu.addcneW Menultem("C,デ 1));

menu.addcneW Menultemc"Save"));

menu.addcneW MenulteFn("‐ "漱

menu.addcneW Menultan(“ Qur)〉MenuBar mbar=new McnuB嶽ゝmbar.addcmenu);

menu=new Menu("Edit");menu.addcneW Menultaく ‖

Clear"));

menu.addcneW Menultm(・ Clear Au"》menu.addrnew Menumm("F')、menu.addCneW Menultm("PrefeFenCeS.¨ "》

mbar.addcmenu);

menu=new Menu("Simulation'');menu.addcneW MenulteFn("Do")ヽmbar.addcmenu);

im.setMenuBarcmbar);screenit();

)

void screeniく ){scrX=size().Widdl■ 10;scrY=sizeo.height Ⅲ 10;破=―d黎〈).widぬノ2;iy=‐siza).height/2;

破Old=ix;iyOld=ly;。rs=createLnagく siZく ).Widul・ 2,sizく ).height

Ⅲ 2洸grf=offs.getCraphics(ゝ

grf.setColo<Co10r.white);

girlIR∝ t(0,0,SiZa).wid■・ 2,sizec).height*2ゝ

allArea=new Rectangle(0,0,Size()。 Widdl+20,size()height■ 20);

)

早稲田大学渡辺仁史研究室 1996年度修士論文

Page 7: 群衆波動シミュレータの構築 修士論文別冊

群集波動シミュレータ

//*** KEY operatiols *r.*int d((int x) {

retum (x - ix - size0.width) * scale + scrx;l

int aY(int y) {renrn (y - iy - size0.height) * scale + scrY;)

public boolean mouseMove@vent e, int x, int y) {for (int i = 0; i < modelArray.size0; i+t) (

if (getModel(i).selected) return true;)

ib.setl.ocation(aX(x), aY(y), true);return true:l

public boolean mouseDown(Event e, int x, int y) {Px=x;PY=Y;if (op.n: op.HAND) ren[n true;

toMakeModel = tro€lhasSelected = false;

for (int i = modelArray.sizeQ - 1; i >= 0; i--) [geModel(i).clicked(e, d((x), aY(y));if (getModel(i).inside(aX(x), aY(y))) toMakeModel = false;I

repaint0;return true;l

public boolean mouseDrag(Event e,int x, int y) {if (op.n:op.HAND) {

moveScreen(x, y);return true;)

if (toMakeModel) {if (makeNewModel(e, x, y)) renrn true;)

for (int i = 0; i < modelArray.size0; i++1 1

getModel(i).dragged(d((x), aY(y)h)

repainO;return true;

)

public boolean mouseUp@vent e, int x, int y) {for (int i = 0; i < modelArray.size0; i+t) {

getModel(i).mouseUp( );)

ixOld=ix; iyold= iy;rcnlrn true;)

public boolean keyDown(Event e, int key) {if (keY == 3; 1

deleteMode();retum true;)

if(keY:1Q;1openPlot0;renrrn true;l

〃"delete"key is pressed.

ll"enter" key is uessed.

早稲田大学渡辺仁史研究室 1996年度修士論文

Page 8: 群衆波動シミュレータの構築 修士論文別冊

群集波動シミュレータ

if ((key >=100+) && (key <= 1fi)7D {boolean boo = tnre;for (int i = 0; i < modelAnay.size0; i++){

if (geMode(i).nudge(e, key)) {repain();boo = false;break;l

)if (boo) [

if (key: 1m4 && activelayer != 2) {setActiveLayer(+ractivelayer);I else if (key == l(X)5 && activelayer != 0) {setActivelaye( - activelayer) ;)

)refirn true;l //Arrow keys

if (keY == {J; 1

if (+rscale > 20) scale = 2O;setScale(scale);return true;| il'-"

if(keY:{l) (

if (-scale <2)scale=2;setScale(scale);return true;I ll"+"

return false;)

void chengelnfoQ {ib.scale.setTex("scale: l/"+(scale * 100));if (scale : 2 ii scale : 5 ii scale == 10 ll scale == 20) {

ib.ch.select("1/"+(scale * 100));) else {ib.ch.select("Others... ");l

)

voidchangeScreen0 {boolean boo = false;Modelm =null;for (int i = 0; i < modelArray.size0; i++) {

if (geModel(i).selected) (boo = true:6 = getModel(i);)

lif (op.n==op.HAND ii!boo) {

setScrXY(scrX-(ix+siz{).widthl2) *scale,scrY-(iy+sizeOJreight/2)* scale);

) else {setSctXY(m.centerX0, m.centerYQ);l

l

早稲田大学渡辺仁史研究室 1996年度修士論文

Page 9: 群衆波動シミュレータの構築 修士論文別冊

群集波動シミュレータ

//**r MoDEL hardling r.**booleanmalceNewModel(Evente, int x, inty) {

int nx = Mathrnin(x, px); int ny = Mathrnin(y, py);int n_width = Math.abs(x - px); int n_height = Math.abs(y - py);if (n_width < 9 ii n_height < 9) reurn false;

int sort = opJr;if (sort == I && activelayer: 0) retum faise;Model model = newModel(sort" d((nx), aY(ny), n_width * scale, n_height * scale);model.checkSizeO;if (lmodel.checkJoircd0) {

model.clicked(e, d((x), aY(y));addMode(model);repain();toMakeModel = false:)

return true;l

boolean makNewModel(String s) {SaingTokenizer st = new SringTokenizer(s, " : ") ;if (st.cormtTokens0 != 9) return false;

String temP = st.nextTokeng;int sort = 0;for (int i = 0; i < 6; i++) {

if (temp.equals(modelSorts[i] )) sort = i;I

String anributes = st.nextTokenO;String nane = st.nextTokeno;nane = name.equals("anonymous") ! r" : name;int layerNum = Integer.parselnt(strextToken0);intx=Integer.parseln(slnextToken0);inty=lnjst.t.parselnt(stnextToken0);int w = Integer.parselnt(st.nextToken0); int h = Integer.parselnt(st.nextToken0);int r = Integer.paselnt(slnextToken0);Model model = newModel(sort, x, y, w, h);model.setlayerNurn(layerNum);model.rotate = r;model.name = name;model.setAcrihrtes(anributes);addModel(model);r€turn true;l

Model newModel(int sort, int x, int y, int width, int height) {swirch(sort) {

case 0:return new Aisle(this, x, y, width, height);

case l:return new Stairs(this, x, y, width, height);

case2zreturn new Square(this, x, y, width, height);

case 3:return new Gate(ttris, x, y, width, height);

case 4:renun new Pladorm(this, x, y, width, height);

defaulureturn new Outside(this, x, y, widtll height);

)l

早稲田大学渡辺仁史研究室 1996年度修士論文

Page 10: 群衆波動シミュレータの構築 修士論文別冊

群集波動シミュレータ 10

public Model geMode(int i) {Model ouput = null;trv{

oulput = (Model)modetArray.elementAt(i) ;

) catch (ArraylndexOutOfBormdsException e) {ErorMessage em = new ErrorMessage("The modelArray has no element at: " + i);)

return output;l

void addModel(Model m) {inti=0;int complayer = m.getlayerNumO;if (m instanceof Ro<rm) complayer--;for (Enumeration e = modelAray.elernents0; e.hasMoreElemens0) {

Model mtemp = (Model)e.nextElement0;if (mtemp.getlayerNurn0 > complayer) break;i+r;l

modelAray.insertElementA(rn, i);)

public Vector geModelArrayQ {return modelAray;)

voiddeleteModel0 {for (int i = 0; i < modelAray.size0; i+r) {

if (geModel(i).selected) {removelvtodel(i--);)

Irepaint0;)

void removeModel(int i) {getModel(i).addArea0 ;getModel(i).clearlmage(grf, activelayed;modelArray.removeElementAt(i) ;)

void rernoveAlModels0 {modelArray.removeAllElemens0 ;changeScreen0;l

voidopenPlo() {for (int i = 0; i < modelAray.size0; i+r) {

if (getModel(i).selected) {geModel(i).showPlo();)

l)

早稲田大学渡辺仁史研究室 1996年度修士論文

Page 11: 群衆波動シミュレータの構築 修士論文別冊

群集波動シミュレータ

//*** SCREEN methods ***void moveScreen(int x, int y) {

ix - (px - x); iy -= (py - y);Px=x;PY=Y;frrn.setBarsValuesO;if ((ix < -size0.width) il (iy < -size{).height) ii (ix > 0) ii (iy > 0)) {

changescre€n0;renlrn;)

repaint(new Rectangle(O, 0, sizeO.width, size0leight));)

int getActivelaye() {return activelayer;)

public void setActivelaye(int a) {activelayer = a;for (int i = 0; i < modelAray.size0; i+r) {

getModel(i).selected = false;)

ib. setActivelayer(a) ;

clearSqeen0;)

int getlayerMode0 {reftrn layerMode;)

void setlayerMode(int a) {if(a<0ii a>2)rcturn;layerMode = a;clearScreenQ;)

voidclearScreen0 (

scrRescale = true;grf .setColo(Color.white);grf.fitlRec(0,0, sizeO.width * 2, sizeO.height * 2);rcpaintAll0;)

int getScde0 {return scale;

I

void setScale(int scale) {this.scale = scale;frm.setScrollbarso;changeScreenO;chengelnfo0;l

int getScrX0 [returr scrX - (ix + size0.width/ 2) * scale;

l

intgetScrYQ {reftrn scrY - (iy + sizeQieightl2) * scale;

I

早稲田大学渡辺仁史研究室 1996年度修士論文

Page 12: 群衆波動シミュレータの構築 修士論文別冊

群集波動シミュレータ 12

void setScrXY(int x, int y) {scrx = x; scrY = yiix = -size0.width I 2; iy = -sizeo.heuht / 2;if (scale: 20) {

scrX = sizeO.wid0r * 10; rcrY = sizeOJreight * 10;

lclearScreen0;l

//*** PAINTING Metlrods ***public void update{Graphics g) {

pain(g);l

publicvoidre,painQ (

if (paintArea == null) return;repaint(convRect(paintArea)) ;

)

public void repain(Rectangle rect) {repaint(rect.x, rect.y, rect.width, rect.height);)

public void repaintAlO {paintArea = allArea;super.repint(0, 0, size0.width, sizeO.height);)

public void paint(Graphics g) [if (paintArea == null) paintArea = allArea;if (!(op.n: op.HAND && lscrRescale)) {

for (int i = 0; i < modelArray.size0; i+r) {of fScreenPaint@eModel(i), false) ;

)for (int i = 0; i < modelAray.size0; i+t) {

offScreenPaintGeModel(i), true);)

lif (offs != null) {

g.drawlmage(offs, ix, iy, this);]

scrRescale = false;paintArea = null;l

public void offScreenPain(Model m, boolean state) {if (m !=null) {

if (state) m.drawlm ary:e(gf , activelayer);else m.clearlmage(grf, activel,ayer);)

l

Rectangle addAredRectangle rect) (paintArea = (paintArea == null) ? rect : paintArea.union(rect);retunpaintArea;)

boolean arealntersects(Rectangle rect) {if (paintArea: null) retum false;return reclintersects(paintArea);l

早稲田大学渡辺仁史研究室 1996年度修士論文

Page 13: 群衆波動シミュレータの構築 修士論文別冊

群集波動シミュレータ 13

Rectangle convRec(Rectangle rect) {int x = floor(recrx - scrX) + sizeO.width + ix;int y = floor(recry - scrY) + size0jreight + iy;ht width = ceil(recrwidth);int height = ceil(rectieight);return new Rectangle(x, y, width, height);l

intfloo(inta) {return (in0Math.floor((double)a / scale);

I

int ceil(int a) {return (int)Math.ceil((double)a / scale);

l

voidresizeScreenO {offs.flush0;screenlnitO;repaintAlO;l

l

早稲田大学渡辺仁史研究室 1996年度修士論文

Page 14: 群衆波動シミュレータの構築 修士論文別冊

群集波動シミュレータ 14

dass Model 9614/29~

by 樋 口 智幸 :HIGUCⅢ TOMOYUKItr'<<HISTORY>>* 96.6.29The class "Aisle","Stairs" and "Square" are added.r' 95.6.30The pa.rent class "Model Manager' has the integrared off-screen image,'r which each class has had.* 96.8.28Now the class "Gate" has been added.* 96.12.30 Class "Pladorm" ant "Outside" are added.* 95.12.31 Join Methods are added.**l

pack4ge models;

import java.awt.*;irnport j ava.util.Vetor;import j ava.util.Enumeration;import wavelet.Sequence;

//*** class "Modeln ***public absract class Model extends Object {

ModeManagermm;

int oldWndal,。 ldHeuヒ 〃旧大きさmt sx,sy;

int oldSx,oldSy; 〃スケール後の始点の xy座標htsWiddl,sHeight;int oldSWid血 ,oldSHeight; 〃スケール後の大きさColor back=new Color(240,214,193洸 〃オブジエク トの背景色int comer=0;〃 サイズ変更カーソルの位置int rotate=Q〃 回転の状態(1:270度 2180度 3:90度 )

boolean sel∝ted=falsc;Lnage offs; 〃オフスクリーンイメージGraphics grt 〃オフスクリーングラフイクスint MINWIDTH,MINHEIGHT;int MA―DTH,MAXHEIGHT;

int px,py;

int oldPx,oldPy;

int clickX,dickY;

int widdl,height;

private int layerNum;static int ID;int id;public String ram€ ='"'Sequerre densitySignal;

〃オブジエク トの始点のxy座標〃旧座標〃マウスダウンの座標〃大 きさ

〃所属するレイヤーの番号

〃群集密度信号int range = Integer.MAX_VALUE;;

//*** Q6nsgustors ***public Model(ModeManager rnm, int px, int py, int width, int height, Rectangle minmax) {

supe();MINWIDTH = minrnax.x; MINHEIGHT = minmo(.yiMAXWIDTH = minmax.width; MAXHEIGHT = minmaxlreight;this.mm = mm;this.px - px; this.py = py;rhis.width = width; this.height = heighr;oldPx = pxi oldfu = py;oldWidrh = width; oldHeight = height;layerNurn = mm.getActivelayer0;id = ID+r;l

早稲田大学渡辺仁史研究室 1996年度修士論文

Page 15: 群衆波動シミュレータの構築 修士論文別冊

群集波動シミュレータ 15

//*** Metlrods ***Recturgle getRecO (

return new Rectangle(px, py, width, height);)

Rectangle getRect(Model m) {if (!(samelayerNum(m.getl,ayerNum0) ii m.saneLayerNum(this.getlayerNum0))) return new Rectangle

(0,0,0,0);return getRect0;l

Rectangle getOldRec$ {renrm new Rectangle(oldPx, oldPy, oldWidttU oldHeight);)

void setlayerNum(int a) {layerNum= a;

l

public int getl"ayerNum0 {return layerNum;)

boolean samelayerNum(int a) {retum getlaYerNum0 == 3;

l

intpn(int a) [return (in0(((float)a - 0.5) * 2);l

synchronized int centerX0 {return px +widdr/ 2;

)

synchronized int centerY0 {rcturn py + height/ 2;I

public int getWidth0 {retum width * 1000 / 28;

l

public int getHeighO {return height * 1000 / 28;l

public int getRotate0 {return rotate;I

public int getlD0 {rehtrlr id;)

public void setAnributes(String s) {)

public String toStringQ {Suing temP = nameiif (name.equals("")) temp = "anonJrmous";return ":" + temp + ":" + layerNum + ":" + px + 'r:" + py + ":" + width + ':" + height + ":" +rotate;)

早稲田大学渡辺仁史研究室 1996年度修士論文

Page 16: 群衆波動シミュレータの構築 修士論文別冊

群集波動シミュレータ 16

public inttouchcMOdel m){

r(m.centerX()>pX&&m.centerX()く PX+Widtt rettm widぬ ;

reun heittt

public int open(){

remm CrOtate%2==o?heightノ 28:widulノ 28;

public int lengalc){

re― CFOtate%2==0)?Wid血 /28:heightノ 28;

rr・・・ sinuladons■ ●●absttact public Sequence setDensity(Sequence seq,Model mゝ

public Sequence getDensityo{

remm densitySignal;

p●blic void ctarDensity(int range){

densitySignal=nun;

■us.range=range;

/rt*,MousE operttbns十中十

vond cttcke《 Event e,mtx,mty)〔clickX=x;面 よY=y; 〃クリックダウン座標記録oldPx=px;oldPy=py;oldWiddl=widぬ ;oldHelght=helght;boolean shift=e.面 ftDown(光

if(layerNum!=nlm.getActiveLayeく))re― ;

r(e.。。ntroDown()&&inSidaX,y)&&!nlm.hasSelected){rotation();

nlm.hasSelected=me;rem;

if(Shiftl〔

r(inside(x,y))〔

sd∝ted=!sdected;

addArea();

re― ;

)

rem;}

if(Selected)〔

r((inside(X,y)&&mmllasSelected)‖ (!inSide(x,y))){sekttted=false;

addAreac);

re― ;

〕Sd∝〈X,y);mm.魅 Sd∝ted=truc;re●■口n;

〕〃selected

早稲田大学渡辺仁史研究室 1996年度修士論文

Page 17: 群衆波動シミュレータの構築 修士論文別冊

群集波動シミュレータ 17

if(inSideX,y)&&OmmllaSSelectedm)〔selec〈x,y);

… ();

ntm.hasSelected=me;re― ;

}

vond sd∝〈int X,int y){int scale=ntrn.getScale();

boolean left=(xく PX+4+scale);boolean right=(x>PX+Wid■ ‐4■ scale);

boolcan top=oく py+4'scale):boolcan bottom=(y>py+height-4 t scale);corner=0;if(left&&top) corner=1;r(Hまt&&top) corner=2;if(lei&&bOttom) COrner=3;if Cright&&bottom)corner=4; 〃どのカーソルを掴 んでいるか

sd∝ted=me;}

void rotation(){

px=centerXo― height/2;py=centerYo― widぬ /2;widal=OldHeight height=oldWidぬ ;

mt oldRotate=rotate;

rotate■‐「 ;

rotate=rotate%4;selected=me;if(CheckJOined())rOtate=oldRotate;

addArea))

void draggedcint X,int y)〔

if(!Selected)remm;int dx=x‐ clckX;mtdy=y‐ cuckY;switch(corner){

case O:

px‐ dx;py+=dy; 〃移動モー ドbreヘ

case l:

widal=。 ldwidぬ ―dx;height=oldHeight‐ dy;

Px=oldPx+dx;py=oldPy+dy;bret

case 2:

widdl=oldWiddl+dx;height=oldHeight‐ dy;

py=oldPy+dy:break;

case 3:

widdl=oldWidぬ ‐dx;height=oldHelght+dy;

Px=oldPx+dx;bre七

case 4:

widal=01dwidm+dx;height=oldHeight tt dy;

〕checkSi“仇

int scale=nlm.getScale(〉

nf(wk■hく 9+scakう Wid血 =9*scale;r(heiま tく 9・ SCale)height=9 t scaL 〃サイズ変更モー ド

if(!CheckJoined()){

a… ();

早稲田大学渡辺仁史研究室 1996年度修士論文

Page 18: 群衆波動シミュレータの構築 修士論文別冊

群集波動シミュレータ 18

cuckx=x;clickY=y;〕

vott checkSizeo〔

int minW=((rOtate%2)==0)?MINWIDTH:MINIIEIGH■int minH=鮨 otate%勾 -0)?MINHEIGHr:MINWIDTH;int maxW=((rOtate%2)=o?M船 圏DTH:MAXHEIGHT;int maxH=((rOtate%2)==0)?MAXHEIG田『 :MAXWIDTH;

if(Widalく minw)wid■ =ninЧ亀r Kheightく minH)height=ninH;ilf(Widm>maxwn wid■ =maxW;r(hei♪t>maXH)heittt=maxH; 〃大きさ制限〕

public V∝tor containedModeお ooolean aag){Vector result=new Vecto<ゝfOr(int i=o;iく mm.getMode― y()。SiZa);‖十){

Model m=nun.geModel(i);if(m!=thiS&&(aag==isSatneSor〈 m)))(

r(血s.getRectい ).htersects(m.getRect(血 S)))〔

result.addElement(m);

}

)

booleancheckJoinedQ {booleanjoined = false;for (Enumeration e = containedModels(false).elernents0; e.hasMoreElements0;) {

Model m = (Model)e.nextElement0;joined = (oined ii isJoining(m));l

if (Fined ii !(containedModels(true).isEmpty0)) {px = oldPx; py = oldPy;width = old\ilidth; height = oldHeight;return true:)

return false;

)

abctract boolean isJoining(Model m);

abatract boolean isSameSort(Model m);

voidmouseUp0 {corner = 0;)

boolean nudge@vent e, int key) {if (lselected) retun false;int d = (l + (e-rnodifiers & Event.SHIFT_MASf; 't 9) * mm.getScaleo;if (key: lflX) py -= d;if (key == 1005) py r- d;if (key: lfl)6) px -= dif (key : 10Cl/) px += d;if (lcheckJoinedQ) {

addAreaO;l

return true;l

蒻m“

ヽ′

早稲田大学渡辺仁史研究室 1996年度修士論文

Page 19: 群衆波動シミュレータの構築 修士論文別冊

群集波動シミュレータ

/rt,十 PAD劇旺NG memods***public b001ean inside(int x,int y){

re― ((X>PX&&xく=Pxlwiddl&&y>=Py&&yく =pytheightl&&layerNlm一 mm.getActivehyer

void撤油Mo{Rectangle r∝t=getR∝〈).u五〇n(getOldR∝t()光

nlm.addArea“ o;

htぶCint x){re-Ooorcx_nlm.scrX)+mm.siza)・ Widul;

int aYcint y)〔

re―■ooro― nlm.scrD+mm.SiZe().hetht;

}

int n00r(int a){

ret― (intpM価 .noor((dOuble)a/mm.getScaleo);

int cenl(int→ 〔retlm(inthM血 .Ceil((dOuble)a/mm.getscalく ));

)

void drawLnage(Graphics g,int acuveLayer){

r(!(mm.areahtersecttcnew R∝ tangleox,py,widt height))))retum;r((layeFNum!=nun.getAciveLayer())&&nlm.getLayerMode()==1)rem;sx=aXox);sy=aY(py);oldSx=aX(oldPX);01dSy=aY● ldPy);

swidal=∝姐(Widm);sHcight=ceil(heightゝoldSWidth=∝u●ldWid■〉OldSHeight=ceil● ldHeight);

r(!sameLayerNumm.getAcdveLayer))&&nlm.getterModec)==2){g.setColorcColor.gray);

g.drawRect(sX,Sy,sWidぬ -1,sHeight‐ 1);

〕elSe〔

g.setCo10Kし CD;g劇lRect(sX,Sy,sWiddl,sHeight} 〃背景drawObi∝ 唯 光 〃オブジエク ト描画

)

r("lected)〔gosetColorcColor.red);

g.3ШRect(sX,Sy,4,4);

g.FmRect(sX+SWid血 ‐4,sy,4,4);g。lmR∝ t(sx,Sy ttHeight‐ 4,4,4);g.fmR∝t(sx+SWidd1 4,sy+sHeight‐ 4,4,4); 〃選択カーソルの表示

mn,ib,s司いcation(wid■,height,fal→ ; 〃寸法表示}

)

void clearhagecraphics 3,int aciveLayer)〔

r(!(nlm.aratersec“ cetRect())))remm;gosetColo<C010r.white);g.rlllRect● ldSX,01dSy,oldSWidt oldSHeight);oldPx=px;oldPy=py;oldWid血 =widdl;oldHeight=heiま鶴〃旧座標更新)

absLact void drawObi∝くGraphics g光

public absmct vOnd sIЮwPlot(洸

19

早稲田大学渡辺仁史研究室 1996年度修士論文

Page 20: 群衆波動シミュレータの構築 修士論文別冊

群集波動シミュレータ

package models;

import java.awl*;import java.util.Vector;import waveletSequence;import waveletPlotFrame;

ll***t* suB classes ***,**//**** class iRoomn ***'rpublic abstract class Room exbnds Model { llRoom 2 7 7

public Room(ModeManager mm, int px, int py, int width, int height, Rectangle minmax) {super(mm, px, py, width,height, mfumax);)

//*** Metllods 'l*'rboolean isJoining(Model m) {

switch(m.rotue) {case 0: case 2:

if (!(py <= m.py && py + height >= m.pX + m.height && (m instanceof Stairs li GetRect0.intersection(m.getRec$)).width <= 6))) {

rerurn true;

Ibreak;

case l: case 3:if (!(px <= m.pX && px + width >= m.px + m.width && (m instanceof Stairs ii (getRect0

.intersection(m.getRect0)).height <= 5))) {return true;l

)return false;

l

boolean isSameSort(Model m) {return m instqrceof Room;)

public Sequence setDensity(Sequence seq, Model m) {soq = s€q.sequenceMulti((double)m.open0 / touch(m));if (densitySignal == null) {

densitySignal = seq;

) else {densitySignal = densitySignal.sequenceAdd(seq);)

Systern.out.println(toSuing0 + " : " + densitySigral.length$ + " : " + densitySignal);return seq;

)

public void showPlot0 {if (densitySignal != null) {

PlotFrarne pf = new PlotFrame(densitySignal, range);

Pf.show0;)

ll

20

早稲田大学渡辺仁史研究室 1996年度修士論文

Page 21: 群衆波動シミュレータの構築 修士論文別冊

群集波動シミュレ…タ

package models;

import java.awt*;import javautil.Vector;import j ava.util.Enumeration;irnport waveletSequence;

ll***** suB classes *****//***{. clrss sFiltern ****

public abstract class Filter extends Model I tpitter ? 2 7Doors doors[];int doorNum;private Sequence arrivals = new Sequence0;double percent;intformWidth;private int ways = 0;

public FiltedModeManager mm, int px, int py, int width, int height, Rectangle minmax) {super(mm, px, py, width, height, minmax);)

//*:|* medrods :i{.*

boolean isJoining(Model m) {switch(rotate), t""""

z,if (!(py >= m.py && py + height <= m.py + m.height && (this instanceof Stairs ii (getRectO

.intersection(m.getRecO)).width <= 6))) {return true;)

break;case l: case 3:

if (!(px >= m.px && px + width <= m.px + m.width && (this instanceof Stairs ii (getRect0.intenection(m.getRect0)).height <= 6)) {

renrrn true;l

boolean isSameSort(Model m) {return m instanceof Filter;l

F** Values are se,nt by Plaform.sendGenerator0*l

public void setGenerator(int pl, int p2, int forml-ength, int formWid0r, int enQ {waYs = 0;pl =pl * 10001?3;p2=p2* IAOOI2S;formlangth = formlrngth * 1000 / 28;this.forrnWidth=formWidth/28; llmeterent=ent* 1000/28;doorNum= (p2l4800) - (pl/21800);doors = new Doors[doorNum];percent = (doubleXp2 - pl) / formlpngth;for (int i = 0; i < doorNum; i+r) {

int at= (Pl /4800+ 1) * 48m + i * 48fi);doors[i] = new Doors(at - ent, pl - ent" p2 - ent);I

)

●ι

l皿m“

l′

早稲田大学渡辺仁史研究室 1996年度修士論文

Page 22: 群衆波動シミュレータの構築 修士論文別冊

群集波動シミュレータ 22

public void setAnival(Sequence seq) {if (ways+r > l) renrm;seq = seq.sequerrceMulti(percent);arrivals = new SequenceGeq.length0);for (int i = 0; i < doorNum; i+r) {

doors[i].setArriva(seq);arrivals = arrivals.sequenceAdd(doors [i].getAnival0);)

arrivals = arrivals.sequerreMulti(l /((double)formWidth * 1.17 * 10)); //pv*h*10=N)

public Sequence getArrivaQ {System.outprintln("getArrival = " + arivals.seque,ncelvlulti(1 / (double)ways));return arivals.sequenceMulti(l / (double)ways);

l

public void showPlot0 {returnlI

)

早稲田大学渡辺仁史研究室 1"6年度修士論文

Page 23: 群衆波動シミュレータの構築 修士論文別冊

群集波動シミュレータ

package models:

importjava.aw七 十;

mport waveleL中 ;

//1*摯*class"Aisle"****

public class Aisle extends Filter〔 〃通路クラスstatic halint MINWIDⅢ =18,MINHEIGⅢ =18;static halint MA漱 MDⅢ =Integer.MAX VALUE,MAXHEICr=htegerMAX VALUE;private static double coe■ ]=new dOuble14];

public Aislく MOdelManager mm,int px,int py,int widdl,ht height){

¨ ,pX,py'Widul,height,new R∝ 蜘喝lec― DTH,MB田国ЮⅢ ,M… ,MAXHEIGHDンCOefIOl=0;COef11]=-0.521:coef12]=‐0.155;

coef13]=‐0.091;

)

void drawOuec〈Graphics 3){

3・ SetCO101C。 10r.Ы ack);

switchcrotate)

{

case O:case 2:

g.fillRect(sX,Sy,sWid山 ,floo<6));g.fШ Rect(sX,Sy tt sHcight― n。。<6),sWid血 ,a∞ r(6));

break;

case l:case 3:

g』ШR∝t(sx,Sy,Ooo<6),sHcighO;g.mR∝t(sx+SWid■ ‐noor(6),Sy,Oooく 6),sHeighth;

〕 〃通路描画

public String toS“ ngo{remm"Aislcnone"+super.toSdng衛

//t十■sinulations ⅢⅢ+

public Sequence setDensity(Sα pence seq,Model m){SysLm.out.pman("calculating… :"+toStFing());

Sequence c□ =new sequence[5];Sequence d[]=new SCquence[5];C[Ol=Seq.sequenccMultic(dOuЫ c)m.tOuch(thiS)ノ open());

c[Ol.Fmatwolation(光

fOr(hti=1;i← ti持){C[i]=C[i‐ 1].decOmposeToScaling(ゝ

dlil=CIi‐ 1].decOmposeToWavelet();

) //dCOmpOSefOr(int i=4;i>=1;i―‐

)〔

dli]=d[i].SequenceMuldtta■ .pow((double)leng血 o,COef11-1]));CIi‐ 1]=C[i]ごα∝)nSmct(d[il);

} //MOnstructCIO].Shiftc(hⅨ cdOublolengu10′ 10〉C[0]=C10].SCalingSampleo);

renmcIO];

)

23

早稲田大学渡辺仁史研究室 1996年度修士論文

Page 24: 群衆波動シミュレータの構築 修士論文別冊

群集波動シミュレータ

package models;

importjava.awLtimportjava■dl.V∝ tor;

import waveletSequeno;mport waveletPlotF― ei

//1+十中 "daSS Stairs"中 十■十

public class Stairs extends Filter{ 〃階段クラスsttic ttlalint MINWIDTH=280,MINHEIGⅢ「=18;static halint MAXWIDTH=420,MAXHEIGⅢ =hteger.MAX VALUE;

publt StairsttodeManager nlm,int px,int py,int widt intheigho{

supa_Px,py,Widtheight,new RectanglecM―TH,MINHEIGHT,MAXWIDTH,MAXIIEIGHD洸〕

boolean sameLayerNun(int lay∝ ){re― teιりerNm()==layer l:geLayerNunO‐ 1==layer洸

Rectangle getRec〈 Model m){if(!(SalneLayerNumぃ .getLayerNum())::m.sameLayeFNum(血 s.getLayerNum())))retum new Rectangle

O,0,0,0);mtr=Ю tate;

if(m.geLyerNun()+1==Jis.getLayerNum())〔F十=2;r=r%4;}

int w2=widm/2;int h2=height/2;switchcr)

{

case O:

re― new R∝ tangleox+W2,Py,w2,heightゝcase l:

rettmnew RectangletPX,py,widdl,h22;case 2:

remm new R∝ tanglecpx,py,w2,heigho;case 3:

re― new RectangleCPX,py+h2,widdl,h2ゝ

〕re― new Rectangleo,0,0,0;

)

void drawObiectcCraphics g){

int centerSx=sx+SWi山 血ノ2;int centerSy=sy+sHeight/2;int of口Vidぬ =(ino(SHeight/346);int OttHeight=cintxSWiddlノ 346);int scale=nun.getScale();

switchcrotate){

case O:case 2:{

g,se(〕oloくC010r.black);

r(scaleく =4)〔fOr(int i=6;iく wid血 ‐2;i+=8){

8・drawLine(sX+n00<i),sy,SX+floor(1),sy ISHeight-1);

)

l elSe{g.setColoく CO10r.ligh“ 計ay洸

g.rlllRect(sX,Sy,sWiddl,sHeightゝ

)

g.setCO10<C。 10r.blackゝ

g.finRect(sX,Sy,sWidal,f10o<6));

g.fШ Rect(sX,Sy+sHeight‐ Ooo<6),sWidul,■∞r(6));

24

早稲田大学渡辺仁史研究室 1996年度修士論丈

Page 25: 群衆波動シミュレータの構築 修士論文別冊

群集波動シミュレータ

if (mm.getlayerModeO =:2) |inti=pn(rotate/2);int j = ((getl-ayerNum0 == mm.getActivelayer0 ? I : -l) * i + 2) | 2;int x[ = {centerSx - offwidth, sx + (sWidth - l) * j, sx + (sWidrh - l) * j, centerSx +

offlilidth, centerSx - offWidth);int yll = {sy, sy, sy + sHeight - 1, sy + sHeight - l, ty};g.setColor(Color.white); g.fillPolygon(x, y, 5);g.setColor(Color.gray); g.drawPolygon(x, y, 5);

l)

break;case l: case 3: {

g.setColor(Color.black);if (scale <= 4) {

for (int i = 5; i < height - 2; i r- 8) {g.drawline(sx, sy +floo(i), sx + sWidth - l, sy+floor(i));)

) else (g.setColor(Color.lightGray);g.fillRect(sx, sy, sWidth, sHeight);

Ig.setColodcolor.black);g.fillRect(sx, sy, floo(6), sHeight);g.fillRect(sx + sWidth - floor(6), sy, floo(5), sHeight);if (mm.getlayerMode0 =:2) (

in1 i = -pn((rorate - l) I 2);int j = ((getl-ayerNum0 : mm.getActivelayer0 ? I : -l) * i + 2) | 2;inty11 ={centerSy+offHeight,sy+(sHeight-l)*j,sy+(sHeight-l)*j,centerSy

- offlleight, centerSy + offHeight);int x[1 = {sx, sx, sx + sWidth - l, sx + sWidth - l, sx};g.setColor(Color.white); g.fillPolygon(x, y, 5);g.setColor(Color.gray); g.drawPolygon(x, y, 5);

l)

lif (scale > 4) retum;

g.setColor(Color.darkGray) ;Jwitch(rotate) { I XePffits

case0: {g.drawline(sx, centerSy, sx +sWidth - I, centerSy);int x[] = {sx + sWidth - 3, sx + sWidth - l, sx +sWidth - 3, sx + sWidth - 3 } ;int y[1 = {centerSy - 2, centerSy, centerSy + 2, centerSy - 2};g.drawPolygon(x, y, 4);l

llifi,,g.drawline(centerSx, sy, centerSx, sy + sHeight - 1);int x[] = {centerSx + 2, centersx, centerSx - 2, centerSx + 2};int y[] = {sy + 2, sy, sy + 2, sy +21;g.drawPolygon(x, y, 4);)

HS,,g.drawline(sx, centerSy, sx +sWidth -1, centerSy);intx1l = {sx + 2,sx,sx + 2, sx + 2};int y[1 = {centerSy + 2, centerSy, centersy - 2, ce,nterSy + 2};g.drawPolygon(x, y, 4);l

break:

25

早稲田大学渡辺仁史研究室 1996年度修士論文

Page 26: 群衆波動シミュレータの構築 修士論文別冊

群集波動シミュレータ 26

case 3:〔

g.drawLheccentersx,sy,centerSx,sy+sHcight‐ 1);

ntX□ ={蜘terSX-2,centerSx,centerSx+2,centerSx‐ 2};

int y[]={Sy+SHeight‐ 3,sy+sHcight‐ 1,sy ttHeight-3,sy+sHelght‐ 3);

g.drawPoly30n(x,y,4);

〕) 〃階段描画

public String toStin3()〔

re― "Stairs:none"+super.toString();

〃十■*simulations'*十

public Sequence setDenshy(Sequence seq,Model m)(

boolean up=(m.getterNumo!=血 S.getLyerNum()洸

Syskln.out.pnndn('iCalCulating¨ .:''十 tOString());

Sequence c□ =new sequence[3];Sequence d□ =new sequence[3];C[0]=Seq.sequenceMulti((dOuЫ eンn.tOuch(■五S)ノ open());

C[Ol血副ht賀Юlation(ゝ

dOuble∞ etint v;

rOp){coef=Madl.sqr〈 0.354745);

v=80■ 340/60Ⅲ 10;

)elSe{coef=Math.sqr〈 0.462957);

v〓 110Ⅲ 340ノ 60+lo;

}

fOr(int i=1;iく =2;iI「){C[il=C[i-1].decOmposeToSding();d[i]=C[i‐ 1].decOmposeToWavdet();

) //deCOmpOsefOr(int i=2;i>=1;i― ){

d[i]=d[il.SequenceMulticMadl.pow((dOuble)lengalC),((i==2)?coef:0)));

C[i‐ 1]=CIi].recOnsmct(d[i]);

) //reCOnsmctC[Ol.Shiftc(inth((dOuЫ Olenguloノ V));

CIO]=C[0].SCalingSttΨleo);

rem C10];

〕)

早稲田大学渡辺仁史研究室 1996年度修士論文

Page 27: 群衆波動シミュレータの構築 修士論文別冊

群集波動シミュレータ

package models;

import java.awl*;import sin.GateDialog;import waveleLSequence;

//**** claqs "Gate" ****publicclass Gate extends Filter { ll&t'LE, 7 7

satic final int MINWIDTII = 64, MINHEIGIIT = 48;static final int MAXWIDTH = Integer.MAX-VALUE, MAXHEIGHT = IntegerMAX-VALUE;GateDialog dialog;int inGates = 0:

public Gate(ModeManager mm, int px, int py, int width, int height) {super(mrapx,py,width,height,newRectangle,(MINWIDTII,MINHEIGIIT,MAXWIDTH,MNCIEIGHT));dialog - new GateDialog((Frame)mm.ftm, this);)

void clicked(Event e, int x, int y) {super.clicked(e, x, y);if (e.clickCount:2 && selected) {

dialog.showO;l

l

public int Cetln0 {return inGates;

l

public void setln(int in) [inGates = in:)

void drawObjec(Graphics g) {int scale = mm.getscaleO;if (scale > 4) {

C.setColor(Color.yellow);g.fillRect(sx, sy, sWidrh, sHeight);)

g.setColor(Color.black);switch(rotate) {case 0: case 2:

g.fillRect(sx, sy, sWidth, floo(6));g.fillRect(sx, sy +sHeight -floo(6), sWidth, floor(5));if (scale <= 4) {

intn = geGatel.{um0;for (int i = 0; i < n; i++) {

int xx = sx + sWidth/2 - 27 | *ale;int YY = sY + (20 + i * 28)/scale;g.drawRect(xx , W, 54 | scale, 12 / scale);

))

brealqcase 1: case 3:

g.fillRect(sx, sy, floor(6), sHeight);g.fillRect(sx + sWidth -flood6), sy, floor(5), sHeight);if (scale <= 4) {

int n = getGateNumo;for (int i = 0; i < n; i+r) {

int xx = sx + (20 + i * 28) / scale;int YY = sY + sHeight/ 2 - 2l I scale;g.drawRect(xx , W, 12 I *ale, 54 / scaleX

II

27

break;

l

早稲田大学渡辺仁史研究室 1996年度修士論文

Page 28: 群衆波動シミュレータの構築 修士論文別冊

群集波動シミュレータ

l

publicintgeGateNumQ {r€htrn (rctate (6 ). - 0) ? (int) Math.ceil((double) (height - ,10) / 28) I (int) Matluceil(double) (width - 40) /

l

publicintopen0 {return (intx(float)geGateNumO * 550 / 1000);)

public Suing tostringo (rctutn "Gate:none' + super.toString0;)

//*** sinulad.ons **'fpublic Sequence setDensity(Sequence seq, Model m) {

System.out.println("Calculating... : " + toString0);Sequerrce c[] = new Sequencel4];Sequence d[] = new Sequence[4];c[0] = seq.sequenceMulti((double)m.touch(t]ris) / openO);c [0].fi ndlnterpolation0 ;

for (int i = l; i <= 3; i+r) {c[i] = s1i - ll.decomposeToScalingO;d[i] = s1i - ll.decomposeToWavelet0;) //decomPose

double coef= 0.12 * c[0].energy0 / d[3].energy(1;d[3] = d[3].sequenceMulti(coef);for (int i = 3; i >= 1; i-) {

c[i - 1] = c[i].reconstruct(d[i]);l //reconstruct

c[0].shif(1);c[0] = c[0].scalingSample(0);retum c[0];)

)

23

28);

早稲田大学渡辺仁史研究室 1996年度修士論文

Page 29: 群衆波動シミュレータの構築 修士論文別冊

群集波動シミュレータ

PCkage model露

importjava.awL● ;

mportJava‖血.Vctor;

mport waveleLSequence;

〃十■中●claSs"SqldareW'■●*

public class Square extends Room{ 〃広場クラスstatic halint MINWIDTH=18,MINIIEIGHT=18;staticttnalint MttDTH=Integer.MAX_VALUE,MAXHEIGHT=hteger』 ИAXttVALIIE;

public Square(ModeManager mm,htpx,int py,int widm,mt henght)(S呻願鰤m,PX,py,Widtheightnew R∝ 堕り

,… Ⅲ ,MAXWIDTH,MttEIG則 〉

voiddnwObieCtCGraphics 3){

gosetColoく CO10r.black);

g.rlllRectcsX,Sy,sWidth,flooく 6));

g.■皿Rect(sX,Sy+sHcight― fl∞く6),sWidt f100r(6));g.rluRect(sX,Sy,Oooく 6),sHeight);

g.rmRect(sX ISWidぬ ‐Ooo<6),sy,■ ∞ r(6),sHeight光 〃広 場 描 画

)

public String toStringo{

rettm"Square:none"+super.toStrmg(〉

〕)

29

早稲田大学渡辺仁史研究室 1996年度修士論文

Page 30: 群衆波動シミュレータの構築 修士論文別冊

群集波動シミュレータ

package models;

irnport java.awt*;irnport java.util.Vector;import java.util. SaingTokenizer;import j ava.util. Enumeration;import j ava.util. Hashable;import java.util.Date;import sim.*;importwavelet*;

//*'l** class 'Pladrormn *'l'r*publicclass Pfatform extendsGenerator I ll /7 v F^-LD A

satic final int MINWIDTH = 28(X), MINHEIGHT = 112;static final int MAXMDTH = Integer.MAX-VALUE, MAXHEIGHT = Integer.MAX_VALUE;public DiagrarnPath diagramPathl = new DiagramPath0;public DiagramPattr diagramPath2 = new DiagramPattr0;;public int arrivall = 0;public int arrival2 = 0;public Vector routes = new Vector0;Sequence arrivals;

public Pladorm(ModeManager mm, int px, int py, int width, int height) {super(mm, px, py, width, height, new Rectangle(MINWIDTH, MINIIEIGHT, MAXWIDTI{, MA)GIEIGHT));dialog = new PlatformDialog((Frame)mm.fu, mt);I

public int getlf,ngth0 {int ouput = (rotate 7o 2 == 0) ? getWidth0 : getHeight0;rcturn output;l

void drawobjr:ct(Graphics g) {int scale = mm.getScaleO;g.setColor(Color.white);float xOffset = (rotate 7o 2) * 42 + ((rotate + L) Vo 2) * 140:.float 5Offset = (rctate Vo 2) * L40 + ((rotate + l) 7o 2) * 42;for (int i = 0; i <= l; i++) {

for(intj=0;j<= l; j++) {intx11 = {sx+sWidth*i,sx+sWidth*i,sx+sWidth*i-(intxxoffset*pn(i)/scale)};fuy[= {sy+sHeight* j,sy+sHeight* j-(int)(yOffset*pn()/scale),sy+sHeight*jf ;g.fillPolygon(x, y,3);l

lsuper.drawObject(g);)

public String toString0 {Suing s = ":";s r- diagramPath l.toStringO;s {- '," + arrivall + ",";s += diagramPath2.toStringO;s += "," + arrivaD;return "Platform" + s + super.toSringQ;l

早稲田大学渡辺仁史研究室 1996年度修士論文

Page 31: 群衆波動シミュレータの構築 修士論文別冊

群集波動シミュレータ 31

//*** Methods for simulation ***public void setAcributes(String O {

StringTokenizer st = new SuingTokenizer(s, ",");if (st.cormtTokensO != 4) retum;diagnrnPathl.setPath(st.nextTokenO) ;

arivall = Integer.parselnt(st.nextTokeno);diagranPath2. setPath(st.nextTokenO) ;anival2 = Integer.parseln(st.nextToken0);if ( ldiagramPatM.equals(" ")) {

dialog.setDouble0;

))

public void addRoutes@outes r) {routes.addElemen(r);l

public void resetRoutesQ {routes.remo veAllElements0 ;

)

public void sendGenerator0 {if (routes.isEmpty0) reum;Hashtable filters = new HashtableO;for (Enumeration e = routes.elementsQ; e.hasMoreElements0;) {

Filter f = (Filter)(((Routes)e.nextElement0).nexNode(this));filters.put(new Integedrotate 7o 2 == 0 ? f.centerXO : f.centerYO), 0;)

Vector keys = new Vector0;keys.addElement(new Integer(nteger.MAX_VALUE));for (Enumeration e = filters.keys0; e.hasMoreElements0;) {

int tempKey = Integer.parselnt(e.nextElement0.tostring0);inti=0;while (tempKey > Integer.parselnt(keys.elementA(ir-+).toSuing0)) { ; }keys.insertElementAt(new Integer(tempKey), i - 1);)

keys.removeElementA(keys.sizeO - I );

for (int i = 0; i < keys.size{; i++) {Filter f = (Filter)(fi lters.get(keys.elementAt(i)));int a = Integer.parselnt(keys.elementAt(i).toString0);int pl; int p2;if (i-0) [

pl = (rotate 16 ). -- 0 ? px : py);) else {pl = (a + Integer.parselntfteys.elementAt(i - I ).toStringO)) / 2;)

if (i : (keys.size0 - l)) {p2 = (rotate Vo 2 ==0 ? px + width : py + height);) else {p2 = (Integer.parselnt(keys.elementAt(i + 1).toStringO) + a) l2;l

f.setGeneraodpl, p2, (rotate Vo2== 0 ? width: height), (rotzteTo2==0? height: width), a);

l)

早稲田大学渡辺仁史研究室 1996年度修士論丈

Page 32: 群衆波動シミュレータの構築 修士論文別冊

群集波動シミュレータ 32

public void setArrival(Date start, Date end) {Vector ouput = new VectcO;Sequerrce sl = diagramPathl.getAriva(start, end, arivall);Sequence s2 = diagramPath2.getArrival(start, end, anival2);if(s2 !=null) (

arivals = s l.seque,nceAdd(s2);I else {alrivals = sl;I

if (routes. isEmptyQ) retum;for (Enurneration e = noutes.elements0; ehaslvloreElementsO;) {

((Filter)(((Routes)e.nextElernen$).nexNode(ttris))).setArrival(arrivals);I

l

public Date getStartTime0 {Date tenrpl = diagramPathl.startTime0;Date temp2 = diagramPath2.startTime0;if (templ - null) return null;if (temp2 != nulD {

templ = (templ.after(temp2) ? templ : temp2);)

renrn bmpl;l

public Date getEndTime0 {Date ternpl = diagramPathl.endTimeQ;Date ternp2 = diagramPatM.endTimeQ;if (templ : null) renrn null;if (temp2 != null) {

templ = (ternpl.before(temp2) ? templ : temp2);)

return templ;)

)

早稲田大学渡辺仁史研究室 1996年度修士論文

Page 33: 群衆波動シミュレータの構築 修士論文別冊

群集波動シミュレータ

package models;

import java.awt*;import java.util.Vector;import java.util.Date;importsim.*;import waveleLSequence;

//*r.** class "Outside" ***r,public class Outside exbnds Generator I ll #fll I Z

satic final int MII{WIDTII = 18, MINHEIGHT = l8;static final inIMAXWIDTH = Integer.MAX-VALUE, MAXHEIGHT = IntegerJr{AX_VALUE;public int anival = 0;

public Outside(ModeManager mm, int px, int py, int width, int heigh$ {super(mm, px, py, width, height, new Rectangle(MINWIDTTI, MINHEICHT, MAXWIDTTI, MNGIEIGHT));dialog = new OutsideDialog((Frame)mm.frm, this);l

public void setAnributes(Suine s) {arival = Integer.parseln(s) ;

l

//**:t simulations'*'t:tpublic Sequence getArriva(Date start, Date end, Model m) {

vector vec = new Vectoro;Double d = new Double((double)anival /(1.4 * touch(m) / 28 * 10)); lllAmlsecfor (int i = 0; i < (end.getTime0 - start.getTime0) / 10000; i+r) {

vec.addElement(d);

)rennn new Sequence(0, vec);)

void drawObject(Graphics g) {super.&awObject(g);

)

public String tostringO {return "Outside:" + arrival + super.toSting0;l

l

早稲田大学渡辺仁史研究室 1996年度修士論文

Page 34: 群衆波動シミュレータの構築 修士論文別冊

群集波動シミュレータ 34

// class Simulator 19D7.1.9-

package sim;

import j ava.util. Vector;import j ava.util. Enumeration;import java.util.Date;importmodels.*;import waveleuSpline4;

public class Simulator extends Object implements RunnablefModeManagermm;Vector routes = new Vectorolpublic Date start, eNld;

SimDialog simDialog;Thread tluead;

//* ** Constructors r?**

public Simulato(ModeManager mm) {suped);this.mm = mm;srarr = new Date(97,0, l);end = new Date(97,0,2);simDialog = new SimDialog(rnm.frm, this);Spline4 s = new Spline,40;l

//*** Methods ***public void doSimulationQ {

findRoutesO; //finds routes available.sendRoutesO; //tells Platforms the Routes they have.sendGenerator0; //tells Filters who is their GeneratorsimDialog.showQ;)

private void findRoutesO {routes -renroveAllElemens(Xfor (int i = 0; i < mm.geModelArray0.sizeO; i++1 1

Model m = mm.getModel(i);if (m instanceof Plaform) {

Pladorm plf = (Plaform)m;plf.resetRoutes0;Routes r = new Routes(m, mn, this);

))

System.out.println(this.toString( )) ;

l

private void sendRoutes0 {for (Enumeration e = rout€s.elements0; eJrasMoreElements0;) {

Roures r = (Routes)(e.nextElement0);Pladorm plf = r.geGenerator0;plf.addRoutes(r);

)l

早稲田大学渡辺仁史研究室 1996年度修士論文

Page 35: 群衆波動シミュレータの構築 修士論文別冊

群集波動シミュレータ 35

pnvate void sendGenerato() {for (int i = 0; i < mm.geModelArray0.sizeO; i++1 1

Model m = mm.getModel(i);if (m instanceof Pladorm) {

Plaform p = (Pladorm)m;p.sendGenerator0;Date t€mpl = p.getStartTime0;if (rcmpl != null) (

if (templ.after(start)) start = templ;l

Date t€,rrp2 = p.getEndTime0;if (temp2 != null) {

if (temp2.before(end)) end = temp2;)

simDialog.resetTimeQ;l

l)

public void tellTime{Date start, Date end) { //told from SimDialogfor (int i = 0; i < nm.getModelAnay0.sizeO; i++) 1

Model m = mm.geModel(i);if (minstanceof Pladorm) {

((Pladorm)m).setArrival(start, end);)

l)

public void docalcO {mm. frm.setCursor(ava.awt.Frame.WAIT_CURSOR);tluead = new Thread(this);thread.startO;for (Enumeration e = routes.elements0; etrasMoreElemens0;) {

((Routes[e.nextElement0)).clearDensity((in$((end.getTime0 - start.getTime0) / 10000);)

)

public void run0 { //calculationuY{

thread.sleep(2fiX));I carch(IntemrptedException e) {)

for (Enumeration e = routes.elementsQ; e.hasMoreElemensO;) {Routes 1 = (Routes)(e.nextElement0);r.doCalc(start, end);

Iif(thread != null) {

mm. fi m.setCursor(j ava.awt.Frame.DEFAULT_CURSOR);System.outprhtln("OK! " );ttuead.stopo;thread = null;)

)

void addMe{Routes r) {routes.addElemen(r);l

public String toSningO {inti=0:Suing result = new Sring0;for (Enumeration e = routes.elements0; elrasMoreElementsO; i+r) {

result r- i + " : " + enextElement0.toStringo +'Yn";)

return rcsulq)

I

早稲田大学渡辺仁史研究室 1996年度修士論文

Page 36: 群衆波動シミュレータの構築 修士論文別冊

群集波動シミュレータ 36

l***** Soquerrce class (for Wavelet calculation)** t996.4.2l-5.t7r, 1995.11.21-11.28

* Each'Sequence" has 2 elernents. The form ofdata is [Index, Body].'t flndex] is the minimum order, and [Body] is a Vector of the data sequence.'l* Sources : S. Sakakibara, Beginner's Guide to Wavelets, Tokyo Denki Univ. hess, 1995.*@version l.O,l996llln8* @author Tomoyuki HIGUCHI!t

*l

package wavelet;

import j ava.util. Vector;import j ava.util.Enumeration;import sim.EnorMessage;

public class Sequence exbnds Vector {l*** The two-scale sequence of the scaling function.*lstatic protected Sequence pSequence;

F** The two-scale sequence of the mother wavelel*l

static protected Sequence qSequence;

l+** The decomposition sequence which is a LFF, of 0re mother function.*l

static protected Sequence gSequence;l*** The decomposition sequence which is a HPF, of the mo0rer function.*lstatic protected Sequence hSequence;l*** The values od the scaling fimction at integer knots.*l

static prot€cted Sequence scalingAtKnots;

static protected Sequence interpolationSeq4;

//*** Construclsls !*'**

public Sequence0 {suped2);)

public Sequence(int fust, Vector last) {thisO;this.addElement(new Intege(first));this.addElementfl ast);)

早稲田大学渡辺仁史研究室 1996年度修士論文

Page 37: 群衆波動シミュレータの構築 修士論文別冊

群集波動シミュレータ 37

public Sequence(int size) {this0;this.addElement(new Intege(O));Vector vec = new Vectodsize);for (int i = 0; i < size; i+r) {

vec.addElement(new Double(0));)

this. addEleme,nt(vec) ;

l

//t**r Metlrcds ****//** Basic functions **public double objToDouble(Object o) {

return Double.valueOf(o.toStringQ).doubleValud);)

public synchronized int firsO {return Integer.parselnt(this.firstElement0.toString0);l

public synchronized Vector last0 (

return (Vector) this.lastElement0;)

public int leneth0 {renrn last0.sizeO + firs0;| ilretums the number of elements lager than Index 0

public void addToElementAt(double d, int i) {Vector last = this.lasto;double e = objToDouble(last.elementA(i));d+=e;last.setElementAt(new Double{d), i - this.first0);this.removeElementAt( I );this.addElement(last) ;

)

public void shift(int dt) {if (dt<=0) {

int i = first0;this.setElementA(new Intege(i + dt), 0);) else {for (int i = 0; i < dt; i+r) (

this.insertElementA( "0", 0);)

)l

l*** Takes "num" elements form position "from".*l

Sequence take(Sequence seq, int from, intnum) {from -= this.firsto;if ((ftom < seq.flustQ) ii (from + num > seq.first0 + seq.lasO.size0)) {

ErorMessage ern = new ErrorMessage("error! : [take] Out of range.");return null;l

Vector trnp = new Vector(num);for (int i = 0; i < num; i+r) {

unp.addElement(seq.last0.elementAt(from - seq.first0 + i));)

rennn new Sequence(from, tnp);)

早稲田大学渡辺仁史研究室 1996年度修士論文

Page 38: 群衆波動シミュレータの構築 修士論文別冊

群集波動シミュレータ 38

l*** Gives the "Energy"*lpublic double ercrgy0 {

double sum = 0;for (Enumeration e = (this.las$).elementsO; e.hasMoreElementsO;) {

sum += Math.pow(objToDouble(e.nextElernen0), 2);)

return sum;

l

/f* Sequence manipulations **r** Gives the upsampled sequence of the original data.*l

Sequerrce upSample(Sequence seq) {vector tmp = new vector(seq.last0.sizeo * 2 -l);int i = *'1"tt0.size0;for (int i = 0; i <j; i+-r) {

tnp.addElement(seq.last0.elementAt(i));if (i != j-l) tmp.addElement("0");

Ireturn new Sequence(seq.first0 * 2, uttp);l

l*** Gives the downsampled sequence of the original data*l

Sequence downSample(Sequence seq) {Vector last = seq.lastO;if (seq.first0 4o 2 == I ) last.removeElementA(0);if (last.size0 Eo 2: l) last.addElement("0");int i= l"t1t1r",rrt'Vector tmP = new Vector(i);for (int i = 0; i < j; i+-t) {

unp.addElement(last.elementA(i * 2));)

renun new Sequence((int) Math.ceil((double) seq.first0 / 2), tmp);)

早稲田大学渡辺仁史研究室 1"6年度修士論文

Page 39: 群衆波動シミュレータの構築 修士論文別冊

群集波動シミュレータ 39

F* Gives the sum of the two data sequences, by tapping zeros in appropriate locations.1

public Sequence sequenceAdd(Sequence cs€q) {int idx = this.first0 - cSeq.first0;Vector add = new Vecto(idx > 0 ? ttris.last0.size0 : cSeq.last0.sud));add = (idx > 0 ? dris.last0 : cSeq.lastO);Vector tmpa = new Veco(Math.abs(idx) + add.size0);for (int i = 0; i < Math.abdidx); i+r) (

unpa.addElernen("0");

)for (int i = 0; i < add.size0; i+r) {

tmpa.addElemen(add.elementA(i)) ;

)Vector tmpb = new Vector(idx > 0 ? cSeq.last0.size0 : this.last0.size0);tnpb = (idx > 0 ? cSeq.last0 : ttris.last0);

idx = trnpa.size0 - tmpb.size0;Vecror vecl = new VectodMath.max(trnpa.size0, rnpb.sizeo));Vector vec2 = new VectodMath.max(tmpa.size0, tnpb.sizeo));vecl = (idx > 0 ? tmpa : rmpb);vec2 = (idx > 0 ? tmpb : tmpa);for (int i = 0; i < Math.ab(idx); i+r) {

vec2.addElemen("0");)

Vector add2 = new VecEor(vecl.sizeo);for (int i = 0; i < vecl.sizeQ; i+-r) {

double d = Double.valueOf(vecl.elementA(i).tostring0).doubleValue0;double e = Double.valueOf(vec2.elementA(i).toString0).doubleValue0;ad2.addElement("" + (d + e));l

renrn new Sequence(Math.mh(this.firstO, cSeq.first0), add2);)

l*** Gives multiplied Vector.*l

public Sequence sequenceMulti(double m) {Vector last = lasto;Vector temp = new Vecb(last.size.,0);for (int i = 0; i < last.size0; i+r) {

double d = f,)rouble.valueOf(lastelementA(i).toStringo).doubleValue0;d *=mitemp.addElemen(new Doubldd));)

Sequence out = new Sequence0;out.addElement(new Integer(first0)) ;out.adaFlemen(temp);rennn out;)

早稲田大学渡辺仁史研究室 1996年度修士論文

Page 40: 群衆波動シミュレータの構築 修士論文別冊

群集波動シミュレータ 40

//** Convolution **l*** Gives the list obtained by the convolusion of frlter and data.* The data boundary is treated as free.,l

synchronized Sequence lisConvolve(Sequence filter, Sequence data) {Vector lestData = data.las0;

int fl = filter.las0.size0;Vector sup = ns\il Vecto();for (int i = 0; i < (fl * 2 - 2); i+r) sup.addElemen("0");for (int i = lastData.siz{); i > 0; i--) {

sup.insertElementAt(lastData.el€rnentAt(i - I ), fl - l);)

sup.trimToSize0;Vector tmp = new Vector(sup.sizeo - fl + l);for (int id); i < sup.sizeQ - fl + l; ir-r) {

Vector part = new Vector(fl);for (int j=0; j < fl; j++) {

part.addElement(sup.elernentAt(i + j));l

trnp. addElement(paft );)

Vector tmp2 = new Vector0;for (int i = 0; i < unp.size0; i++) {

Vector elem = (Vector) rnp.elementAt(i);double w = 0;for (int j = 0; j < fl; j++) (

double f = objToDouble(filter.last0.elementA(fl - j - l));double d = objToDouble(elem.elementA());w+=f*d;l

unp2.addElement(new Double(w));)

tnp2.uimToSizeO;retum new Sequence(filter.firsO + data.irst0, tmp2);l

//** Finding function values from coefficients **l*** Gives the scaling function expansion coefficients which interpolates the data*l

public synchronized void findlnterpolation0 {Sequence se9 = listConvolve(interpolationSeq4, this);this.removeAllElements0;this. addElement(seq.elementA(0) );this.addElement(seq.elementA( I ));)

lt** Gives the list of {x, y[x]] pairs, where y[x] is the scaling function with data* taken as the expansion coefficients, evaluated at the integer knots x = n.*l

public Sequence scalingSample(int j) [Sequerrce onp = this'Sequence tmp2;for (int i = 0; i < j; i+r) {

tmp2 = listConvolve(pSequence, upSample(tnp));UnP = tmP2;l

renun listconvolve(scalingAtKnots, tmp);)

早稲田大学渡辺仁史研究室 1996年度修士論文

Page 41: 群衆波動シミュレータの構築 修士論文別冊

群集波動シミュレータ

l*** Gives the scaling function expansion coefficients of one less resolution level* by decomposing the scaling furrction expansion coefficients daa.*l

pubtc Sequence decomposeToscaling0 (

renrn downsarnple(listConvolve(gSequence, this));l

l**. Gives the wavelet expansion coefficients of one less resolution levelI by decomposing the scaling furrction expansion coefficients data.*l

public Sequence decomposeToWaveleO {return downSample(lisConvolve(hSequence, this));)

l*** Reconstructs the scaling function expansion coefficients* from this(the scaling frrnction expansion coefficients)* and cSeq(the wavelet expansion coefficients) at one level lower.*l

public Sequence reconstnrct(Sequence cSeq) {reurrn (listConvolve(pSequence, upSample(this))).sequenceAdd(listConvolve(qSequence, upSample{cseq)));)

l

41

早稲田大学渡辺仁史研究室 1996年度修士論文

Page 42: 群衆波動シミュレータの構築 修士論文別冊

群集波動シミュレータ 42

r・*

+

*

摯 spline4 chss(fOr Wavelet calculation)十

* 19964.21‐ 5.17* 1996.11.21‐ 11.28十

* "Spline/4"has he sequences b be“ cubic B―spline.中

十Sollrces:S.Sakakibarat Begim♂ s Cuide to Wavelets,Tokyo Denki U五 v.Pr“s,1995.中@v∝da1 1.0,1996rH28+@au■Or TOmoyuki HIGUCHI*

十ノ

package wavdet;

importiava.10・ PrintStream;

mportJava.udl.V∝ to弓

public class Spline4 extends Sequence{

static private Vector roots4=new V∝ to(3);

static Fmal double r∞ t2=Ma血 .sqrt(3)-2;

public Spttp4(){

super();

r(Psequence一 nun){setSequences(洸

〕〕

public Spline/(int rlrst,v∝ tor hst){

SupeKflrst,lastゝ

if OSequence==nun)setsequences();

)

/1■*Makes new"SplineZ"拠 tance,which data is interpolated.●/

public SPline4(V∝ tor dat→ {

SupeKO,data);

mdlnterp01ation();

rrt・+,Me面ds十十十十

//1tt Basic functions十*

private intmulicint m){

int s=1;

fOr(int i=m;i>0;i― )(s■=i;

)

private intbinomial(intm, intk) {if ((k < 0) ii (k > m)) return (0);

int nrmrer = 1;intdenomi= 1:for (int i = m - k + 1; i<= m; i+t) numer *= i;for (int i = 1; i <= k; i+t) denomi *= i;rcturn (numer / denomi);

I

m“

ヽ′

早稲田大学渡辺仁史研究室 19%年度修士論文

Page 43: 群衆波動シミュレータの構築 修士論文別冊

群集波動シミュレータ 43

//** B_Spline wavelers **double bSpline(int m, int x) {

double tmP = 0;for (int k = 0; k <= m; k+-r) {

trnp rE Marh.powGl, k) * binomial(m, k) * Math.pow((x > k ? x - k : 0), m - 1);

)tsnp/=multi(m- l);rentrn tmp;I

l*** Makes B-splines. (for the purpose of future extension)*l

public void makeSplin{int m) {Vector binom = new Vector(m + l);Vector tmps = new Vector(m + 1);for (int k = 0; k <= m; kr+) {

double d = binomial(m, k) /Math.pow(2, (m - l));binom.addElement(new Double(d));double e = bSpline(m, k);unp5.addElement(new Double(e));l

Vector euler = new Vecto(2 * m -1);for (int k= l; k <= 2 * m - l; k+-r) {

double d = bSpline(2 * m, k);euler.addElement(new Double(d));)

pSequence = new Sequence(0, binom);

Vector tmp2 = new Vec!or(binom.siz4));for (int k = 0; k < binom.size0; k+r) {

double d = Math.pow(-t, k ?o 2) * objToDouble(binom.elementAt(k));tmp2.addElement(new Double(d));)

Sequerrce trnpl = new Sequence(0, tmp2);

Vector tmp4 = new Vector(euler.sizd));for (int kd); k < euler.size0; k++1 1

double d = Math.pow(-\ k qo 2) * objToDouble(euler.elementAt(k));tmp4.addElement(" " + d);)

Sequence trnp3 = new Sequence(0, tnp4);

qSequence = listConvolve(fnpl, trnp3);

scalingAtKnots = new Sequence(0, nnp5);)

Vector truncatedEuler(Vector lis, int n) {Vector oulput = new Vector(2);Vector nest = new Vector(lis.sizeo);Vector range = new Vector(lis.sizeO);Vector join = new Vector(lis.sizeO);double times = -l;

for (int i=0; i < lis.size,0; i+r) {Vector trnpl = new Veclor(lis.size0);for (int j=O; j < lis.size0; j+r) (

bnpl.addElement(lis.elementA((i + i) 7o lis.size0));l

nest. addElement(tmpl );

早稲田大学渡辺仁史研究室 1996年度修士論文

Page 44: 群衆波動シミュレータの構築 修士論文別冊

群集波動シミュレータ

Vector tmp2 = new Vecbr(n*2 +1);double e = objToDouble0is.elementA(i));times *= e;for (int j=-p; j <= ry j++) {

tnp2.addElement("" + Math.pow(e, Math.abs0)));l

range. addElement(unp2) ;

Vector part = new Vecbr((Vector) neslelementAt(i)).size{));pat = (Vector) nest.elementAt(i);Vector tmp3 = new Vectod);double b = l;for (int j = 0; j < Parrsizeg; j+r) {

b *= I - objToDouble(parrelementAt(0)) * objToDouble{part.ele,mentAt(i));)

for (int j=1;; < lis.size0; j+-r) {b *= - 1 +objToDouble(parrelementAt0)) / objToDouble(part.elementA(0));)

join.addElement(new Double(b));)

for (int id); i < n *2 +l; i+r) {double d = 0;for (int j=0; j < lis'sizeo; jr-r) {

Vector part = (Vector) range.elementAt();d += times / objToDouble(oinelementAt(l)) * objToDouble(part.elementAt(i));)

ouput.addElement(new Double(d));l

return output;l

void makeSplineGHSequence(int m, Vector lis, int trfter) {Vectorbinom = new Vector(m + 1);int mul = multi(2*m -1);for (int k d); k <= m; kr-r)

{double d = binomial(m, k) / Math.pow(2, m);binom.addElement(new Double(d));)

Vector euler = new Vector(2 * m - l);for (intk= 1; k<= 2 *m - 1; kr+) {

double d = mul 't bSpline(2 * *, k)teuler.addElement (new Double(d));l

Sequerre trlis = new Sequence(nOrder, truncatedEuler(lis, tOrder));

gSequence = listConvolv{listConvolve(new Sequence(-m, binom), new Sequence(l - m, euler)), upSample(trlis));

Vector trny' = new Vecto(binom.size0);for (int kd); k < binom.size0; k++1 1

double d = mul * Math.pow(-l, (k+l)Vo 2) * objToDouble(binom.elementAt(k))ltmp4.eddElement("" + d);)

Sequence trnp3 = new Sequence(l - 2 * m, tmp4);hSequence = lisConvolve(tnp3, upSample(ulis));)

44

早稲田大学渡辺仁史研究室 1996年度修士論文

Page 45: 群衆波動シミュレータの構築 修士論文別冊

群集波動シミュレータ

〃十■spline4=Cubic Spline■ ●

″中中se撻 血D sequences of cubic B‐ spline.●ノvOnd setsplh引 K){

makeSplinc(4光

double angle=Maぬ.atan2(7攀 Ma■ .sqrtcl lSЮ 5),-5166);

int us[]=〔 o,4,2〕 ;

fOr(int i=o;iく 3;H+){double r=2+Maぬ ,sqrt(301)*M劉ね。∞S((angle+1ヽ [i]+Math.PDノ 3ゝ

double n=r-20+Maal.sqrtcMa血 .POW((r_20),2)-1〉

roots4.addElernen〈new Double(→ 〉〕

makeSplineCHSequence“ ,roo厖4,9);//Truncadon order=9

int iOrder=5;

Vector mp=new V∝ to<);

Vector mp4=new V∝ Юく1洸

m「/4.addElementcnew Doublく r00t2漱

mp=mncatedEuler(mp4,10rder光Vector mp2=new Vecto<mp.size()光fOr(hti=0;iく unp.sizc();i++){

double d=obiToDouЫ e(mp.elementAt(1));

mp2.addElement(""+(d+6));

)

interpolatbnSeq4=new Sequence(-10rder‐ 2,mp2沈

夕■十Also sets dle sequences of cubic B― spline,works faster cos alere is no calculatlon.●/

private void setSequenceso{

double pseq[]={0.125,0.5,0.75};pSequence=new Sequence(0,dOubleToV∝ toroseq));

double qseq□ ={0.m00248015873015873,-0.∞ 3075396825396825,0.“ 15922619“ 7619,-0.196031746031746,04583829365079365,‐ 0.6017857142857143);qSequence=new Sequence(0,dOubleToV∝ tor(qseq));

double gseq[]={-2.691596629792036e-7,Ю.00003337579820942126,‐ 0.0004508779167288531,-0.002065086053365961,-0.00413228880650981,‐ 0.002672941893356771,0.u12745246405042Hl,0.002866114062136573,Ю .005579983284013115,-0.005387929818552135,0.01042405218653248,0.0100667475195399,-0.01947326935597754,-0.01881568662090745,0.03637358698883228,0.03522610167448665,‐ 0.06790360849857948,-0.06642083738702515,0.1264574463559693,0。 1290835712181074,‐ 0.2329246261335595,‐ 0.2822118708112642,04006808254673663,0.893162856314243};gSequence=new Sequence(-25,doubleToVectoKgSeq));

double hseq[]= {0.001356564701415186,‐ 0.005426258805660745,0.005605084248642842,0.004710957033732356,

-0.0091147451381518,-0.00880083983869757,0.01702802946613788,0.01644094468650876,‐0.03181181131835634,‐ 0.03070970087148118,0.05943338839037274,0.05733095225431275,‐0.1110584407108168,‐ 0.1067758033726191,0.2076908383800496,0.1967942773044705,‐0.3897455807998404,Ю .3457708907750407,0.7420976984779873,04684225966331863,‐1調5394519892303〕 ;

hSequence=new Sequence(‐ 25,doubleToVectonseqp);

double sknots□ =(0,0.1666666666666666,scdingAtKnots = new Sequence(O, doubleToVector(sknots));

double ipSeq[] = {-0.00239233,0.0OE9283, -0.033321, 0.lA:355, -0.464101, 1.732O51;interpolationSeq4 = new Sequence(-7, doubleToVecto(ipSeq));I

45

早稲田大学渡辺仁史研究室 1996年度修士論文

Page 46: 群衆波動シミュレータの構築 修士論文別冊

群集波動シミュレータ 46

Vector doubleToVecod&uble[ elem) {Voclor ouput = new Vectodelem.length + 2 - 1rtfo(int i = Q i < elem.lcngth; ift) {

output.addElemen(new DoubHelem[i] ));l

fo(int i = elern.length -2;i>= 0; i-) {output.addElffren(new Doubldelern[i] ));l

renrn output;l

)

早稲田大学渡辺仁史研究室 19%年度修士論文