理
麟
…
参加型 シミュレーシ ョンの開発 に関す る研究
響 囀 ︸ ¨ 岬 妬
潤
―
中 囀 ﹃ 一 1-
岬
ヨ ロ い 塾
謹コ塾一ヨ
︼ 一 一攣 一]
, 罐 一一 一一 一囀
目次
序章
2
研究背景 :過 去 の シミュレー シ ョン
4
RTSの 開発 目的
10
本 システムの概要
13
シミュレー シ ョンの実行
36
今後 の展望
40
参考文献
42
機
44
R tt Sリ ス ト
一口題一︼ 一瘤
一摯 攣 ︰ ・
彎 一彎 一攣 攣 一
土 早
¨ 攣
…
―
.』
.・
lm 2 1豊
これ まで筆者 らは舗ぼ ltalk上 でのオブ ジェク ト指向のシミュレー シ ョンの研究開発を 行 つて きた。 この シミュレー シ ョンの 中で はオブ ジェク ト相互 の通 信、同期 を実現 し、 これ までの シミュレー ションに比 べ きわめて複雑 な建築物利用者 の行動を表現す ること が可能なことが実証 さた。 しか し、今 日の社会を解析 しよ うとす る場合、 その解析の元 となる細分化 され たモデ ル同士における情報伝達 はい つそ う複雑 さを増 している。 あらゆる分野 の流れの物 の流れの制御 において にさまざまなフィー ドバ ックと統 合制 御が実用化 されて い る。身近 な例をあげれば、道路 の信号 は地域 ごとに複数 の信号が続 合的に制御 され、交通量の変 化 に従 って信号 の点減の パ タ ー ンが切 り替え られて い る。 また、流通業界で は POSが 常識的な技術 とな り日々刻刻 と末端の店舗 にお ける商品の 流れが出荷 に反映 されている。 建築物 の運用 においてもむ ろん この流れに漏れ ることはない。 さまざまな利用状況の デー タを絶えず運用 パ ター ンにフ ィー ドバ ックされ る ことを前提 と して計画す るのは今 日では常識 とな りつつある。 このよ うな状況 を これまでの シミュレーシ ョン上 で再現す る場合、 シミュレー シ ョン 実行者が 、 この複雑 な情報 停達 の システムを基礎か ら構築す る必要が あつた。 この情報伝達 の システムを構築す るためには、 シミュレー シ ョンの構造 は言 うに及ば ず、複雑 な マルチ プ ロセスのプ ログラム に関す る知識が 必要 とされ、 また、その記述 も 複雑 を極める。また、その情報 伝達 システムには汎用性が な く、各 シミュレー シ ョンを 構築する毎 に新たに作成する必要があ つた。 また、 これ までの シミュレー シ ョンにおいて得 られる結果 は統計 的なアウ トプ ッ トで あ り、 シミュレー シ ョン内においてモデル間 に複 雑 な情報 伝達 と意志決定が な されて い るにも関 らず、その過程についての出力はほとん どなされていなか った。 本論文 においては、連続系 シミュレー ションにおける、様 々な行動研究の結果 を容易 に組み込む ことが 可 能な シミュレー シ ョンのメカニ ズムの構築及び、設計者が容易 に シ ミュレー シ ョンに参加・ 介入 し、計画評価 に活用す ることが可能 な シミュレー シ ョンシ ステムの原型 R.T.S.(RealttimeSi耐 lation)を 提案する。
世娑盛︼
鱈 錮 ・ ・
電 攣 ¨ 簗
一一 一蓼 攀 響 一
錮 一興 一岬 一︼
“飩一 苺一 一 聾
彎
彎
…
…
彎 出
麒 研究背景 :過 去 の シ ミュ レー シ ョン
響 額 騨 攀
麟綺彗鞘
… ―
響 撃
綽 純
轟 棗 警 遇 器 警 響 隅 謡 鐵 鎚 欄 鐵 鶴 齢 鋳 警 諄 田 墨 黎 薔 驀 要 謡 墨 暴 墨 旨 41鏡
ヨ一一 J
一一 一 ︼
≡
過 去 の シ ミ ュ レー シ ョ ンの 作 業 過去に筆者等が実行 した シミュレーシ ョンの作業を次に示 し、この シミュレーションにおける 問題 点 を以 下 に述 べ る。
1)空 間 の解析
過去に筆者等が実行 したシミュレー シ ョンのほとんどは、 ノー ドと リンクを空間記述 の基 に した、待 ち行列を使用 したシミュレー シ ョンで あ った。 この シミュレー シ ョンを計画す るにあ た り、まず シミュレー シ ョンを実行す る建築 を解析 し、空間を ノー ドと リンクによって表現す る。 ノー ドは、建築物利用者が 一定時 間その場所 に滞在若 しくは滞留する点である。水族館の シミュレー シ ョンな らば ノー ドは各水槽や各展示室とな り、 エ レベ ー タの シミュレー シ ョンな らば各階が ノー ドとなる。
fig:1空 間情報 の読み替 え 2)ノ ー ドの定員、滞在時間 の設定
次 に、 この各 ノー ドの定員及 び ノー ドにおける建築物利用者 の滞在時間 を設定す る。 1)で 設 定 したノー ドは水槽や部 屋などであ り、 これ らは同時にある一定の人数 しか利用できな い設備 である。
3)待 ち行列 の設定 各 ノー ドは2)で 設定 された定員以上 の建築物利 用者を同時 に収納す る ことは不 可能 であるた め、 ノー ドが定員にな つて しまえば当然各 ノー ドに入 る前 に待ち行列が生 じる。 これを収納す るため、各 ノー ドの前 に待ち行列を設定する。 4)建 築物利 用者 の行動
〓5
一 一 一 一
一 一 一一 一 一
一 一一・ 一一
日ヨ〓コ
“墨彎一彗
攣 罐 糎 摯
罐 攣 中 攣
1)-3)で 建築空間が シミュ レー シ ョンの枠組 みへ 読み替え られ た。次 に、建 築物利用者の行
動を シミュレー シ ョンの枠組みへ読 み替える。建築物 利用者の行動を調査 し、その行動を数 パ ター ンに分 け、 1)で 解析 した ノー ドと リンクのネ ッ トヮー クの中をどのよ うに行動するかを記 述する。 ノー ドに複数の リンクが存 在する場合、建築物利用者の選択を確率で表現する。
劾
"施
物 2月じ¨ 『
r sittratJ"_rra′ ′
tasks self enter.
AIICounter := AIICounter i self number. CurrentCounter := CurrentCounter + self number. self wa:k: 6.
self useEscalator臨 self se:f self self self
walk: iO. enterGalleryA. walki 50. enterCa‖ ern walk: 15.
seif enterCaller嗚 self seif self seif self seif self
walk: 5. enterCalleryE. walk: 75. enterCa‖ ery海 藻 の森 walk: 25. enterGalleryHl. walk: 11.
縫 呻 le4
next=1
.
i fttrue:[seif watch:'実 験 展 示 ']
策月甦月 R') ifFalse:[(Sinulation active provideResourceFor: 'ヨ ヒ題
storePass: anber]. self se:f self self self self self self
enterGalleryH3. walk: 36. enterCa‖ ery水 辺の生態 walk: 10. enterResturant. walk: 20. enioyShOpping. waik: 20.
.
self useEscalatoFい _ self walk: 6.
CurrentCounter := CurrentCOunter ―self number. self exit
list:1待 ち行列型シミュレーションにむ
聾鏑麟 経
鏑 0 ﹃ ・
﹃ 一︸ 響 響
一 ︼ 一 攣
華羹﹄蝸
紳 綱 彎 率
“一一コ一 “
一︼ 一一 ︼ 一︼
一 ¨ 一 一” 一
5)建築物利用者の到着分布 4)で 建築物利用者の行動 を幾 つかの パ ター ンに分類 した。次にこのパ ター ン毎 に建築物利用
者 の建築物 へ の到着分布 を解析 し、同時にパ ター ン毎 の建築物利用者総数 における比 率 を調べ る。
6)通信 システム 建築物利用者間での、相互の行動 の 間に同期等が ある場合、行動の同期 を取るために、建築 物利用者間でのメ ッセー ジの通信 システムを構築する必要がある。 また、建築物利用者が建築物の案内版 を見た り、部屋の混雑の状況に応 じて行動 を取 る、等 とい った状況を表現す る場合 も、建築物 と建築物 利用者 の間で情報を交換が行われて い る。建 築物利用者 と建築物 との間での、相互 のメ ッセージの通信 システム を構築す る必要が ある。 7)プ ログラムの作成、実行 以上の 1)か ら6)迄 の手順に したが つて建築物及びそれを利用す る建築物利用者 と、相互の相 関を解析 した上でシミュ レー ションのプ ログラム を作成 し、実行する。
8)実 行結果
実行 した結果は通常、単位 時間毎 の各待 ち行列 の待 ち時間や、各 ノー ドの平均滞留 人数など の形で出力される。
“飩一瘤一“
摯 7 ︰ 簗
一 一 攣 ︺ 一攣
中 攣 一¨ 一響
蝉 一蝉 興 一岬
聾︼一 “一 赳
一J・Jコ
一 一 ] 一一
一 一 一
過 去 の シ ミ ュ レー シ ョ ンに お け る問 題 点 では、先に述べた、過去に筆者等が行 ったシミュレーシ ョンにおいて、どのような問題が発生 して い るか を述 べ る。
シミュレー シ ョン実行者 の 意 図 と シミュレー シ ョン結果 シミュ レー シ ョンの プ ログラム を作 成 す る前の建 築物 の 解析 の 段階 で あ る1)-3)で 、実 際 の建 築物 を シ ミ ュレー シ ョンの パ ラダ イ ム に 置 き換 え て い る。 この 置換作 業 は シミ ュ レー シ ョン実行 者 の主 観 によ って行われ て い る。 つ ま り、 どこを ノー ドに し、 どこに待 ち行 列 を 定義す るか はす べ て シ ミュ レー シ ョン実行 者 によ って決定付 け られ る。 当然 なが ら、建築 物 利用者や物 の流れ のネ ックは、 この事 前 に設定 され た待 ち行 列の中に しか 出現 しない。 どの よ うな混雑 状況が 建築 物 の 中に生ず るかが シミュ レー シ ョンの結果 と して得 られ た と して も、 それ は その シ ミュレー シ ョン実行 者 の 行 った シミュ レー シ ョンの結 果 で あ り、 その シ ミ ュ レー シ ョンの 実行結果 にお いて は、 シミ ュ レー シ ョン実行 者が 混雑す るで あ ろうと予 測 した 場所以 外 に混雑が 生 じる ことはあ り得 な い 。 また、実 際 の建築 物 をネ ッ トワー クで表現 し、 シ ミュ レー シ ョンの パ ラダイム に置 き換 え る作業 は 高度 に知 的な作業 である。 CADで かかれ た 図面 であ つて も ドラ フターでかかれ た 図面 と同様 に座 標情報 と して表現 され て い る建築物 のデー タを、 自動 的 にネ ッ トワー クの表 現 に変換 させ ることは極 めて 困難 である。
建築物利 用者 の 行 動 過去 に 筆 者 らが 研 究 した シ ミ ュ レー シ ョ ンに お いて は 、 建 築物 利 用 者 の 行 動 は 事 前 に tasksと い う形 で記述 され て いた。 また、様 々 な判 断 もこの tasksの 中に記述 されてお り、建
築物利 用者 は このtasksの 記述 に従 って行 動 していた。 その ため 、 シ ミ ュ レー シ ョンを 実行 する者 は、 シミュレー シ ョンの 中 にお ける人間の行動 や意志決定 を、基本 的な部分か ら記 述 己述 は フ ロー チ ャー ト的な記 述 で あ り、建築物 内 に す る必要が あ つた。 また、 この tasksの 言 おける建築物 利用者 の臨機 応変な行動 を記述 するの は困難 で ある。
シ ミュ レー シ ョンにお ける状況 把握 人間が行 動す る場合、周囲の状況 を把握 してその結果得 られ る知覚情報 と、当人の持 つ 経 験、及 び 目的 その他 を元 に して意志決定 し、次の行動 に移 る。 これ までの シミュ レー シ ョン において は、 この「 周 囲 の 状況 を把握 す る」 とい うメ カ ニ ズム は、 シ ミ ュ レー シ ョン内にお けるさまざ まなオブ ジ ェク ト同士 の 通信 メ カ ニ ズム と い う形 で実現 して きた。 しか し、 この 通信 メカ ニ ズム も各 シ ミュ レー シ ョン毎 に独 自な メカ ニ ズム を と って いた ため、 シミュ レー シ ョン実行 者が シミュ レー シ ョンを構築 す る度 に「 周 囲 の 状況 を把握 す る」 とい う システム を新 たに記 述 す る必要が あ つた。 しか し、 この記述 を行 うには シミュ レー シ ョンの システム に精通 して いる必 要が あ る。
一 一 一一 一
“コ一 J一 ロ
一 “ 一︼ 一“
:電 8 1=
コヨ““
出力結 果 これ までの シミュレー シ ョンを 実行 した結果 は、様 々な統計 的な出力 と して得 られ、実行 中 の 状況 を微細 に知 る ことは不可 能であ った。 しか し、統計 的な事実 と実際の建築物利用者 の体感 には差異が 生 じ得 る。統計 的 に見て非常 にす いている エ レベー タで あ って も、特定 の 行動 パ ター ンを持 つ建築物利 用者 にとっては極 め て混雑 してい る、 とい う状況 も起 こ りうる。 しか し、空間の記述 をネ ッ トワ ー クと して表現 した場合 、例 えば「 ある部屋か ら別 の部屋 へ 移動 した」 という行動 は、 シ ミュレー シ ョン内で は単 に ノー ドか ら リンクを通 って次の ノー ドに移動 した とい う出力 しか得 ることが 出来 な い。 この 間 の移動状況 などをプ ログラム 技術 によ つて創造 して しまうことは不可能 で はないが 、そ の作 業 は非常 に困難で ある。
ヽ ヽ ヽ﹁ ヽ ヽ
ミク ロな立場か ら、 シミュレー シ ョン実行者が シミュレー シ ョンに参加 し、実行状況を シ ュレーシン実行者が体感する事が可能な シミュレーシ ョンシステムを作 り出す には、 シ ュレーシ ョンの空間記述 の方法か ら見直す必要が ある。
9
コ“一“一 “
一一一 一一 一
一 一一一・
コ“コ一 “
…
L… ……
… …―― ― ‐ ― ― ‐一 ―‐,一 ― ―・ ・ ……・ … ……
=一 ―
‐ ―・↓ ―・ ==・ ‐‐― ‐ ― 「
F「 TTTTこ 「
■
==rT:「
「
===「 ==■
a― 77,マ
憂 轟 蒸 面 高 扇 面 「 :「 T=========
轟 出
:「
…
“
‐ 屁 R tt Sの 開発 目的
1“
麟
越由む
率
“ :譴
―
期 饉勘
蝸 瘤 攣 攀 錮 攣 由 螢 彙 昌 轟 藁 画 甍 轟 墓 扇 遜 面 帯 響 攣 攣 響 響 中 申 攣 壼 彎 攣 攣 │ … … … … … … … … … … … … … … ―
― ― 懲鍵 議
―
錮 “
l ol鎧
実 座 標 /連 続 系 シ ミ ュ レー シ ョ ン 本 システムで は、空 間及び建築物 の表 現 に実座標系を用いる。実座 標 を用 い ることによ り、実 際の建 築物か らシミュレーシ ョンヘ の パ ラダイムの読み替えが不要 とな り、 よ り客観的な シミュ レー シ ョンを実行 する ことが可能 となる。 実座標系を用 い ることによ り、 シミュレーシ ョン内で視覚という概念を用 い ることが可能 とな る。視覚情報 は システム側で各建築物利用者に対 し供給する。 これ によ リシミュレー シ ョン実行 者 は複雑な情報 件遠 のメカニ ズムを記述 する作業か ら開放 される。 本 システムでは、 この視覚情報 を シミュレー シ ョン内での建 築物利用者 の意志 決定 の材料 と し て使用するのみな らず、 シミュレー シ ョン実行 中 に シミュレー シ ョン実行者が任意の建築物利用 者 の視点に立 って シミュレー シ ョンに参加 し、 シミュレー シ ョンの進行を体感す ることが可能な ユーザ ーイ ンタフ ェイスを実装する。 これによ り、 これまでの統計的な、 マク ロな実行結果 に比 べ てよ リミク ロな立場からの シミュレー シ ョンの実行結果の把握が可能 となる。 意志決定 メカニ ズム シ ミュレーシ ョン内 の建 築物利用者 の行動 は、 前述 の視覚情報 を基 に行動の意志決定を行 う複 数 のモ ジュールを建築物利用者 に組み込み、 これ らのモジュールの意志決定 を統 合 して建築物利 用者 の行動 とす る。 このモ ジ ュール群 に関 して、人間の行動 の基 礎 となる幾 つ かの基本的な モ ジュールはシステム側で用意す る。 これによ り様 々な行動研究の結果 を用意に組み込むことが可 能である。 また、本 システムの建築物利 用者は、過去 に筆者 らが 研究 した シミュレー シ ョンの tasksに あ たる明確な行動 リス トを持 たず、 シミュレー シ ョン内 の状況を把握 しなが ら行動す る。そのため、 建築物利用者は以前の シミュレーシ ョンに比 べ よ り実際の建築物利用者 に近 い行動 を取 りうる。 コ ンピュータグラフ ィック スアニ メー シ ョンの分野では、過去、 モデルの動作 はモデ リングの 段階で逐―入力する必要が あ つた。点景 と して使用 される樹木 もその枝 1本 1本 が入力されてい る。モデルの動 作や点景の細部 に至るまで詳細 に記述 できる反面、入力が極めて繁雑 にな り、 ま た動作 に統一性が欠 ける、動作 に現実感が無 い、樹木等は複写 して使用するため 同 じ樹木ばか リ がはえて い る等 の 問題が生 じていた。 これを解決す るため、 モデルの枠組 み の 中 に重 力や弾性 の 法則な どの物理法 則 を導入 し、樹木等 の作成 には実際の樹木 の成長 シミュレー シ ョンを行 い、 モ デルの動作 の現実間の向上を図 つている。
”錮一N一
撃 神 日 一
中 彎 一¨ 一一
中 ¨ 一一 一¨
響 嘩 一摯 一︼
綺迪一題一 一
者を欠 かす ことは出来 ない。現時点で は コン ピュー タグラフ ィック スで人 間の動作 を自然 に表現 するには相当の処理 能力が必要 とされ るため、建築物 の シミュレー シ ョンにおいて行動す る利用 者が多数表現 されて い る例 は少 ないが 、将来 的には、建築物が実際に利用 されて いる状態 を想定 するために建築物 利用者 の表現 は不可欠になる。今回の シミュレー シ ョンの枠組の中では人間の 行動が記述 じやす く、またその行動が周囲の環境 を把握 しなが らの 自然な行動 であるため、将来 のコンピュータグラフ ィックスでの建築物利 用者 の記述 には大きな威 力 を発揮す ることになる。
‐ 整 彎
―
― 糠 雹 響
:菫 … ― ―
―
― ―
:謹
輌
― 聞轟畷識選出鐵慇饉鐵鶴鐵鐵鶴躍艤轟轟鐵鐵覇轟議鐵饉出 螂 離 12避
瑠 饉 宙 踏 騨 鋼 製 騨 轡 響 習 門 壁 轡 鰹 躙 岬 圏 躙 彎 圏 圏 錮 圏 彎 轡 鬱 彎 彎 輌 関
墜¨ 攀四一“
︼ 彎 一響 饗
彎 囀 中 岬
建築分野 にお ける コンピュー タグラフ ィック スでは、特 にその内観 を表現す る場合、その利用
t*
lgryryrs
;4riede;].i!ll|.'*,;i;rrlli:@e.;:@,@aill8liitai;!it
j
idiicr
徊 本 システム の概要
攣 襲 簿 一華
錮僣鵬興
―
― 崎
:“
準
_ 13樹 …
陸と幣諄
﹃ 彎 鰹 鰹
攣 彎 攣 蝉
本 システムは以下 に示す 4つ の部分 (ク ラス)か ら成 り立 っている。 RealTimeSi躙 風二iation
hemler
シミュ レー シ ョン管理 モ ジュール
RTSObject
●j用 者 スケ ジ ュー ラ ー 建築物利用者
RTSRom
駆
RTWall lrlst inct
(壁 その他 ) ― 意志決定 モ ジュール
Obstac:e
障害物 回避 モ ジュール
PlanView
ビジュアルイ ンターフ ェイス
PerspectiveView
ビジュアル イ ンターフ ェイス
:nstinctStatusView
ビジュアルイ ンター フ ェイス
艤
それでは、 システムにおけるもっと も上位 の部分である クラスRealttiIIleSi閥 lationか ら 説明す る。
襲鏑麟総 一
日 撃 整 ¨
蝉 ︼ ﹃ 攣
罐 ﹃ 一 攣
四 電 ﹂ 興
耀鏑警襲
一 一一 一 ・.
一コヨJ
一 一 一 一
1.RealttimeSimulati on Rea ltti meSimulationは シミュレー シ ョン全体 を管理運 営 し、 シミュレー シ ョン内の様々な通信
を管理 す るクラスである。 この クラ スは シミュレー シ ョン内 の各オブ ジェク ト (建 築物・ 建築物 利用者 )及 び時間を管理 している。以下 にこのクラスの詳細 を述べ る。
情報保 持 シ ミュレー シ ョン内 の 各 オブ ジ ェク ト間 の 情報交換 はRealTimeSirlulationを 通 して行 われ る。 各 オ ブ ジェク トは次 の よ うに管理 され て い る。
■ 一 2 一 3
滋機識熟出織J ¨ 襴
fig12 RealTimeSi■ lulationの 情報 の構 成
建築物 :rooms Real TimeSirlulati onは roomと い う配 列 を持 ち、 この 中 に建 築物 の オブ ジ ェク トRttSRoomが 収納 されて い る。各 々のRTSRoomは 自分 自信 の 部屋 を 構 成 す るRTSWall,RTSOpeningを 保持 し て いる。
建築物 利 用者
:s iIIll」
lationObiect
sinlulationObieCtと い う配 列 内 に は建 築物 利用者 RTSObieCtが 保 持 されて い る。 この配 列 にア クセ スす ることによ り、 クラ スReal TimeSirlulat i onは 自らの シ ミュレー シ ョン内 の建 築 物利 用者 に 自由 にア クセ スす る ことが 可 能である。
時間 :CurrentTime シミュレー シ ョン内 の 時刻 は変数 currentttimeに 保持 されて い る。 メソ ッ ドmoveAI Hま これ を1秒進 め、 RealTimeSi■ lulationが 保 持 して いる各建築物 利用者 RTSObieCtに 活動 を促 す。 こ れ によ リシ ミ ュレー シ ョンが 進行 す る。 また、 SiIIM lationSchedule rに 建築物 利 用者 を発生 させ る。
Ea / TircSimtla t ion
netMor :'
pr i ua te'
“コ一喜一 “
] 襲 筐 コ
一 一 一 一
一 一 一 一
一 一 一一 一
“コ“一 “
“一 J““
一 一” 一 一
, 一一 一 一一 一
moveA:: currentTime := currentTime+1.
simulationObject addAll:(scheduler createAt:currentTime on:self) sinluiationObleCt dO:[:anObiectlanObiect mOVe] seif createObiectS.
self changed: lmoved List:2 RealTimeSillulationの /ソ ッ ドrloveAl l 時間 を △ t進 行 させた後、配 列 silllulationObject内 の す べ ての建築物 利 用者 に活動 を即 す メ ッセー ジIIIoveを
プ ロセ ス :prOcess シミュ レー シ ョンの実際の実 行 プ ロセ スは変数 prOcessに 保持 されている。 シミュ レー シ ョン実行者が 実行 中 の シ ミュ レー シ ョンに参加可能 にす るために、 ユ ー ザ ー イ ンタ フ ェイ スで あるplanv:ewや perspectiveViewと 、実際の シミュ レー シ ョンの進 行 は別のプ ロセ スと して並列 に処理 されて い る。 しか し現 在 のObiectWOrksハ miltalkで
は完全な マルチタス クは実現 されてお らず、ある瞬間 に実行 されて い るプ ロセスは 1つ である。そのため、 ユーザ ー イ ンタフ ェイスが シミュレー シ ョンの実行プ ロセスにア ク セス し、プ ロセ スの 実行 権 を切 り替 えつ つ シ ミュ レー シ ョ ンを実行 す る ため に変 数 processに シミュレー シ ョンの 実行 プ ロセスを保持 し、 RealTimeSillulationに メソ ッ ド processを 用意 し、 ユ ーザーイ ンタフェイスllJか らのアクセス手段と している。
││││IⅢ
_│‐
処理終
¬智
づ嘉 セ紳 断命令
― ″"… Ⅲ Ⅲし 渕 薔
stlspended
ヽ ■
シ レ ー シ ミ ュ ン ョ プ 実 行 ノ 司□■D ‐ Ⅲノ,ⅢⅢ ‐ ロ■■D J │― e確 │ ス中断命令
ユ ー ザTイ ン タフェ イス2 Stls― d■ ノ S甲 中中■│ノ
:―
Ⅲ ヤ■■ツ
日向表示実行
fig:3 RealttimeSiIIu lationの プ ロセ スの切 り替 え
通 信 メカ ニ ズム また、RealTimeSimulationで は シ ミュレー シ ョン内 のオブ ジ ェク ト間 の情報 交換 を司 る。 こ の シミュレー シ ョンにお ける伝達 され る情報 はす べ て視覚情報 であ る。 シミュレー シ ョン内 の建 築物利 用者 は、行動 を促 す メ ッセー ジmoveを 受 ける とまず 自分 自信 に何が 見えて い るか を知 るため に、 Real Ti meSilru l ationに Sence:selfと い うメ ッセー ジを送 り、 視覚情報 を求め る。
Rea
/ TircSimt /a t ion tp
tltooffor.-' task
=■
=●
=ti■
i■
‐■ 1,■ ● i「 =│■
「 ■===F:=:=:=====::==T====::='=IIFT=::::=
=F,「「
一︼コ一“一︼
=・
同 一 ] ¨ .
● ■ ■ ‐‐=i●「 ●・・ ‐ ● ,■ │‐ ■ ‐■■ ● ■● ● ‐‐■ ■■,■ ● =‐ ■ =― =■ ■ ==ii■ =■
一 一 一¨ 一一
一一 一 一一 一一
一一 “ 一一 一一
一 ““コ一 “
│■
“コ‘“
一 一 . 一 一
一 一 一一 一一
sence: arffTsobject
'sence ar8TS0bject' s vier"
vier I I aPoint toD0bjects aPoint := arflTsObject position. view : = anRTS0bject vision totp0bjects := Set ner. tsrp0bjects addAl | : ((ar8TSObject currentRocrn) inhabi tat). tenp0bj ects addA | | : ( (anRTS0bj ect cur rentRoon) cons i stances terp0bj ects renpve ; anRTSObj ect. termObjects := temp0bjects select: [:an0bject
).
(ar0bject insideVier:vies position: aPoint ) (ol distance;aPoint) ].
| ^ temObjects asSortedCollection:[:o1 :o2l(ol distarrce:aPoint)
)
].
List:3 RealTineSimuiationの メ ソ ッ ドsence:
なお、RealTimeSinu lationが 建築物利用者に渡す視覚情報 は、請求 した建築物利用者か らの 距離 の も っとも遠 い物か ら順 に格納 されている。
ビジ ュアルイ ンター フ ェイ スとのイ ンター フ ェイ ス 本 システムの主 な ウ ィ ン ドウである、平面 図を表 示 す るplanViewで 、 シ ミュ レー シ ョン内 の 建築物利 用者 をク リックす る とその建 築物利 用者 の 視 野 及 び意志決定 状況 をモ ニ タ ー す る ウ ィ ン ドウが 開 く。平面 図 を ク リックす る と、 planViewの コ ン トロー ラであるplanV:ewContro‖ er はRealTimeSirulationに ク リックされ た座 標 を送 るため にmonitor:aPointと い うメ ッセ ー ジを 送 る。 Reattti meSi願 iationは このメ ッセー ジを 受 け、 まず表示座標 を シミ ュ レー シ ョン内 の 実 座標 に変換 し、その実座 標 の近 傍 にい る建築物利 用者 を選択 し、 現在 モ ニ タ ー して い る建 築物 利用者が あ つた場合 、 その建 築物利用者 の ウ ィ ン ドウを閉 じ、新 たにク リックされ た建 築物利 用者 のモ ニ ターを開始す るメ ッセー ジmonitoringを 送 る。
Ee/ fiuaiimtlat ion tretffior
:'httton
access'
monitor:aPoint I
terp
I
at i orObject detect : [ :arfr ject I - (3000300)) extent:(aPoint + (3000300))) conta i nsPo i nt : (ar0bject posi t ion) 1 i filore : [^n i | ].
tenp ; =
s inu,r
I
((aPoint
(tenp -= monitor) ifTrue: [nroni
tor
changed:Sclose.
monitor := tenp.
tem monitoring.
l
list i4建 築物利 用者 にモ ニ タ ー を開始 させ るメソ ッ ドmonitor:aPoint
一題““一“
︼ 摯一 H
一 ¨ 一︺ 一
一一 一 ¨ 一
一 ︼ 一 一︼
Jコ一ヨ一 “
ョヨJJ
一一 一 一 一
一 一 一 一
2.RTSScheduler 情報保持 RTSSchedulerは RTSObjectの 出現時間の配列、出現位置、出現時の方向、視野角、身長、保
持する lnstanceの クラスの配列、保持するObstacleの クラスの配列を要素とする配列schedule をもつ。
12‐
.‐
1tl
轟
五 rrav・ 編 :。 1 lari赫 義轟議歯l● ‐ 1
五 1″
-1=│
■一 ■■ 4 一 壌一 番 ,
‐ 轟
儒
.J 需 臨 轟 懸 ‐ ttaclttiasζ 11 2■ 13StaleCl‐ ass l 上 fig:4 RTSSchedulerの 情報 の構成
RTSObjectO裂 鷺痴已 RTSSchedulerは 各 時間毎 の RTSObieCtの 出現 数 を要 素 と した配 列 scheduleArray、 出現 位 置 視野角度 aview、 身長 aHeight、 保持 す る lnstanceの クラ ス の配 列 instinctClassesArray、 保持 す るObstacleの クラ スの配列 obstacieClassesArrayを 引数 とす る次 の メ ッセー ジを 受 け、設定 され た種類 のRTSObieCtの 出現 スケ ジ ュー ルを スケ ジ ュー
aPoint、
`す
リング
出現 時 の 方 向aDirection、
る。
sctScheduleischeduleArray createPoint:aPoint direction:aDirection viewAngle:aView height:aHeight instincts:instinctClassesArray obstacles:ObstacleClassesArray
RttSObiectOと
L理 巳
RTSSchedulerは メ ッセー ジcreateObiectSAt:timeを 受 け、 timeの 時 間 に 出現 す る よ う スケ ジュー リング されて いるRTSObieCtを 産 み出 し、 このRTSObjectを 要素 とす るaSetを 返す。
8
︲
Jコ一J・ ロ
〓
≡
一 一 一一 一一
一 一 一 一一
日“ヨ“
情報 の構成 RTSObieCtは 建築物利用者のクラスである。RTSObieCtは 視覚情報 を獲得す るメソ ッ ドを備え
る。各建築物利用者個別 に身長、視覚、位置、移動方向等、人間 と しての基本的な情報を保持 している。RTSObjectが シミュレー シ ョンか ら得 る情報 は、 この基 本的な データを基 に してい る。
.211-tract11 1
131卜
盛麟轟縫褻油腱1 …
1鳳 │11■
fig:5 RTSObjectの 情報 の構成
通信・ 行動 メカニ ズム では、RTSObieCtの 単位時間の行動 を順を追 って説 明する。 RTSObjectは メ ッセー ジmoveを 受 け取 る と、 まず 自分 に何 が 見 えて い るか を知 るため に い うメッセー ジを送 る。
Real丁 imeSlmu!ationに sence:selfと
5リ レノbσ ′″ P′%%uζ ノZソ ∵ "フ
ン′ノ3を
'
`θ
sencing "sence surroundings"
currentSence := simulation sence:self list:5 RTSObiectの 視覚情報を獲得するメ ソ ッ ドsencing
これ によ り、現 在 の視 野 の 中 に入 っているオブ ジ ェク トが す べ て配列 currentSenceに 収納 さ れ る。 この配 列 は 自分 自身 との距 離が 最 も遠 い ものか ら順 に収納 されている。
“ヨ““
一 一一 一 .
一一一一 ・
3.RTSObieCt
ョ“. “一 ︼
一 ] 一¨
壁
奎
一 一 一 一
JコJ一 “
また、 これ に対応 して 自分 自身が他 のRTSObieCtの 視野の中に存 在するか否かを答え るため に、RTSObjectは メソ ッ ドinsideView:aView position:aPositionと もヽ うメソ ッ ドを用意 してい る。 これは 自分 自身 の座 標が aPositionを 基点 と したaviewと い う角度の中に入 っているか 否か を論理値で答える機能である。 i
ns i deVi er:anAng I
theta
,6"1" '=(position ^anAng
I
e
posi t ion:aPosi t ion
-
aPosition) theta radiansToDegroes.
I
le
:
' test i ng' ins ide: theta lRTS(bj ect metMsFor i ns i deY i erPos i t i on :aPo i nt di rect i on aVector v i ew0os : aVi erCos
:
!ist:6視 野角 の中に入 っている否かをテス トす るメソ ッ ドinsideView:aM∞ !e position:aPosition
意志決定 モジュール RTSObieCtの 意志 決 定 モ ジ ュー ル は 、 各 RTSObject毎 に配 列 instinctsに 収納 され て い る。 RTSObjectの 単位時間 の 行動 の 第 2の ステ ップ と して、 RTSObieCtは 自分 の 備え る意志決定 モ ジ ュ ール の す べ て に意 志 決 定 を促 す メ ッセ ー ジdecideを 送 る。各 意 志 決 定 モ ジ ュ ー ル は、 RTSObjectの 現 在 の視覚情報 や、過 去 の 意志決定、過去 の行動過程 な どを基 に次 の移 動 方 向、 速度、およびその意志決定の欲求度 をRTSObjectに 伝える。 RTSObieCtは これ らの意志決定の中か ら、その欲 求度 の 最 も高 い ものを次 の単位時間 におけ る行動 と して選択する。
障害物 回避 しか し、先 に述 べ た意志 決定によ って選ばれた行動が 、必ず しも他 のRTSObieCtや 建築物 の 状況 と整合 しない場合 もある。他のRTSObieCtや 建築物 に行 く手を阻れる状況 なども起 こ りう る。 そこで、各 々のRTSObjectは 配列obstacleDirectionの 中に保持 している自分の周囲 の 障害物 の位置や、配列obstac:esの 中に複数保持 して いる障害物 回避 モ ジュールを使用 して障 害物 の 回避 を行 う。。 単位時間の行動 の第 3の ステ ップ と して、 先程 の意志 決定過程 と同様 にすべ ての障害物 回避 モジ ュールに対 してメ ッセージdecideが 送 られ る。各 障害物回避 モジュールは このメ ッセージ を 受 け る と RTSObjectに 現 在 の 視 覚 情 報 を 要 求 し、 こ れ を 基 に 障 害 物 の 存 在 を obstacleDirectionの 中に書 き込む。 この周囲の 障害物 のデータを基に、先程選 択 された行動 を補正 し、次の単位時間にお ける行 動が決定 され る。ただ し、 ここで補正 された行動が選択 された行動 とあま りにかけ離れて い る 場合、行動を中止する。
frlfrbjcct t*tlwor:
'task latvragV'
move
一“四一襲¨ 円
一︼ ︼ ﹃ 申
響 攣 蝉 ﹄
一一 ︼ 一一 一一
一 簗 一綽 一
馨コ一一 “ 一
ココヨ“
一一 一一一 一 .
≡
"decide next turn's npve pol icy and
move"
I dec opening td terpl pd isNil ifTrue:lpd := direction deepCopy]. pp isNi I ifTrue:lpp := position deepCopy]. self
obstacleClear,
sel
sencing.
f
dec := Set ner.
instincts do:[:anlnsl lansl ans := (anlns decide).
decisions at :anlns put: (ans at : 3). dec
dec isNi I i fFalse: I dec := dec asSortedCol
acid:
ansl.
lection:[:dl :d2l (dl at:3) ) (d2 at:3)].
di rection := (dec at:1) at:1. speed := (dec at:1) at:2.
td := (dec at:1) at:3. l
i
fTrue: Idi rect ion speed := 0.
; =0.
td := ll.
obstacles do: [:anObstacle I anObstacle decide. ]. tanp := self avoide0bstacle:di rection tendency:td. ((tarp - direction) abs (=120) ifTrue: [direction := tenrr] opening :=
self
ifFalse:Ispeed:= 0], roorfheck.
i ng i sN i I i f Fa I se : [se I f changeRoomThrough : open i ng]. position '= position * (direction degreesToRadians cos * degreesToRadians sin * speed)).
open
self sel
f
speed
0 (direction
changed:fnpve. changed:fdeci sions. I
ist:7
RTSOb
jecj.D
l'./ :, Fmove
表示機能 RTSObieCt以 下、 この シ ミュレー シ ョンの中で視覚情報 とな りうるオブ ジ ェク トの クラスは べ す て、ある建築物利用者か らの視野 に入 つているか否か を答える機 能 と、 自らを 3次 元 /2 次元表示する機能を実装 している。
平面表示 RTSObieCtの イ ンスタンスは、 ビジュアル イ ンターフェイ スplanViewに 自分 自身 を表 示す
る機 能 を も つ 。 こ の 機 能 を 支 援 す る た め 、 ク ラ ス RTSObjectに は ク ラ ス メ ソ ッ ド imageldegreeが あ る。現 在 の 角 度 を 引 数 と して この メ ソ ッ ドを呼 び 出 す と、 ク ラ ス RTSObjectは 配列CashedShapesの 中に保持 されているRTSObieCtの 平面形 の 中から、引数 の角 さわ しい平面形を供給する。 度 に応、 リ ド
配 列 CashedShapesに は 現 在 の planViewの 縮 尺 に お け る平 面 形 の み が 保 持 され て お planViewを 通 じ て 縮 尺 が 変 化 し た 場 合 、 ク ラ ス RTSObieCtの ク ラ ス メ ソ ッ createimageslscaleが 実行 され、配列 CashedShapesの 内容が 更新 される。
クラスメソ ッ ドimage:degreeに よって供給 される平面形 は、平面形の最大 外寸、平面形の ビッ トマ ップを保持するpixmap、 消去する平面形 のpixmap、 及びmaskか ら成 る配列である。
ョ一一“・“
一 一﹃ [
≡
一一 一 一一 一
一 一 ︼ 一 一
J一J一 “
” ︶題鏑一“
﹃ ︼ 一攣 一﹃
罐 摯 一攣 一﹃
3次 元表示 RTSObieCtの イ ンスタンスは自分 自身の姿 を ビジュアルイ ンタ ー フェイスperspectiveView に表示するための機能を装備 している。この機能を補助するため、平面表示と同様にクラス RTSObjectに クラスメソッ ドshapeを 用意 している。 これはクラス変数PerspectiveShapesに 収納されている姿をRTSObi∝ tの イ ンスタンスに供給する機能である。
さらに、下記のベ ク トル演算 を基 に 3次 元表示 ウ ィ ン ドウヘ の座標変換を行 う。 (声 一 (言
u*F))・ † u>=oに おいて s戸 =xOF
u'十
fi・ ア uょ リ
、 X)│
但 し、Fを 焦点距離、Hを 視 点 の 高 さ、
高 を視線方向の単位ベクトル、 ■u'をFuと 直交する単位ベクトル、 P 4視 点からRTSObjectへ のベクトル 曜葬 砕'=o、 ¬PI尋P'│を 満たすベクト ルとし、 「
forIIula11 3次 元表示の ベ ク トル演算
蜃 轟
難
輌
豪
華
一
姜
螂
鶴
籾
嗜
頷
咄
幽
幽
機
難
襲
鷲 暑
爾“綺奎
攣 一攣 一響 ︼
蝉 一 ﹃ 一罐
角AnOleの 定義 これらのメソ ッドの中で視野の演算を多数行うため、角を表現するクラス範 leを 用意する。 クラスAngieの instanceは 角を構成する 2辺 の角度目 t a2、 及びその角の内部に存在す る角a3を 基に してクラスをdeに メ ッセージanglel:al attle2:a2through:a3を 送 ることによ り生 じる。 Angieの i nstarlceは 次のようなメソッ ドをもつ
and:訂 嗅曜,:e 自分自身 と田山口leと を合成 した角を答える。
insideh:e:山
:e
anAngleが 自分 自身 の 内側 にあ るか否か を論理値 で答え る。 inside:aDegree 角度 』 eOreeが 自分 自身 の 内側 にあるか 否か を論理 値 で答え る。
reverse
自分 自身 の外側 の角 を答える。
陵
騨
:響
螢
螢
彎
彎
圏
鍮
岬
圏
門
興
躙
攣
幽
躙
躙
幽
鵬
歯
幽
鵬
彎
躙
圏
彎
薗
澄
歯
饉
攀
商
爵畿 轟 畿轟 轟 鷺 轟 轟 轟 轟 趙 茫 鍼 骰 艤 畿 麟 鸞 轟 轟 憑 轟 嚢 懸 胃 轟 ―
―
JJJJ
一 一 〓
3.RTSRoom 情報保持 RTSRoomは 部屋 を表現 す るクラ スで あ る。 部屋 │ま その部屋 を 囲む壁 (RTSRoon)お よび開 口 (RTSOpening)、 部屋 の 中に いる建築物利用者か ら成 り立 っている。∞nsistancesに 壁及び開口 が保持 され、配列 inhabitatに 、部屋の中に いる建築物利用者が 保持 されて い る。 また、変数 planに 自らの 属する シミュレー シ ョンが保持 されている。
鰤
fig:6 RTSRoomの 情報 の構成
RTSRoomの 生成 RTSRoomの イ ン ス タ ン ス は 、 そ の 部 屋 を 構 成 す る 壁 RTSWa‖ の イ ン ス タ ン ス 及 び 開 口 RTSOpeningの イ ンス タ ンス か ら成 る配列 consistanceを 用意 し、 クラ スRTSRoollnに メ ッセ ー ジ newRoomWith:consistanceを 送 る ことによ って生 成 され る。 なお壁及 び 開 日の配列 は、 その順序 に規定 はないが 、 その要 素 に 関 して、外周の壁及 び配 列 は半 時計 回 り、 内部 の 柱 を構 成 す る壁 に 関 して は 時計 回 りの方 向性 を持 つ こ とが 要求 され る。 また、要 素 内 の壁 及 び開 口に重複 は許 され な い。 また、外周、 内部 の壁 及 び 開 日の座標 は共 に 閉 じている ことが必 要 である。
機能 ノに週塾ヨ 言 enter:anobiect/exitianObiect これ らの メ ッセー ジによ り、建築物利 用者 の入室、退室を行 う。
所属検査 inianObiect ある建築 物利用者が その部屋 の 内部 に存 在 す るか否か を調 べ る。建築物 利 用者 の座 標 か ら x軸 正方 向 に半 直線 を 伸 ば し、 その半 直線 と部屋 を構成 す る壁 /開 口が 交差 す る回数 の 偶奇 によ って、 部屋 の 内外 を判定 して い る。 そのため、 ∞nsistancesに 保持 され ている壁及 び開 日は重複 な く閉 じている必 要 が ある。
一 一 一 一
・ 一一 一 ︼ 一 ,
““一コ
24=
罐 攣 溺 興 轟
in:ar{hject
lpl
p2
ccl
cc := 0, pl := anObject position. p2 := an0bject sim.llationArea right 0 pl
v.
consistance do:
[:alal
|
|
(ClossCtrec* test : (Array r i th: (ata | | vector at
^cc odd
:1
)
rith:(afal I vector at:2) rith:pl ith:p2)) ifTrue:lcc := cc+l]1.
list:3 部屋へ の所属を検査するメソ ッドin:anObi
岬
綺 場
―
囀 攣 攣 囀
誨
1-
…
麟
25覇
整一菫螢一理
﹃ 蝉 囀 ﹄ 糧
Rlfu tretlro#or: 't* laAWc'
“一 ““一 J
“ 一一 一 一一
“ 一 一¨ 一
4.RTSWall RTSWa‖ は壁 を表現す るクラスであ る。 RTSPlanは
2点 の位置座標 を保持 する。 この クラスも2.
のRTSObieCtと 同様 に insideV:ewPosition:aPoint directioni aVector viewCos:aViewCosと もヽう メソ ッ ドを備 え、 自分 自身が視覚情報 を求めているRTSObieCtの 視野の中に入 っているか否かを答 えることが可能である。
情報保持 RTSWa‖ は 自分 自身 の基 点、終点 の座標 を変数 positoionl position2に 保持 する。 また、自
分自身 の属する部屋を変数 roOlnに 保持 している
fig:7 RTSWallの 情報 の 構成
視野 RTSWa‖ は あ るRTSObieCtの 視 野 に入 って い るか否 か を答 え る メ ソ ッ ドinsideView:anAngle position:aPositionを 装 備 して い る。 あ るRTSObieCtの 視 野 anAngle視 点 aPOsitionを 引 数 と し て この メ ッセー ジをRTSWa!│の イ ンス タ ンスに送 ると、 その視野 に入 って い るか否か を論理 値 で答 え る。 また、 RTSObieCtが 障害物 を検 知 す るの を支 援 す るため 、点 を引数 と したangleFrom:aPoint とい うメ ソ ッ ドを用意 して い る。 RTSWal Hま この メ ッセ ー ジを 受 け る と、点 を頂点 と し、 自分 自身 の 2点 を 2辺 に持 つ 角 Angleの イ ンス タ ンスを返 す。 RTSObieCtに 装備 され る障害物 関知 モ ジュールBasicObsatacleは 、 この メ ソ ッ ドを利 用 して あ るRTSObjectの 全周 の うちで障 害物 の 存在 す る方 向をマ ッ ピングする。
表示機 能 RTSWa Hも RTSObieCt等 と同様 に、本 シミュレー シ ョン内では視 覚情報 にな り得 るオブ ジ ェク トで あるか ら、 2次元平面及び 3次 元形 を表 示す る機能 を持 つ 。 さ らに、前述 のRTSObieCtの ベ ク トル 演算 を拡 張 し、 イ テう。
こ
==こ
こ LL==こ ここ
とこ
=二
=佳=墨 =`=饉 =二 ==L4■
‐‐
一
―
…
…
…・
‐
・ …・ ・
=れ
農 出 … ・ ・
出 …
=…
.3・ ふ
…
"`‐ =_■
,一
=「
「
=F「
占 L●
`“ `“ `=饉
“
=============1■
“ ``■
■■ LL● 二
工
=饉 `“ `
ri==
:「
=「
6
―
2
“ 一
酬
‐― 一
¨ 中 一¨ 一︺
一 一一 一一 一
一 一一 一一 一︼
粗コ一コ一コ
│││1中 1争 警││││││││││││●
│││=│││││││││││││││1申
=====11■
3次 元表 示 ウ ィ ン ドウヘ の座 標変 換 を
(Pl- (F-uxF) ) .?u>:0{r.tir,r( s戸 =xOF
(戸
1-(F u*F))・ Tu<oに x ttu'
u'+fl・ アuよ り
おいて
=(,1-― (言 u*F))十 〔 , 302fい 1)よ り (戸
1-(F u*F))・ ('2-戸
1)
F
H― h 但 し、Fを 焦点距離、 hを 視 点 の 高 さ、 H を階高 と し
・ ′ てr
Fu'を
高 を視線方向の単位ベクトル、
視点から壁の点へのベク ト ヽ
P l,
ル
Fuと
し クトノ 直交する単位ベ,、
、
"を forrrlu l a:2 3次 元変換 の ベ ク トル演算
上 記 の 式 を 基 に し て 、 3次 元 表 示 を 行 う メ V y F' displayOn:gc 。v direction: s heightFrorn: height viewAngle: valJ.k0) & うに記述 されて い る。
perspectiveShapeFroroint:
ル
//〃じZ力 りりも′♭′ .・
夕 タ θグ5σ /4/ん 2タ
displayOn:gc perspectiveShapeFromPoint: ov direction: s heightFroln: height viewAng:e: va l rl r2 r3 r4 fl f fu pl p2 array array2 centre kl k2 xl hll h12 x2 h21 h22 1 ol := positionl ―ov p2 := positiOn2 - ov fi := seif fioorHeight
centre := 200 0 150 fl isNil ifTrue:[fl := 3500] f := 200 / ((va degreesToRadians)tan)
fu :=(((s degreesToRadians )cos )0 ((s degreesToRadians)sin) ) kl := ol― (fu*f)
k2 := p2-(futf)
(kl
dotProduct:fu) 〉=0 ifTrue:[xl := (((fu nOrma12)dbtProductipl )/ ((fu dotProduct: pl) ))*f hll:=((height *( f Oxl) r)/( pl r))negated. h12:=(fl ―height )ホ f / (pl r)] ifFalse:[xl :=(kl dotPrOduct:((p2-pl)norma12))/ (fu dotProduct:((p2-pl) unitVector)) hll := height negated
(k2
dotProduct:fu) 〉=0 ifTrue:[x2 := (((fu norma12)dbtProduct:p2 )/ ((fu dotProdlct: p2) ))*f h21:=((height *( f Ox2) r)/( p2 r))
h12 := fl― heicht ]
目
畠 L= =“ ‐ =二 ====二 ,,一 ――‐ ―― ‐ ======E・:==:‐ ―=― 「三 ・ ― ・ ‐一‐ ‐ ■ ● ‐‐‐―‐ ― ● ● ■ ‐‐― ■■ ■ ・―■ ■ ■■■■ ■■■■■■■■■ 平≡署 ・ ・・ =‐ =■ ‐ ‐● ■ ■■ ■ ■ ■■■■ ■ ■ ● ■ ‐ ttti‐ ― ‐:F==FT「 ●=■ __ ― ==‐ ‐ ==‐ ・ ・ ==五 ========二 ― '「 「 ===F====F=,==F:=====i===7====:==:===:==:=====:=::=:=:==ti=デ : ・・・・ 二‐
―
― ‐ `二 “ ・ コ │=二 “
:習 27=
h2:=(tl - heisht )* f / b2 r))
ifFalse:[x2 :=(k2 btProdrct:((pl-p2) r,annl2)) h21 := height negpted
rl
:=xl 0 r2 := xl9
/ (fu
dotprod.rct:((pl-p2) wtitvector)).
h22 := fl-heisht. l. hl1. h12.
13 := x20 h22. 14 :=x20h21. array :=Array ner:4.
array at:1 put : ( r'l xSymetory){centre. array at:2 put:( 12 xSycmetory)lcentre. ar ray at:3 put : ( r3 xsymrctory)+centre. array at:4 put:( 14 xSynmetory)lcentre.
arrayl :=Array ner:5. ar ray2 at
:1 put : ( rl xs),mtory)+centre.
arralz at:z put:( r2 xsymetory)+centre.
:3 put : ( r3 xsymetory)+centre. arrayL at:4 put:( 14 xswmetory)+centre. ar ray? at :5 put : ( rl xs)4metory)+centre. gc I inelidth:1. gc displayPolygon: array at: 0 0 0. sc paint :ColorValue *hite. gc displayPof ylirp: array2 at: 0 0 0. ar r avL at
list:9 RSa‖ の 3次 元表示メソッ ド
│:`菫
`:``3●
│…
―
う ま │
281鑓
│
壺一 ココJ
・ 一一 一︼ 一 一
一 一 一 一
5. lnstinct クラス lnstinctは 建築物利 用者の次 の行動 の意志決定を行 うモ ジュール である。行動研究によ る単純化 され た行動 モデルを この lnstinctの サブクラスと して言 己述 し、 シミュレー シ ョン内の建 築物利用者 に組み込むのである。 状態保持 意志決定 モ ジュールはRTSObjectに 於 いて、配列 instinctsに 保持 される。 また、 lnstinctは 自分 自身 を保 持 してい るRTSObjectを 変 数 Ownerに 保持 し、 OWnerに currentSenceと い うメ ッ セー ジを送 ることによ り、現在 のownerの 視覚情報を入手する。
fig:8 :nstinctO晰 奇幸長の有野反蛇
意志決定 建築物 利用者 か ら意志決定 を要求 す るメ ッセー ジdecideを 受 け取 ると、 意志決定 モ ジ ュール は次 に起 こす行動 の方向、速 度、 お よび その行動 を希望 す る度合 いを要素 とす る配列 を返す。
み ′´/2s′ ′aFiレノ/″じ″ %り り ふ′♭′
五a夕
_・
′
…
decide ''avoid walls"
l sence walis
min op dv dir∝ tionl
Op := Owner position. dv := 000. min := 1500. sence :・・ owner CurrentSence.
sence size = O ifTrue:[^Array with:O with:O with:0] wa‖ s:=sence seiect:[:aSencel aSence isRTSWa‖ ] wa‖ s:=wa‖ s select:[:aSencel(aSence distance:op)く =min]. walls size = 0 1fTrue:[^Array with:0 ■ith:O with:0].
walls := walis asSortedCollection:[:wi :w21(■ l distance:op) く(■2 distance:op) ]
walis do:[:wallldv:=dvキ (wa‖ di rection:op)]. direction := ((((dv unitVector)theta ) radiansToDegrees )) ^Array with:direction with:1000 with:5 1ist:iO :nstinctの メ ソ ッ ドdecideの 一例 このメ ソ ッ ドにおいて 、 この instinctを 保持 して いるRTSObieCtに 対 してメ ッセー ジcurrentSenceを 送 り、 この時点 においてRTSOblectの 視野 の 中 に入 って い るオブ ジ ェク トを調 べ て いる。
9 〓2
一 一 一一 一
一 一 一一 一
“ 一一 一 一
“コ一 一一 “
a一NコJ
一“ “ 一一 一
一 ¨ 一一 一 一
今回 の シミュレー シ ョンでは、「 障害物を回避する」「 開口部 に向か つて歩行する」 とい った instinctを 使用 している。 このよ うな instinctが 各建築物 利用者 に複数組み込 まれて建築物利用
者 の意 志決定を司る。 また、各建築物利用者 に組み込 まれている instinctは 各 々独立 してお り、各個の状態 は個別 に 保持 されて い る。そのため各建 築物利 用者の過去 の意 志決定の履歴や過去の行動軌跡等 を保持 し、 それを意志決定 に利用することも可能 である。 これは「 過去の記憶 に基づいた意志決定」等を行 う意志決定 モジュール を表現するのに適 している。 この i
nstirlctは 各建築物利用者毎 に複数設定することが 可能である。また instinctの 種類やそ
の出カ レベルは建築物利用者毎 に様 々 である。 この instinctの 種類 と組み合わせによ って建築物 利用者毎 の多様性が うまれる。 シミュレー シ ョン実行者の憑依 オブ ジ ェク ト また、 この instinctの 一つ と して、 シミュレー シ ョン実行者か らの入力 を反映す るモ ジュー ルを作 り、 シミュレーシ ョン実行者が シミュレー シ ョン内で操作 する建築物利用者を作成する ことが 可能である。 これ をRTSObieCtに 組み込 む ことによ り、 シ ミュレー シ ョン実行者が あた か も シミュレー シ ョン内に参加 しているかの ような環境 を作 り出す ことも可能である。 これに よ り、 シミュレー シ ョンを仮想現実 と して体験する ことが 出来 る。
6.Obstacle クラスObstacleは 、視覚情報 を基 にRTSObjectの 周囲 の 障害物座 標 を極座標 でマ ッ ピングす る。 Obstacleも Instinctと 同様 に変数 ownerに 、 自分 自身 を保持 して い るRTSObieCtを 保 持 し、メ ッ
セー ジdecideを 受 けると障害物 マ ッ ピングを行 う。 この 際、壁 の 自分 自身に対す る相対角度を求 めるために前述のRTSWa:l angleFroln:aPoint等 を使用する。 障害物 マ ッ ピングを行 つた結果、障害物が存在す る角度を変数 ownerを 通 じて 自分 自身 を保 持 するRTSObjectに 対 し、メ ッセー ジsetNewObstacleAt:angle value11を 実行 し、RTSObieCtの 配列 obstacleDirectionに 障害物 の位置 を言 己録する。
一”増一︼一 日
一 綱 簗 一 劃
¨ 蝉 一蝉 一¨
ゆ 一一 一¨ 一¨
蝉 一︺ 一摯 一四
S“一 題一 “ 一
蝉一“題塾
攣 一撃 ︼ 一﹃
奎 口自 百 ■ ■日 ■ 口 ■ 園 S■ 超 撻 饉 出 壼 受 燿HJ● ● ■壼 口 壼 出 饉 饉 錮饉 饉 1嬌 自 晏 饉 控ド 饉 墨 饉 饉 墨饉 綺 綺口饉 薔 壼 ││“ 壼 コ 菫 疇綸 菫 臓 コ LI“ 百 餞疇 毬 口 壺曰 瘤 壼口■ │コ 1饉 瘤 歯口壼 饉 饉饉 歯 │“ 麟1薔 │“ │“ 綺歯 饉 鵬 奎 ││“ 絲 LIII“ 饉 諄綸 "“ “ “ “ “““ “ “ “ ““ “ “ "“ "綺 “ “ ““ “ “ “ “ “ “ “ “ “ “ “ “ ““ “ “ “ ““ “ “ ““ “ “ “““ “ “ “ “ “ “ “ “ “ “ “ “ “ “ “ ““
彎 蝉 一 一彎
i』
7.PlanView 概要 PlanViewは RealTimeSiru lationを モデル とするviewで ある。 この宙ewは 本 シミュレーションの
主なユーザーイ ンタフェイスである。PlanViewで はシミュレーションの実行状況を任意の縮尺の 平面図で表示確認することが可能である。 また、 PianViewの 平 面 図上 に表 示 され るRTSObj∝ tを マ ウスで ク リックす ることによ り、 RTSObieCtの 視野を後述するPerspect市eiew上 に表示することが可能である。
fig:9 planVi"の 表示例
一麺綺一響一理
彎 ﹃ 一 日
一攀 一 攣 中
﹄ 彎 罐 攣
躍堕墨墨
暉 興 一攣 攣
aJ豊
一一 ] “ 凛 一
一¨ ¨ “ 一¨ 一
脚
冊 pianViewに 於 いて 、画面情報 は変数 pixに piJい と して保持 され、排他制御 を行 うためのセ
マフ ォのイ ンス タ ンスが変数 singalに 保持 されている。 また、 Real丁 imeSilru lationの シ ミュ レ ー シ ョ ン の 進 行 プ ロ セ ス と planviewの 画 面 表 示 プ ロ セ ス を 切 り替 え る た め に、 RealTimeSittlationの 進行プ ロセスを変数 processに 保持 して い る。
表示機 能
planViewは シ ミ ュ レ ー シ ョ ン の 建 築 物 の 最 大 領 域 と 表 示 縮 尺 を 引 数 と す る extent:aRectangle scale:aScaleと い うメ ッセージを受けて初期化 される。 planViewは メ ッセー ジextent:aRectangle scale:aScaleを 受 けると、 aRectangletaScaleの サイズのPi爛い を作成 し、 pixに 保持す る。 planViewに 対す る書 き込 みは このPixhpに 行われ、 pixの ウィン ドウに対す る相対座標 を変化す る事によって画面の スク ロー ル等 の作業が実行 さ れる。 この ビ ッ トマ ップはplanviewに メ ッセー ジdisplayObieCtを 送 ると取得す ることが 出来 る。 但 し、 シミュレー シ ョン実行 中に実 行状況 をplanViewに 表示 す る際にpixに 書 き込みを行 う 場合、書 き込 み終了後にウィ ン ドウの ウイ ン ドウ全体の再表示 を行わなければな らず、 シミュ レー シ ョンの 1単 位時間が終 了す るごとに ウイ ン ドウ全体の書 き換えが行 われ るため シミュ レー シ ョンの実行速度が大幅に低下する。 これを回避す るため、次のような手段を採 つている。 シミュレー シ ョンの実行 によるウィン ドウの書 き換えのaspectSttb lは 必ずplanViewの モデ ルRTSObieCtか ら行われ るため、 aspectSymbolの 受信 と実 際 の 表 示 メ ッセー ジを変換 す るメ ソ ッ ドupdate:anAspect with:aParareter from:anObjectを 、 シミュレー シ ョンの実行 によ るウィン ドウ内部 の書き換えはpixMapの 書 き換えを行わず、ウ ィ ン ドウのサイズが変更 された リスク ロールが 実行 される際の ウィン ドウの書 き換えの際のみpixMapの 書 き換 えを行 うよう拡 張 している。 update: anAspect rith: aParaneter frcrn: ar{bject 'lf the aspect of the rnodel that this vier cares about has chansed redisplay." (anAspect = aspect) & (ar0bject = rnodel)
ifTrue:
Iredrar ist{i
I
ifTrue: [[sel
f
inval idate.
redrar := llyes.
process resure. i
f
I forkl
di sp I ay(hjects{lu i ck g raph i csContext ).
fFa I se : [ [se
I
I
yOn : ( se I
f
process resunel forkl. process suspend. l i
fFa I se:
[sel
f
r-pdate : anAspect wi th:
redrar := nil.
list:11
aParaleter.
l
tpdate: anAsoect
rith:
aParanreter from:
2 一覇3
一 ︺ 攣 ¨ 一攣
一一 一 ¨ 一中
¨ 距 ﹂ 一呻
世幽中題
ココ“J
さて、planViewへ の 書 き込みは メ ソ ッ ドdisplayOniaGCを 使用 して書 き込 まれるが 、 このメ ソ ッ ドはdisplayWa‖ On:aGCと dispalyOthersOniaCCを 呼び出 している。 これ らのメソ ッ ドは実 際 には変数IIlode lに 保持 されているRealTiIIleSiIIulationの 変数 rOms、 sirlulationObieCtに 格納 さ れ て い る す べ て の RTSWa‖ や RTSObjectに メ ッ セ ー ジdisplayPlanOn:aGC scale:aScale offset:anOffsetを 送 信す ることに よ って画面表示 を実現 している。実際の 画面表示 はこのよ うに各 々の建築物利用者や建築物 によって行われるため、建築物 利用者毎 に様々な形状 の表示 を行 うことが 可能である。 ユ ーザ ーアクセス planViewの 画面上 の建築物利用者 を シミュレー シ ョン実行者が ク リックすると、 その建築物 利用者か ら見た視野 のviewで あるPerspectiveViewと 、その建築物利用者 の意志決定の過程 を 表示す る lnstinctStatusViewが 表 示 される。 これを実現するため 、PlanViewを 制御す る コン ト
ロ ー ラ と して ク ラ ス P:anViewContrOllerを 用 意 す る 。 こ の コ ン ト ロ ー ラ は ク ラ ス ControllerWithmenuの サ ブ ク ラ ス で あ る が 、 マ ウ ス の ク リ ッ ク に対 応 す る メ ソ ッ ド redButtonActivityが 拡 張 されて お り、 マウ スが座 標 aPOintで ク リックされ た事 を通知す る メ ッセージnlonitoriaPointを planViewの モデルであるRealTimeSi m」 lationに 送信す る。
口菫一 一 ︼
3 〓3
・ 一 一 一
一 一 一一 一
一
一 一 一一 一一
一 一
ロコJ“
,/
場綺螢聾
iveVier
蝉 ︼ 攣 一攣
攣 彎 羹 一囀
8. Perspect
Inst inctStatusVier
腰 シミュレーシ ョン実行中の、個 々のrlSObiectの 視覚情報及び意志決定の状況を表示するため のviemTerspectiveViewと lnstinctStatusViewで ある。
fig:10 perspectiveView・ irtstirlctStatusViewの 表示例
表示機能・ ウ ィ ン ドウの コ ン トロール perspectiveViewは 自分 自身 を表示 す るメ ソ ッ ドdisp:ayOn:盤 を備 えて い るが 、 planViewの diSplaYOnJ露 と同様 に、 Perspect市eViewの displayOn J∝ も実際 の 表 示 を行 わず 、 た だ視 野 内 の す べ て の RTSWall、 RTSObi∝ tに 画 面 表 示 を 促 す メ ッ セ ー ジ displayOnigc
perspectiveShapeFromPbint: position direction: direction heightFrom: high viewAngle:
VieWhieを 送 り、RTWall,RTSObieCt側 で実際の表示 を行 わせている。
鍾彗鴻一彎
変 ¨ 一簗 ”
一響 ﹃ 一 攣
彎 蝉 ﹃ 電
攀 ﹃ 響 轡
綺彎期撻
綱薔艶当
﹃ 一攣 摯 一彎
︸ 彎 ¨ 攣
planVie■■の建築物 利用者が ク リックされると、その建築物 利用者が現 在 シミュレー
シ ョン実行者 によってモ ニ ター されていない場合、現在 モニ ター されている建築物利用 者 の ウ ィ ン ドウが 閉 じられ 、 新 た に ク リック され た建 築 物 利 用者 を モ ニ タ ー す る planView、
:rlstinctStatusVhttf開 く。 ウィン ドウに対 して画面表示作業が実行 され て
い る 間 は そ の ウ ィ ン ドウの 開 鎖 作 業 の 実 行 を 延 期 さ せ る た め 、 表 示 メ ソ ッ ド displayOn週 ∝、 ウ ィン ドウの開鎖作業 を行 うメソ ッ ド●:oseで はセマフ ォーを利用 した 排他制御 を行 う。 display(}r:gc
sisnal mit. gc clcar,
self displayRodh:gc. sel sel
f f
displayilal ldh: gc. di splay0therdh:gc.
siglal
signal
close lconl
sisEl mit.
model rmveDependent :sel f.
con := container. con isf{i I i fTrue: [^ni l ]. [con container == nil] *lileFalse:[c.on := con container]. con eontrol ler close.
self
relsase.
signal signal !ist:12 perspectiveVi∝ の表示メソ ッ ドdisp!avOn:gc及 衝 i鎌 を閉鎖するメソ ッ ドciose
一獅響蒻義
¨ ︼ ︼ 摯
一一 ︼ 中 一
躙 彎 興 ﹃
円崎彎¨ 綺
1軋 シ ミュ レー シ ョンの 実行
赳
36鎧
彗“綺轟
﹃ 甍 塑 ︼
攣 蝉 攣 摯
調査 実際の シミュレー シ ョンを実行す るためには、まず 目的 とす る建築物 の 中で の建築物利用者 の 利用者 の意志決定 と、その要因になる建築物の エ レメ ン トを特定す る。 こ ― こでは、商品 の欄 に向か って歩 くとい う意志決定を建築物利 用者 の意志決定の例 と して説 明する。
行動 に注 目 し、
この意志 決定 における意志決定の要因 である ―
のエ レメ ン トは商品の樹である。
一響甕彗菫
一 菫 ︼ H
一 一 中 ︺
需 彎 攣 攣
響 踏 攣 岬
閣彎鯛艶
ヨコ〓
instinctForComnoditiesO痴
離 =義
次に、 この棚 に対応する、商品を求め る意志決定 モジ ュールを定義 す る。 意志決定 モ ジュール はすべ てクラス lnstinctの サ ブクラスと して定 義 する。 この意志 決定 モ ジュー ル は求 める商 品群 の リス トcomditiesListNeededを 保持する必要が ある。
inct stbclass:
Slnst inctForCmdi t ies :' cmod i t i ed i stlleeded' classVar iableflms: ' ' poolDict ionar ies: ' ' category :' RealTineSimulat i on' Inst i
nstanceVa r i ab I ellms
list:15!nstinctForC― ditiesの クラス
instinctForComnoditiesの メソ ッ ドdecide instinctは メ ッセー ジdecideを 受けて意志決定 をおこな う。 lnst:nctForComnoditiesで は、視
野 の 中に商品棚が あればその相 を調査 して、求 める商品の一つがあればその棚 に近づ くとい う意 志決定を行 う。 lns t irr tForCorndi t i es
De
tlffior :'
acess irut'
decide
I sence racks rack ar0rder speed direction tendency nearestRack sence := ouner currents€rrce. (sence
size
==
I
0) ifTrue:l^Array rith:0 rith:0 rith:01.
racks := sence select: [:each I each is0penins]. (racks size ==0) ifTrue:l^Arra,l rith:0 rith:0 with:01. nearestRack := ((racks asSorteclCol lection [:rl r2l rl distance:(orner position) <= (r2 distance: (orner posi tion))l) at:1 ). (nearestRack distance:(orner position) (500) and: (nearestRack inclr.rdes:cmnoditiesListileeded ) i
fTrue: lco0nod i t i esL i stileeded renrcve: (cormod i t i esl
i
stl{eotr
detoct : [ : c I nea restRack
includes:cl) -Array with:0 with:0 rith:11. rack := racks detect: [ :each I each includes:cqnnoditiesListlleeded]. rack isili I ifTrue:[-Array with:0 rith:0 rith:0]. i
fFa I se:
i ldvl
cv := rack position - otrfler position. direction := dv theta radiansToDegrees
.
speed := 10001.
tendency := 0.5.
ar0rder := Array rith: direction
rith:
f,ith:
speed tenCency.
^arorder
iist:16 instinctForα
mm剣 itiesの メソッ ド微Ю ide
Jコ一 コ一 “
一 一¨ ¨
一一 一一 一 一一
一一 一 一︼ 一一
一 ココ一 “一 “
シミ ュ レー シ ョンヘ の 組 み込 み 以 上 のRTSRackと lnstirtctForComoditiesを 、 それ ぞ れ RTSRoomと RTSObieCtに 組 み込 む こと によ り、商品棚 とそれ を求める来店者 の シミュ レー シ ョンが実行可能 である。
瑾
彎
:―
―
39壼
攣
‐
… …
‐
… …
製 … 畦
跛 今後 の展 望
響 攣 摯 攣
崎 鏑 輝 彎 一
総“螂彗
鱗出 40=
墨 藉 鶉 轟
一JJ一 J
︼ 一 一一 一一
一 一 一 一
RTSに
お いては 、「 他 人 と衝 突 しそ うにな った ら避 ける」「 障害物 は 回避 す る」等
とい った人 間 の基 本 的 な行動様 式 と、人間が備 え る知 覚能力 を R tt Sの システムの 側 で 用意 す る ことによ り、「 水族館 にお ける観客の行動様 式 」や「 遊 園地 にお ける観 客 の 行 動様 式 」 とい った行 動研究 の成 果 を R tt Sに 組 み込 む にあた っての 労力を軽減 す る こと が で きる。 RTSが その ままで対 象 の建 築物 に対応 で きな い場 合 で も、 クラ ス instinct とRTSWa‖ の拡張のみでかな りの状況 に対応 じうる。 しか し、現 時点 にお いては まだ システムの側 で 用意 す べ き人間の基本 的な行動 特性が 記述 し切 れて いる とは言 いが た い。 また、成果 を組 み込 むにあた つて、現 時点 で は新 た に複数 の instinctを 記 述す る必 要が あ る。将 来的 には意志決定 モ ジ ュールを システム 側 で よ り多 く用意 し、 これ らの組 み合 わせや強弱 に よ って 行動研 究 の 成果が 表現可 能 にな れ ば 、真 に「 行動 研 究 の 成果が 容 易 に シ ミ ュ レー シ ョ ンに反 映 す る ことが 可 能 に な っ た」 と言 え るであ ろ う。 実行速度が これ までのネ ッ トワ ー クを利用 した離散系 の シミュ レー シ ョンに比 べ てか な り遅 くな る点 も問題 である。離 散系 の シミュ レー シ ョンは 、 あ る ノー ドか ら次 の ノー ドまでの移動 の 間 の 建 築物利用 者 の 行動 は無視 し、 ノー ドにお ける条件半1断 のみで実 行 され て い るの に くらべ 、 RTSで は シ ミュレー シ ョン実 行 中はす べ て の状況 にお いて 建 築物 利 用者 は視覚 的 な情報取得 と条件 判 断を行 つて い るため、速 度 の 低下 は如何 とも し が た い 。 また、建築物 利用者 の 視 点 か らの情報 を シ ミュ レー シ ョン実行者が 取得 して い る状 態 にお いて、 3次 元 の 画面表 示 をす べ て ソフ トウ ェア的 に処理 しているため、 この 部分 の 負荷 も無視 で きない。 しか し、建築物利 用者 の視 覚 的情報取得 と 3次 元表 示 は、 どち ら もほとん どが
3次 元
ベ ク トル 演算 であ る。 昨今 の 3次 元 グ ラフ ィック ス 向 けの ワー クステ ー シ ョンな どで は、 この 3次 元 ベ ク トル演 算 をハ ー ドウ ェアで処理 す る ことが 可 能 で あ る。 R tt Sで も この ような ハ ー ドウェアを利 用す る ことによ り、更 な る高速化 と、特 に 3次 元 的な表現 の リ ア リテ ィーの 向上が望 み うる。
“ヨ一 “一ヨ
一 一“ ﹁
一 一 一 一
≡
“ヨ““
一 一 一 一
鰺 参考文献
.墜
‐ 攣
1歯
1-―
…
尚
42樹
ObieCtWOrks/SmBIltalk User's Guide
FUJ: XEROX :NFOR‖鷹T:ON SYSTES CO.LTD
ObieCtWOrks/Sm口 lltalk ttutrial
FUJ: XEROX :NFORIT10N SYSTES CO.LttD
Smalltalk-80,The Language and its implemetation Adele Goldberg David Robson lntroduction to ShBlltalk-80
Masakazu
Tateno
Ka2uShige Oikawa, Takatoshi Tasel Maki Kalranishi
歩行 の科学
阿久 津
邦男
避翼143雲
1警
慰付 録 :R tt S
リス ト
:鐵
441豊
Object sr.bclass:
#Angle
instanceYariabldlanps: classVariableilames: "
lterpl teru2l teml := anAngle f irst.
'tl t2'
tenp2 := anAngle
second'
-(self inside:tenpl) |(self inside:term2) | (self insideAngle:anArgle) | (arilngle
" category: 'RealTinesimulation' poolDictionaries:
insideAngle:self ) AnSle nFthodsFor:
'accessing'
inside:a
and:anAngle
lal
tepl
:= anAngle tcrm2 ;= anArrglc
rhether
al is
inside or not'
I
al := a asFloat. tl ) t2 ifTrue:llterml torp:=
Itorpl tenp2 thru neml nerp2l (anAnsle isllil) ifTrue:l-self].
first. sccln'd
reverse.
(self
insideAngle:anAngle) ifTrue:[^self]. (anAngle insideAngle:self) i
"tell
^(
inside:al) notl.
^(tl
(= al)
self
tcnP
I (al <= t2)
fTrue: [^anAnsle].
((self reverse) insideAngle:anAngle)
insideAngle:anAngle 'tell whether anAnsle
ifTrue:[^nil].
ltenPl
isl{il
thru:= terp2l.
insidc;(tl))
ifTrr.rc:Inonp2
tenP2l
:= anAngle f irst' tqrP2 := anAnsle second ^(self inside:torpl ) I (self inside:tenp2)
tefip2.
(anAnslo
-false
:=
tzl
inside or not"
tgml
(self inside:(torpl )) ifTrue:[nepl := thru := terpl. I ifFalse:lneilpl := temp1.
is
Angle nethodsFor:
'initial
ize & release'
ifFalse:lnerp2:= t1]. ^Angle anglel:neml
angle2:nep2
ccFirst:cl
ccSecond:c2
through: thru
first
t1 t2
:= c1. := c2
^t1 f rom:al
nearest0utsideAngle:aFloat ldefl def2l (self inside:aFloat) ifFalse:l^aFloat]. dofl :- (tl - aFloat) abs. defl )180 ifTrue:ldefl := 360-defl]. def2 := (t2 - aFloat) abs. def2 )180 ifTrr.re:ldefl := 360-def2]. defl (= def2 ifTrue:l^tl] ifFalse:[^t2]
t2
a2-
ttl ) 3601 $ileTrrc:[tl ltl ( 0] nhileTrue:ltl tt2 ) 3601 whileTrue:lt2 lt? < 0l whileTrue:lt2
:= t1-360]. := t1+360].
:= t2-360]. := t2+360]. [thru > 360] rhi leTrue:lthru := thru-360].
lthru < 0] rhileTrue:lthru:= thru+360]. t2 > tl ifFalse:tltenpl terp := t2.
i2 := ti' tl := term. l. (tl ( thru) t( thru ( t2)
ing' torp :=
cross:anAnglc -telt ft|ether anAngle crosses or not"
:=
thru := a3.
secord ^i2 Angle nrethodsFor: ' test
to:a2 though:a3 lthrul t1 := al'
ifFalse: I lteml
t2.
t2 :- tl. tl := telm. l.
_45čŚ&#x2021;
t1 := tl t2 := t2
:'
convert ing'
i
class rethodsFor
ClossCheck
ccFi rst : t2 ccSecond:
:'
pr ivate'
tl test:
anArray
nstanceVar i abl ellanps
"#(origin Point
vector, origin Point,
I olx olY vlx vlY
o?x
)'
vector
ArEle class i
:"
nstancevar i abl el{arPs
r€Yers€
-Angle
riiir,id
asFloat. asFloat. ClossCheck class
Angle methodsFor
iiirirC
一一 聾2一 ”
@@ C;-rir tt@aiu
:"
oN
v2x
vN d s t bl
I
bl := false.
olx := (anArray at: l) x. olv := (anArrav at: 1) Y. t= (anArray at: 2) x. "1" := (anArraY at: 2) vlv v' o2x := (anArray at: 3) x. o2y := (anArray at: 3) y. v2x := (anArray at: 4) x. v2y := (anArray at: 4) y. d := v1x * vZV - (vly * v2x). d=0
Angle class methodsFor: 'instarrce creation'
anglel :41 arglE2:a2 through:a3 I
terP
I
tofip := Set
ner.
tefip add:al. tenp add:a2. teilP add:a3.
((tarp size) =3) ifTrue:
[^self
new
frcrn:al to:a2 thoush:a3]
ifFalse:[-nil] ang I e:
tal =01 ifTrue: [self ner frcrn:0 to:al thoush:(all2)] ccF
:al
olx) - (vzx * (=
t)
&
:= 0_(( vly r olx _ (vlx * olv) + (vlx r o2v)) / d). t := v2y * o2x - QZy * o2y) + (vzx + o1v) / d.
:= true]].
bl ccSecond:a2
BarCha rtV
si sna
rom:al to'a2 though:a3
:
*l nst i nctStatusY i ec instanceVar iableilames:' process redratr i
er2 st$c I ass
I
Itenpl tenp := Set ner.
c lassVar
temp add:al.
categorY
terp
0(=s&(s<=1)&(0
(t (= 1) ifTrue: lbl
ccSecond:a2
^self ner ccFirst:al f
fFa I se:
[s
(vly * o2x) -
al
i rst
i
iablellanes:
poolDictionaries:
:'
"
"
Rea I Tirne,Sirul
at ion'
add:a2.
tenp add:e3.
((tenp size) =3) ifTrue: [^self new from:al to:a2 thotrgh:a3]
lnst inctstatusView methodsFor
ifFalse:[^nil]
close
:'
pr ivate'
lconl
Object sr"bclass: #ClossCheck
instarrceYar ablelhmes: " classVariablellarcs: " ooolDictionaries: " i
category:'
Rea
I
TimeSirulat i on'
signal mit. nrode
I
rernoveDePendent : sel f
.
con:= contalner. con isl{i I ifTrtre: [-ni l]. lcon containor == nill rhi leFalse: lcon := con container]. con controller close.
$i8rryi
一 攣 一攣 一攣
興 簗 興 一攣 一
”錮“¨ 増
w W @
@:4 ryig
16H
墨・ 聾2一︼
一︼ 摯 一塑 一︼
Diiicer
self
signal rait.
release.
self displayXLabels. self displayYlabels. self displayBars.
signal signal I
:'
nst i nctstatusV i er methodsFor
di sp I ay i ng'
sisnal sisnal displayBars
'display the
displayXlabels
graph bars. "
I barLonerleft labelSpace self barFrane bottod-eft I I
barLowerLeft :=
I dictionary bar barHeight barfidth
(0 0 30).
barLorerLett erase8arBottott I dictionarv := self mYDict.
labelspace := myDict size
histDict = nil
[:key I
keYlabel := keY PrintString
dictionary keys do: histDict at: kev put: (dictionarv at:
asText.
kevLabel anphasizeFrm:
l.
(dictionary size max: l) - 10. barLolerLeft := self barFranp bottqd-eft. dictionary keys do: [:keY
keyLabel
at:
at:
barLorerleft := barlorerLeft
update: anAspect with: aParameter from: ar0bject "lf the aspect of the model that this view cares about has chang€d, redisplay. "
fTrue:
lbarHeight:= kev).
bar
-
barLderloft
(ar0bject = model) & (anAsPect
:=
(0 0 bartleight) exrent: barfidth 0
fclose) i fTrue:[^sel
(sel di
:
f
f
i
ColorYalue blue;
fTrue: I
Iself
splayRectansle: barl i
inval idate.
fFa I se:
process
lbarHeight:=
self heightFor: (histDict at: eraseBarBottott := sel
(dictionary
resmo.
keY).
I
fork. process
f
heightFor
suspendfrrcondi t i ona I I Yl
:
at: keY).
barlowerloft
-
(0
I
i
bar := barfidth extent: bartleight)
I
I
(sel graph i csContext
)
di splayRectangle
:
Co I orVa r.re I
f
model
veryl i ghtGrav
: barl. barLorcrleft := barlorerleft
fFalse:
[self
nst i nctStatusvi ef, rethodsFor
eraseBa rBottom. pa i nt
=
close].
self inval idate. (process suspendindist) isNi I
barHoight.
graphicsContext) paint
+
keY
iflrbsent: 0)
self heishtFor: (dictionarv at:
:
labelSpacel
key)
)= (histDict at: i
f
graphics0ontext di sPlaY barlorerLeft + (0 0 -10). sel
1
(dictionarY
1
to:koyLabel size rith:fgml I'
//
bartidth := self barFrarP Yidth
// (self
mvDict
nef,.
kev) I
nidlh
koYs do: [:kev I lkevl-abell
self
lhistDict := DictionarY
barFrame
mx: 1) 0 0.
fTrue;
i
self
:
:'
inval idate. ] access i ng'
altcdel
self setllodel : atodel. signal := Sqnaphore ner.
;
i
signal signal
(barfidth+10CI0)1. diotionerv kevs do: [:kev I histDict at: (dictionarY at: keY)l put: key
s i rrur
I
at i onProcess : aProcess
prooess := aProcrss
display0n: isnored
回聾一鋼一“
″ 理 彎 ﹁
攣 電 一¨ 一﹃ 一
錮 一簗 一羹 一攣
一題騨一 趣一 奎
ry .rg
ri8Erar
舅 菫一 翌コ一
︼ 摯 一蝉 一︼ 一
(tl く0)8
(t2 く0) ifTrue:[^nil]
tl)=0 ifTrue:[xl := (((fu nOrma12)
lnst inctStatusYier class
"
instanceVar iablel{ames:
dotProductipl )/ ((fu dOtPrOduct: pl) ))‡ f hll:=((height
‡( f Oxl) r)/( pl r)) ]
lnst i nctStatusVi er
c
I
ass rpthodsFor
:
ifFa:se:[xl :=(kl
'createtindon'
dotProduct:((p2-pl)norma12))/(fu dotProduct:((p2-pl)unitVector)).
oper0n:model
hll := height ].
I ninfu container rindot := Schoduledlindor
statusVier
ifTruo:[x2:=(((fu nornta12)
new.
windor label :' Deci sions status' r i ndor
.
h21:=((height
statusVier : = lnstirrctStatusView model:model.
statusVier i nsideColor :ColorValue rhi te.
I
dotProduct:p2 )/ ((fu dbtProduct: p2) ))*f .
mi n im.nS i ze : 30002{X}.
container := CmositePart ner.
rcde
t2 )=0
I
ifFalse:[x2 :=(k2 dotProdlct:((pl― p2)norma12))/ (fu normai2 dotProduct:((pl― p2)unitVector)). h21 := height ].
myDeperdents statusv i eu. :
statusViei
aspect : Sdoc
i
s
ホ
(f Ox2) r)/( p2 r))]
ions.
er s irrulat i onProcess : (tnodel
statusVi
r1 :=(xl 0 hl1)+centre.
process). conta
inor
14 :=(x20h2l ){centre.
statusVier borderedln: (ff10
add:
g0 | inetidth:1.
extent:101 ).
gc Paint :ColorValue whi te. gc displayLirpFron:r1 to:r4. l"
wirdor ccnponent : contai ner.
lrindor open] fork. 0bject subclass:
ellarcs:'
nstanceVar i abl
i
inhabitat
RTSRoonr
ilRTSRocrn
roornld
plan
roon8ase
consi stOf
'
classVariablell,anos: ' ld
poolDictionaries: category
:'
Rea
methodsFor:
' initial ize-release'
cons i stance
:
consistances
lxmin ymin xmax vmax atal | |
'
"
lTineSimu at i on' I
xmin := ynin := 0. consistance := consistances. consi stances do: [ :aConsistacel aConsi stace
rocnr:self]. RTSRoom methodsFor
:'
atall
disPlaYins'
gc perspect i veShapeFronfo i nt : ov direction: s heightFrcrn: height viewAngle: va di sp IayOn
:
l rl
r4
f
ytmx := ymin := aUall rectarEle t@. consistances do:
t :Wl
fu kl k2 Xl
pl p2
hll x2 h21 centre tl 12 1
f := 200 / ((va dbgreesToRadians)tan). fu :=( ((S degreesToRadians )cos )0 ((S
degreesToRadians)Sin) ). ronase d。 :[:gridl
:= xnax mEx:(w
Ylnax
:= ynax max:(r
rectangle top). xmin := xmin min:(w rectangle left). ymin := yrnin min:(w
。V.
p2 :=(grid at:2)― oV. kl := pl― (fu*f).
k2 := p2-(fu=f). tl :=kl
xrnax
rectangle right).
centre := 200 0 150 .
pl :=(grid at:1)―
detect:[:rl true]. afall rectangle risht.
:= coflsistance
)or.tx := xmin :=
dOtPrOduct:fu.
t2 := k2 dotProductifu.
rectangle botton). J.
rocntsase : =0rdoredCol lect ion nefi'
xmin to:xmax bY:1000 do:[:xl roor8ase add: (Ar ray ci th: (xOvni n) ri th: (x0vmax))1.
理綱一“一 蝉
︼ 攣 ¨ ﹃
響 ﹄ 囀 一
攣 一” 一蝉 一響
¨”綺芭一崎
‐ 盪
―
-:g
{,gl;@i
-:Wlid$iti{riii!
sirs l{
一
^plan sim.rlat ionArea
ymin to:ymax bv:1000 do:[:Yl roolr8as€ (Array ri th: (xninQy) ri th: (xmaxOy))1. add: walls
-consistance select: :consistant [
id: allwber
consistant
rocrnld := al{uber.
inhabitat := Set RTSRocrn
mettdsFor:' task
i
tat
I
l.
language'
enter : arffT$bject nhab
I
ner.
RTSRocrn c
i
isRTSfal
I
ass
i
nstarrceYar iablel{ams
:"
add : anRTS(b.iect RTSRosn
class
metMFor:' initial
ize'
oxi t:anRTS0bject
initializeld inhabitat rqnove:anRTS$ject i fhbsent :ni
I
ld:=0 in:arfrject RTSRoorn
lpl p2 ccl cc :=
right 0 pl
y.
0.
newRocrnfith:consistance
position. '= simuiationirea affiject o2 pl
class rrcthodsFor: ' instarrce creation'
:= an6ject
InetrRoonl
ld := ld+l. nerfiocrn
cto: [:af,alll (ClossCheck
I vector at:1) with:(ailal I vector
:= self ner
'
ne$ocm id: ld ne*oon consistOf:consistance.
conslstance
test:(Array
-nerRoqn
rith:(ailal
at:2)
rith:pl nith:pZ)) ifTrr.re:lcc := ^cc
odd
View sr.bclass: SPerspectiveVies instarrceYariablel{ames: 'aspect ral ls
cc1l]
process redrar signal classVariablellanes: 'Pat
l.
PoolDictionaries: category
RTSRoon
:'
'
"
Real Tim*Simul
at i on'
metircdsFor:' accessing' Perspect iveVies nethodsFor
cons i stances
:'
di splaying'
d i sp I ay0n: gc
cons i stance
inhsbitat -inhabitat
'override the parent's displayins nEtltod signal rait.
openings
gc clear. self disPlaYRooiln:gc'
^consistance select:l:consistant
consistant ispening
I
I
"
self displayral ls0n:gc. self display0thers0n:gr. srgnal slgnal
plan:
aPlan
plen := ePlcn
simulationArea
disp lay0tters "DisPlaY other sins"
position direction vietAngle high currentview gc I
I
澤““一 ︼
簗 ﹁ 興 ﹃
一 彎 羹 一攣
gc := self graphicscontext. viowAnglo: viewAnglo
position := rpdal position. direction := rpdel direction.
]
vierAngle := model vierAngle. high :=(rDdel tEisht) - 100. currentvier := model currentSerrce. currontVier isili I ifTrue: [^ni | ].
di sp I ayRool0n:sE
"Display gr id"
I
currentviet : = currontview select: [:*al I lral I isRTS$ject]. curr€ntVier isti I ifTrrc: [-ni l]. currentVier do: [ :anObject
position direction vietAngle
tion
posi
I
gc
paint:(ColorValue gray).
high
I
:= nndel posit ion.
diroction := rpdol direction. vierAnsle := rcdel vierAngle. high:=(nodel heisht) - 100. npde
I
currentRocrn di splavOn :sc
: pos i t i on di rect i on : direction heightFrqn: high vierAr€le: vierAngle porspoct i veshapeFronPo i nt
an0bject
displayQn:gc
displaylal ls
position
perspectiveshapeFrorfoint:
direction: direction
'Display ral l"
I
position direction viorAngle high
currentvies gc
I
heightFrcrn: high
96 := solf graphicsContext.
viorAngle: viowAngle.
position := modol Positiofl. direction := npdeI direction.
gc clear.
l
viewArulo := npdel vierAngle. hish:=(model heisht) - 100.
di sp I ay0thers:On: gc
"Display other sims"
I
position direction vierArple high
currentVier
I
Position := rrcdel Position.
rection := nodsl di rection. vierAngle ;= model vierArEle. hish:=(model heisht) - 100. currentVier := npdel currentSence' currentVier isti I i fTrue: [^ni | ]. di
currentVier : - nrodel currentSerrce. currentVier ist{i I ifTrue:[^ni l]. currentVier : = cuf rentvief, select:[ :ral I lral I isRTSfal | ]. currentVief istli I ifTrue:[^ni | ]. currentVier := currentViec select : [ :ral I lral I perspect iveVi s ible]. currentvier istli I i fTrue: [-ni | ]. currentView do: [ :an0bject
I
gc
paint : (ColorValue br ightness: (ar0bjeot
brishtn€ss)
currentvier : = currentviot selsct: [:ral I lral I isRT$bject]. currentVier istli I ifTrue:[^ni | ]. currentVier do: [ :ar$ject
).
an0bject
display0n:gc
I
gc
perspect i veshapeFronfoi nt
paint : (ColorValr.re gray).
arObject
:
pos
i
t i on
direction: direction
displayon:gc
heightFrcrn: high perspect iv€Shap€Frqtfoi nt
:
posi t i on
vierAngle: vierArgle.
l
direction: direction displayWal:sOn:9c
heightFrm:high
"Disp!ay wall"
│ド
501鐵
i
I
nva I
i
date.
l"
position direction viorAngle high Perspect
currentVier I position := model Position.
direction := model direction. vierAngle :=
lcon
:'
pr
ivate'
I
-
signal rait. rnodel renoveDepondent :sel f.
cotl := container. con rsti I ifTrue:[^ni l]. [con containsr == nil] rhi leFalse:lcon := con containor].
currentviel : = currentvier
I
methodsFor
cl ose
model viewAngle.
hish:=(ncdel heisht) 100. currentVier : = model currontSonce. currentVies isili I ifTrue:[^ni | ]. select: [:ral I lral
iveVier
isRT$al | ].
currcntVief islli I ifTrrc: [-ni l]. currentvie[ := currentvieu select ; [ :ral I lral I perspect iveVisibla]. currentvief isf{i I ifTrue:[^ni | ]. currontViei do: [:ar{bject
con control ler close. self relaase.
signal signal
I
mystatus
paint:(ColorValue brightness: (ar0bject brightness)
-self
).
PerspectiveVier methodsFor: 'accessing'
displayon:gc
ar(bject
model perform:aspect.
aspect: aSWbol perspectiveshapeFrorfoint: di rect
'Rogister the messagp that is to be used for accessing the model's dictionary of chartable
position
ion:
di rect
heightFrom:
ion
values. "
high
aspoct := aSwbol
vierAngle: viewAngle. I update: aParaneter 'lf the aspect of the r|odel that cares about has charged, redisplay. "
this view
nodel: allodel "Set the receiver's rpdel to albdel"
self setilodel:
alodel'
signal := sermphore
ner.
signal signal aParameter = aspect
ifTrtre: lself
invalidate]
simulationProcess:aProcess
update: anAspect with: aParaleter from: anObieCt "lf the aspect of the model that thiS view
cares about has chatt
process := aProcess
rediSplay."
(arr0bject=rcde|)&(anAspect=Perspectivcvietc|ass instanceYariableilanes: " close]. self inval idate.
f;close) ifTrue:[^self
"(process suspendiruList) istli
forkAt
:
(
.凶
―
簗
PerspectiveYiel class fFthodsFor: 'create vrindol'
[self inval idate. process resunel
oper0n:rPdel
Processor userSchedr.rl i ngPr i or i ty).
suspendfrrconditional
process
lyl
I
ifTrue:l
ifFalse:lself
I rindow statusView sl I
container
persVier pl
wirdol := Sche&ledindor
nes'
羹
理
1鸞
511議
凛
「
==豪
=iT「 「
燎 ・
=t・
■■な 磁 ヽせ輩■■
"● “
.■ ‐‐Ⅲ
=薇
'FI,.^.■
uindor label :'Persp€ctive vier' r i rdor mi ninu6 i ze : 40005{D.
ヽ●=ば 続 ヽ ‐ a漁 ポ t凛 ´●ヽ凛 れ ヽ¨■
a,一 ヽ●
…ⅢⅢ中ⅢⅢ■■中中中■中学申響申警壼響響撃翌
Ⅲ ●│‐ ■ ‐ 中学:│ ヽ‐ヽ ´‐サ ■ i¨ ==`を ふ■■ ● ´ ■ '… …… "‖ '‐ …… “ “
“一“幽一轟
朦慕 轟
一蝉 撃 一蓼 一理
====「
● ここ
::====r=,==:==F==========:=「 III=こ
中 一 ] ]
iこ 凛■ti、 こ =な ‐4-●=''一
==I=F=F;=T=F==【
'●
dec i de
.
"st"bclass responsibi
I
itY"
"ri ndol container := ComositePart ner. persViec := PerspectiveVier ner. maxinurSi ze :40003m. "
0bstacle class
porsV iew rnodel :model.
porsvier insideColor :ColorValue rhi te. nrode
I
persV
nstanceVar iabl
i
ellms: "
rnvDapendents : PersY i er. i
er
aspect : llnove.
porsVier sim.rlat iorf roccss: (npdel process)' statusVier := lnstirrtStatusYisr
0bstacle class npthodsFor: ' instance creation' c
model:model. : Sdeci sions. at i orProcess : (npde
statusViet asP€ct statusV
i
ef
s imr
I
reato0bstac
^sel
f
I
e
:
ar0nner
ner orrer :ar(hner
I
Obstacle subclass: fBasic&stacle
process).
Fl :=
"
instanceVar iablel{ames:
LayoutFrane ner.
topFraction:0 offsot:
pl
c
assVar i ablellalres
I
poolDictiorpries:
0;
:'
category
bottonfract ion:0
Real
:" "
Tim-Sirulat i on'
offset : 300;
leftFraction:0 Bas
offset : 0; r
sl
:=
topFraction:0 offset:
;
'search othor rts(bj€cts and avoid near objects near than lO0 rn"
I
offset:500;
ghtFract ion: 1 offset :0'
others :=
container add:PersVier in:Pl
serrce
se I ect : [ :aSence I aSence sRTs&ject]. others := others i
borderfi dth:2. contai ner add:statusVier in:sl
ect : [ : aSence <=min) l.
se
idth:2.
rindor
I
201X).
sence := orpr currentSence' sence size == 0 ifFalse: I
offset : 0;
borderlf
min
others
sence
min :=
leftFraction:0 i
' access i ng'
avoiilthers
bottonfract ion:0
r
:
c{bstac lo rcthodsFor
ghtFract ion: 1 of fset :0.
LayoutFrane nor.
sl 3CC
i
i
conPonent
:
contain€r.
I
|
(
(orner
di stanceTo(hj ect : aSence)
others isEnPtY ifFalse: [others do:l
lwi ndor oPenl forkAt : (Processor userSchedr I i nsP r i or i tY)
:
Object stbclass: il0bstacle i nstanceVar i abl ellarnes:' offter
classVariablellams:
pool0ictionarios: cat@ory
:'
Roa
"
"
lotherAnglo agl ag2 ce
position)
-
radi ansToDegrees
lTirnaSirul at ion'
-
i
ni t
:'
asl := ((other
.
.
ce:= ((((other
ial ize-releaso' position)+(other destinatiorD posi t
orner:anRTS&ject offler := arfiTS&ject. 0bstacle methodsFor
I
as2 := ((other (orner position)) th€ta
radiansToDogroes
:'
I
(omor position)) theta
destination) Sstacle rpthodsFor
other
ion)) theta
)/D -
(ornor
radiansToo@rees.
othorAngle:= Angle anglel :agl arEl02:ag2 throwh:ce' accessing'
(agl -20) to:
(asl + Z)) bY: 10 do:[:il orlrcr
望題幣螢 ・
一 ﹂ 一響 攣
﹃ 囀 一 一響 一
饗 一摯 一” 一簗
一題攀” 一題
…
==「
I:trti.■
^●
ヽ―― Ⅲ ゛‐ Ⅲ ‐‐ ,・・ ‐ ヽ"… ヽ 一ヽ――‐ Ⅲ Ⅲ Ⅲ 、 _… ,"・ ,… ・‐'ヽ ‐ヽ ―・ ・ ・‐‐ ・ ・¨・ ・^,ヽ い‐,・ Ⅲ '・ ド 岬響苧甲彎中学響彎甲雫学ギ彎響学響警中警 ,^Ⅲ と ヽ ●Ⅲ 響挙彎 Ⅲ ● ´― ヽ ti■ │='‐ ■│=● t● ‐ ,一 ●●″it'● t● ` ―‐ ●●■●Ft,ス ‐ .・
'・
==:='F==:Fl,IL二
l,「 ,I.… .■ ■t■ 燎 t●
=●
===t■
一―
=‐
=し
,,,● ・ =・
III''''''│‐
・
I●
“2一 螂 一一
τ
蝉 摯 一簗 一攣
=======「
:=:========:=====::==:==='F「
¨ ] 囀 ]
│====真
=,お `
“
setHewObstacleAt:(i)valuell]. otherAngle =nil ifFa!se:[O to:35 do:[:il(otherAngie inside:(1事
RTSlal
I
methodsFor:' displaying'
10))
ifTrue:[owner setNewObstacleAt:(iネ 10)value:1 ]]]
di sp I ay&r : gc p€rspect i veshapeFrofoi nt
] ]
ov
]
va
ar rav2
k2 xl hll h12 x2 h21 h22 O1 ;= positionl - ov. p2 := position2 - ov. fl := self floorHeisht. centre := 200 0 150 . fl isl{il ifTrue: ifl := 35001.
centre kt
avoidWal!s ''search other rtsObieCtS and avoid near obieCtS near than 1000 mm"
l sence wa!ls
:
direction: s heightFrom: height vierAngle: I 11 12 r3 r,f fl f fu Pl P2 arraY |
f := 200 / ((va deoreesToRadians)tan). fu :=( ((s dogroosToRadians )cos )0 ((S degreesToRadians)sin) )
min op l
Op:=owner position. min := 1500. sence := owner currentSence.
kl := pl― (fu‡ f).
sence size == O ifFalse:[ wa‖
k2 := p2-(futf〉
s:t sence select:[:Sencel aSenCe
(kl
isttall].
=o dOtPrOduct:fu) 〉
ifTrue:[xl:=(((fu nOrma12)
walis:=wa‖ s select:[:aSencel(aSence
dotProduct:pl )/ ((fu dotProduct: pl)))ネ
distance:op)く =min].
f.
hll:=((height
walls do:[:wa‖ │lwallAnglel
*(f Oxl)r)/(pl r))negated. h12:=(fi―
wallAngle := wall angloFrom:op height )‡ f / (pl r)]
ifFalse:[xl :=(kl
O to:35 do:[:il(Wa H Angle
dotProduct:((p2-pl)norrla!2))/ (fu dotProduct:((p2-pl)unitVector))
inside:(i‡ 10) ) ifTrue:
hll:= height
[ovrner negateκ i
setNewObstacleAt:(i*10)value:1.]
h12 :=
]]l
fl―
height.]
(k2
dotProduct:fu))=0
ifTrue:[x2:=(((fu nOrma12) dotProduct:p2 )/ ((fu dOtProdCt: p2) ))=f .
dec i de
self avoid)thers. self avoidalls llodel st"bclass:
SBTSfal
I
instarrceVar iablellames:' roorn posi t ionl
position2 id sinmlation f loorHish'
h21:=((height ネ( f Ox2) r)/( p2 r))negat員 h22:=(fl―
height)=f/(p2r)] ifFalse:[x2 :=(k2 dotProduct:((pl― p2)nornta1 2))/ (fu
classYariablellarcs:' Planld'
dotProduct:((pl― p2)unitVecto「 ))
cate{Pry:' RealTimeSimulat ion'
negatcx土
poolDictionaries: "
h21 := height
h22:=fト height.].
RTStal
I
nrethodsFor:'
initial ize-release' rl :=X1 0 hll.
f rorn:aPointl
to:aPoint2 id:anld
positionl := aPointl. position2:= aPoint2.
id := anld
r2 := X10 h12. r3 := x20 h22. r4 :=X20h21. arraγ :=Array new:4.
array at:1 put:(rl
一躊饉一謳一“
] 一 H 一 一響
蝉 彎 ¨ 一攣
一 ﹃ 摯 一攣 一︸
︼ 攣 一摯 一響 一
一S“一”一”
口一”腱一当
一四 響 攣 一攣
xsymotory)+cont re. RTSWIli methodsFor: 'accessing'
a(rav at:z pr,tt:( r2 xsymnetory)+cont re.
angloFromiaPoint
array at:3 put:(13 xsymEtory)+cent re.
array at:4 put:(
l thetal theta2 thru l
14
xSynmetorY){cent re. thetal :=(positionl
atraVz'.=AtraY ner:5. atraYz atil Put:(rl xSymrtory)fcent re.
atrayz atiz put:(
radiansToDegrees.
theta2 :=(positiOn2 - aPoint)theta radiansToDegrees.
r2
thru:=(((poSitionl+position2)/2)一
xsymetory)+cent re. arraYZ a113 Put:(13 xSynmetory)icent re.
attay? att4
put:(
―aPoint)theta
aPoint )theta radiansToDegrees Ang:● anglel:thetal anglo2:theta2 through:thru
14
xsymetory)+cent re. brightness
array2 at:S put:(rl
l theta l
xSynrptory){cent re.
theta:=((positionl negated+position2〉
sc I inetidth:1.
gc displayPolygon: arraY at: 0 0 0. sc Paint :Colorvalue $i te. gc displayPolylirrc: arraYL at: 0 0
theta radiansTODe9「 oos rounded)+ 180.
(theta = 360) ifFalse:[theta := theta ¥¥ 300].
0.
^ theta / 360
di sp I ay0n: gc sca I e: sca I e floorHeight
lPl P2 originl orisin := 00((self simulationArea) bottcrn). pl := (positionl xsymotory * origin) *
* 5. p2:= (position2 xSvrmetorv { origin) t scale * 5.
floo「
High isNil ifTrue:[floorHigh := 3500].
^fioorHigh
scale
sc I inetidth:4.
position
sc disPlaYLirEFram:Pl to:P2
lcenterl
Transcr iPt cr : shw :' di
sp I ayRectang
I
e',
(se
I
f
s
im; I at i onArea
*
scale*5) printStringl Transcript cr:sl'pr:pl,' -', p2 printStringt di sp I ayOn:gc sca le: sca
id
^id
le
of
fset :of fset
center :=(( (positiOnl x) +(pOSition2 x))/2 )0
(((positiOnl y)+(positiOn2 y))/2) center rectangle
^(Rectang!e origin: positionl extent:position2) lpl p2 originl
origin:=00((se:f Si側 !ationArea)bOttOm). pl := ((positiOnl xS― tOry + origin)ネ scale)loffset.
room:aRom room := aRoom
p2 := ((position2 xS― tOry l origin)ネ scale)+offSet.
simulationArea room silllulationArea
9c :ineWidth:4. 9c disp!ayLineFrom:pl tO:p2. "Treneoript
cr:show:'dispiavRectang:e`,((se!f Sinu!ationArea
structure Array with:positionl with:position2
bottomRight ‡scale)ネ 5)printSt ring. Transcript cr:show:pl.'― ',p2 printStrir℃ L"
響 攣 興 蝉
輌 一響 一攣 一彎
羹 鱈 一攣 一︼ 一
一輝控一 盟¨出
54蓋
iiriiiirii{ia
:;-iiiiaiq
“一コ“一理
一︼ 摯 一︼ 一︼
riiiia,*.i
lype
^ 'ilall'
I
RTStal
class rmthodsFor:' instarrce-creation
f rm:aPointl to:aPoi nt2 Planld := Planld + 1.
vector ^Array rith:positionl
^self
n*
RTSfal
I
frcrn:aPointl to:aPoint2 id:Planld
rith:(positionZ positionl)
I
RTSilal
nethodsFor
:'
class nethodsFor:'
0
aStroam aStream nextPutAl |
:'
anRTStal
l-' : print
:
RTStal
I
srbclass: $ffIS0penins instanceVariabldanes:' classVariabletlarcs: "
id RTStal
I
ize'
initialize
pr intine'
Planld :=
print0n:
initial
metJpdsFor
:'
poolDictionaries:
testing'
categpry
:'
nextkn'
"
RealTimSirul at i on'
di rection;aPoint
-
un i
((posit ion2-positionl
)
rotate:90) RTSOpeni
tVecto r.
((posi t ion2-positionl
"'= un i tVector. I .= (positioll-aPoint ^(v dotProdrct:r)
)
deV i ew:anAngl
:'
test i ng'
rotate:90) typ€ -'
0pen i ng'
).
abs RTSOpeni
nsi
accessing'
^nextRocrn
lv rl
i
:'
nextRodn
aPo i nt
di stanco:
ng methodsFor
e
pos
i
t
i
ng methodsFor
t i on
on :aPosi
isExit -ardngle cross : (sol i
f
ang I eFrqn:aPosi
t i on) ^[nextRoom
isNi | ]
s0pen i ns
^fa
I
i
se
sOpen i ng
^true
isRT$bject
^false
isRTSFlan
isRTSlla I
^fa I se
I
-true
isRTStal near :aPoint distarrce:
I
-((self distance:aPoint)
-fa I se
(= | )
RT$pen i ns netfrodsFo r :
DersP€ctivevisibl6 ^t
I
f rcrn:aPoi
rue
ntl
positionl :=
initial
ize-release'
to:aPoi nt2 nextRocxn: aRoon0rili
I
id:anld
fointl.
position2 := aPoint2. fiTstal
I
class i nstancevar iableflarcs:
"
nextRoon := aRocnOrfli l. id := anld.
一聾綽謹一嶼
一鰯5 5
攀 攣 一 一攣
攣 彎 響 蝉
黎 攣 ” 幽
“鰤諄一4
:'
ng tnethodsFor
“一 ““ヨ
一 一 一︼ 一
RTS0peni
wrap : = Borderedtrapper
pr int ing'
on:slider
cont add:[rap leftFract ion:0 offset
pr i ntOn: aSt ream
:
aStream nextPutAl |
orint:
'anRTSilal
l(0pening)-'
:
in:((LayoutFrame new)
:
x+50 :
id
rishtFraction:0 RTS0pening class i nstanceVar i ebl ellemes
:'
class nethodsFor
RTSOpening
offset:x*70
:
:"
bottorFract ion:0 of f set:250;
topFraction: 0 offset:150) . I'
instance-creat ion'
windo[ conponent : cont. [window oPen] forkAt : (Processor userSchedrl insPr ior i tY)
f rcrn:aPointl to:aPoi nt2
Planld := Planld + -se
I
f
new f
rorn: aPo
1.
nt1 to:aPoi ntz
i
nextRoom
:
n
i
I
RTSScheduler class
id:Planld
instanceVar f
rorn: aPoi
ntl
I
f
new f
ablel{anes:
"
to:aPoi nt2 nextRoom:aRoom
Planld := Planld + l. ^se
i
ntl
rom : aPo i
to : aPo i nt2 noxtRoorn
:
aRoom
RTSScheduler
class
mothodsFor
:' instanc€ croation'
id:Planld operon: anAr ray
View subcl ass
:
-sel #RTSScheduler
f
instarrceVar
cl assVar iablellames:
category:'
Rea
"
llcdel subclass:
"
ooolDictionaries:
I
er
methodsFor
open0n: anAr ray -RTSSchedl
I
window
i
ni
ta I i ze
-
re I ease'
I
er
ion deci sions'
category:'
operOn : n i I "
Real
"
TinreSimllat ion'
arraYl
window := Schedtledilindow ner" windor label :' Scheduler' .
RTS0bject mothodsFor
ndor mi n imunSi ze : 400€500' "w i ndow max imurSi ze : 4000300. "
avo
:'
Pr
ivate'
wi
cont := C$PositePart
i
ffibstac
ner.
do:
tr tl
[:xl lslider wrap valuel with:(anArray
at:(( x /
value := ValueHolder 20) rounded +1) )'
arrayat:(( x/20)
td
returnl cl€|.
cla.
[tr := tr+350
slider
:
tl:=t!キ 10
:=
=360]WhileTrue:[tr := tr― [tr 〉
va I ue'
sl ider beVertical. sl ider control ler beSl ider.
:= :=
:
t((self obstacleAt:tr; >= td) I ((self obstacleAt:tl ) )=td)l rhi leTrue:
rounded -}1) put:value' Fract ionalUi&retView model
le : da terdency
Itr tl
array '.= ArraY rr;r:12.
0 to: 239 by:20
rocxn
classVar i ablel{ames:' CachedSca le j CachedShapes Pe rspect i veshapes RTS0b ect I d'
ooolDictionaries:
cont
incts
position direction id simulation currentsence speed experierrce vierAngle height pp pd ps obstacles
lTimeSimulat ion'
:'
#RTS0bject
instanceVar iablel{anres:' inst
obstac leDi rect RTSSchedr
new oper0n:anAr raY
iableilames:' varaiety'
300].
[tl )=360]WhileTruc:[tl := tr― 360].]
J口一趨 “ 一
6 掘5
] 一 一 一]
・ “““一 “
return := tf. ((self obstacleAt'tr) (= td) ifTrue:Ireturn := tr]
vision ^Angle anglel : (di rect i onlv i elAngle) ang I e2 : (di rect i on-v i eiAng I e) through : d i rect i on
ifFalse:Ireturn := tl ^
iiii;lig
ヨ一理“一当
4S &dd
]. rhereAnl
return
I rocrns
changeRocrnTh rough : ar0pen
i
I
roons :=
ng
sirulation
rooms.
roonrs do:
self sel
f
exitRoqn
[;aRoonl
enterRocrn: (an@eni ng nextRoom)
(aRocrn
in:self
)
i
fTrue:
Iself
enterRodl: aRoqn ,t, )
cur rentsefice
^cur
rentSerrce
RTs0bject methodsFor:' task language' di rect i onVector
-(di rection desreesToRadians cos) 0 (di rect ion dagroosToRadians sin)
tnove
'docide noxt turn's rpve pol icy and
I dec opening td teml ist{il ifTrue:tpd := direction deepGopvl. isl{il ifTrue:[pp ;= position deep0opv]. self obstacleClear. self sencing.
onterRoom: aRoqn
room
pd pp
anter:self.
aRoon
:=
aRootlt
dec := Set ner.
ex i tRoom
instincts do:[:anlnsl lansl ans := (anlns roon
exit:self
dec
i
de).
decisions
at:anlns put:(ans
reoort ^f(posi t ion di rect ion vior)
atr3)' dec add:ansl.
dec ist{il ifFalse:I dec := doc
roonCheck
I
mv
mv :=
asSorte{ollection:[:dl :d2l (dl at:3) > (d2 at:3)] direction := (dec at:1) at:1.
p clossOpeningl
self directionvector I
at:t) at:Z' td := (dec at:l) at:3. l
speed := (dec
speed.
p := position.
ifTrue: Idi rection :=0.
roqn openings do:
[:oPening
sPeed := 0'
I
td:=
lovarrayl
o := opening structure at:
v
:= o
-
a(tzy := Array
rith:p sith: rv
rith: o rith:v. (ClossCheck test :array) fTrue: [clossOpenir€ : = oponine)1. ^c loss&en ing
I
anObstacle
decide. l.
tom := self
avoidaObstaclo;di rection
terdency: td.
((tenp - direction) abs <=lfl)) ifTrue: [di rect ion : = torP]
ifFalse:lspeed:= 0]. opening := self roomChock. opening istli I i fFalse: Isel
senc i ng
changdocrnTh rcx^dr : oPen i ng
'serrce surrourdings" currentSence : = simulat ion senco:sel
11.
obstacles do: [:ar$bstacle
1.
((openins structure)
at:2).
i
rmve"
l.
degreesToRadians cos desreesToRadians
* spoed
sin *
t
(diroction (direction 0
position ;= Pesition f'
f
sPeod)).
7 一端5
一 彎 一︺ 一攣
攀 彎 響 簗
興 幽 一蝉 一岬
爆一 “距一 “
self sel
:::「
T=:「
こ「 FF=三 二 「「 =「 「 「
F「
=「
― ―― 中 ― ‐ i lllⅢ
響 ― ‐ ‐ ‐ ‐‐ …… ‐―'・ ― Ⅲ ‐ ― ・‐ ・ 1.1.. _¨ __‐ ―‐ ―‐ ・ ・ ・‐ ・‐‐ ・ ・Ⅲ ・ ・‐ ・,― ‐ ・‐ '^― “ i・
near
changed:lFtpve.
f
changed:#dec i sions.
:aPoint di stance: I -((sel f distance:aPoint) (=l )
perspect ivevisible
RTS0bject methodsFor:' testing' di stance:aPoi
ⅢⅢIIIIIIIlrlゃ │││11,1彎 ビF曇 鸞響
彎│││││
^true
nt
:'
RTSObiect methodsFor
^(position-aPoint
)
4一”“一
‐
=F==FFr=:'「
︼ 一一 一︼ 一一
I;:,「
一 一 一一 一
‐
ini t ia I i ze-release'
r
setlnstinct i
nsi
deY
i
er :anAngle pos i t i on : aPos i t i on I theta I
tlpta :=(position
-
start irEPosi t ion: aPoint start i ngAngle: aStart i ngAngle v ierAngl e : vA he i ght :hi gh i nst i ncts inst i nctClasses id:anld "define defaults'
aPosition) theta
rad i ansToDeg rees.
:
-anAngle inside:theta
id := anld. insideViesPosit ion: aPoint di rect ionl di rection2:da2
I vvl
rv
:
position :=
dal
hoisht:=
vierAngle := vA/
vvl w2 wl
:-
da2 degreesToRadians cos degreesToRadi ans si n).
w
:= vv2
-
0
2.
viewAnglo '= vief,Angle ++ 360. di rection := aStartinsAnsle.
:= da1 desreesToRadians cos 0 (dal
degreesToRadi ans si n).
w2
aPoint. hish.
direction := direction +Y 360. instincts := Set netr' inst inctClasses do: [ :anlnstinctClass
(da2
vv1.
r
inst incts add: (anlnst i nctClass createlnst i rrct : se I f )1.
rv := (position-aPoint ) unitVector. ^(ClossCheck test:(Arrav rith:vvl ri th:vv
sirulat ion : = RealTimeSimulat
r i th: (lE()) r i th: rv) )
ion
act i veS irru | at i on i
ns i deV i etf,os i t i on
:
aPo
i
nt
di
rect i on : da
v i ewAng I e
:
anAng I e
I rv vvl w2 wl wl := (da + anAngle) desre€sToRadians
cos
0 (da + anAngle desreesToRadians sin). w2 := ( (da - anAngle) degreesToRadians cos 0 (da - anAngle degreesToRadians sin)) vv
start infosi t ion: aPoint start i ngAnglo: aStartinsAnsle vierAngle: vA id:anld 'define defaults" sirnrlat ion : = RoalTineSirtllat ion
activasim/lation. id := anld
oosition:=
aPoint.
height:=1800.
:= vv2 - vvl.
vierAngle := vA/ 2. vierAngle := vierAngle Y+
rv := (position― aPoint )unitVectο r.
‐
(CloSSCheck test:(Array with:vvl with:VV with:(000)With:rv))
360.
ion : = aStart ingAngle. direction := direction YY 360. instincts := 0rderedCol lection rer.
di rect
i30pening ^false
obstacles := Orderedol lection ner. docisions := DictionarY new. speed := 0.
isRTSObieCt
self setlnstinct. self set0bstacle. self rhereAnl.
true isRTSPlan ‐ false
instincts do:l:al decisions at:a put :01.
isRTWai!
^false
RT$hject
methodsFor
:'
Pr
int ing'
望 螂綱一蝉一
8 慇5
攣 輌 一摯 一彎
““¨”¨出
I
-id
ag := anAngle.
pr i nton : ast rean
las las
astream nextPutAl | :'arfiTS0bject-'
print;
:'
ect : arffTS& ect
I otherPoint
"
(anRll0bject spe€d) theta : (arfiTS(bj ect di rect i on) degreesToRadians ).
nt
r
//
10.
I
as ;= anAnsle - ((anAngle // 360 as := as // 19.
I
otherPoint : = (arffTS(bject posit ion) i
as-360].
obstacl eAt :anAng I e va I ue:aYa I ue
accessi ng'
las
t (Po
rhileTrue:las:=
0001 rhileTrue:las := as+360].
j
I eTo0b j
arg
3601
-obstacleDi rection at:(ag 11)
id
RTs0bject methodsFor
> (
as i= as
:
“”“一 一
las
id
一響 摯 摯 錮 一
w
i.@ *e;iitiu iEada
t(obstacleDirection
:
^(((otherPoint)
- position) tfpta)
at:(asll))
<=
360).
aValrc
l
fTrue: I
Transcr i Pt cr ; shol:' obstac I e seted ' printString.
radi ansToDegrees"
^(((arf,TS0bject position)
i
)t
- position) theta)
at:(ag+l)
obstacleDi rection
radi ansToDegrees obstac
cur rentRoom
I
eC I ea
put:aYalr.re)
r
obstacleDi rection :=Array nef:36 rithAl | :0
roqn
decisions
obstac leTo(hject : anRTS&j ect
^decisions
^Arrav ri th: (((arfiTS$ject position) posi t
destination
-position
I
desreesToRad
i
ion) theta)
radiansToDegrees
rith:(((anRTS$ject position )+(Point r :speed theta:(di rect ion desroosToRadi ans))- pos i t ion) theta)
(Point r:speed theta:(di rection ans) )
di rect i on
radi ansToDegrees
-di rect i on
persp6ct iveshapeFronfoint
heightFrorn: ip viorAngle: d i stanceTo0b j
ect
:
anRTS0b j
proportion r1
^((arfiT$hiect oosition) he
i
- position)
ov di rection: s
va
fl f fu Pl ratio centre shape
I
ect
:
|
Dl := position- ov - (31[00).
r
fl
:= heisht.
centre := 200 0 (150 rngated).
ght ^he
i
fI isl{il ifTrue: tf| := 35001. f := 200 / (va deqreesToRadians ratio := fl * 5/ ( Pl r)'
sht
* * ratio / 3) rounded). proporrion := height / 1800. shape := Pixnap extent:(height
nx)vecl I
anAr rav
rounded
I
anArray :=Array new:5 withAl l:ni l. anArray anArray anArray anArrav anArraY
at :1 Put :Posi tion.
at:2
fu := (ip
at :3 Put :vietAnglo.
11
:4 Put :heisht.
(l (ip
cent re.
-anAr raY
sel
t obstacloAt:anAnsle
degreesToRadians cos
ans s i n)) un i tVector. '=( fu dotProdrct:( pl nornnl2) / ((fu dotProd.ct: pl) * f 0 ((fl - ip )*ratio)) ) +
degreesToRadi
at : 5 Put :currentSence'
ratio
0 (h6isht
Put :di rection.
at
tan).
ratio.
f
di sp I ay0n: shape proport ion :proport i on
^Arrav ri th:shaPe si th: r1.
題綱︼一螢
鱈 興 [ “
] 攣 蝉 攣 一
﹃ 攣 一¨ 一﹃
攣 一攣 攣 一攣
饉0理一導
:=「
==F三
二
=三
F=「
1‐
│=ヽ iバ ,た ,■ ■ 鷹 t,‐ 織 ヽ ´ ■1=: 8お │■ ●=│‖ よ│■ ● `出 ●●` ‐■ ■″ =‖ ・ =● ^‐ … ''● '品
““““
│==:=:==「
響 羹 一簗 一攣
T'T=■
…
=:「
aCC displayRectangle:leg at: lp."
position -position
displayOn:gc perspectiveShapeFrorointi ov direction: s heightFrom: ip viewAngie: va
process
l
^sirulation
pr@ess
fi f fu pl ratiO Centre rl xl hll
│
pl :=
setile$bstacleAt
:
anAngle va I ue :aVa I ue
'sot ner obstacle value at las
pOSition―
ov ―(30000).
fi:=height. centre := 200 0 150.
anAngle"
fl i釧 ‖ ifTrue:[fl:=1800]. I
f := 200 / ((va degreesToRadians)tan)
as := (anAngle
YY
360
) //
ratio :=
10.
(obstacleDi rection at: (ag tl ))(= aYalLE ifTrrc:[obstacleDi roction at:(ag+l) put:aYalue] s inu
I
xl :=(((fu nornta12)dotProduct:pl )/
at i onArea ^s
speed
f / ( pl r)
fu := (lp degreesToRadians)cos O ((ip dogroosToRadians)sin).
inllat ion s irulat
((fu dotProduct: pl) ))*f. ratio := (( f OXl) r)/( pl r).
ionArea
hll:=ratio ネheight.
‐
rl :=(x1 0 0)+ Centre.
speed
self displayOn:gc ati rl proportion: ratio. viewAngie
viewAng!e
displayPianOn:gc scale:scale offset:offset sel
RTSObieCt methoJor: 'disp:aving'
f
displayShape0n:gc scale:scale
offset:offset. dispiayAndEraseFinished d i sp I ayShape0n
:
gc sca I e : sca I e of f set : of f set
pp :=position
I centre
pd := direction.
shape eraserilask
ps
imago mask eraser
origin ic
I
isilil ifTrue: lself
class
displayOn:aGC at: pl proportion:p
S p “
create lmages : sca | 6.
lcentre shapel sca I e.
shape := (seif Class shape)at:1. aCC displayPolygon:shape at:pl sca:e:(pOp). "lhead chest body leg hp cp bp lpl
di roct i on.
head := Rectangle origin:000 oxtent:((3000300)ホ p).
positionl
hp:=((15000)ホ
pp:= ifFalse: [(ps = scale)
p)+pl.
chest := Rectangle origin:000 oXtent:((6000600)*
i
fFa I so:
p).
cp:=((00300)ネ
Isel
p)lpl.
f
class createlmages:scale.
body:= Rectangle origin:000 oxtent:((6000500)‡ p).
os := scale.
bp :=((00000)* p)lpl. leg:= Rectang!e origin:000 oxtent:((3000700)‡
lp :=((15001100)ネ p)+pl
C dispiayWedgeBoundecW:head StartAngle:0
phl● :
0w● ● “
360 at: hp.
aCC dispiavLdgeBOundeO: cheSt StartAngic1 0 sweepAngle: 360 at: cp. oOC disp!ayRectang!e: body ati bp.
, .,.
p)
self class image:direction. origin := {D((self sim.rlationArea) bottom). shape :=
ic
at;1. := shape at:Z. mask := shape at:4. erasor :=(self class imag€:Pd) ;=shape
imag€
at:
3.
”“︼螢 一
V 簗 一 一璽 O
一 一﹃ 攣 一攣
摯 墜 一蝉 一響
“”些鵬
erasertask := (self class image:pd)
at:
4.
centrs:=(ic/Dround. (pp = position) & (pd = direction) i
fFa I se:
lsc
copyArea: eraserllask frqn:(eraser
graphicsContext
)
sourceOf fset :Poi
dest i nat
ior0ffset:
scale*of
fset - control.
nt
(PP xSnmetorY 1
gc i
orisin) *
copyArea:mask f rcrn:( imge
graph i csContext
dest i nat
zero
)
sourco0f fset :Poi
or0ffset
nt
zero
((position xsynmtory 1origin) *
-
scale){offset
at:2 put:(-23 01626). at:3 put:(-94 01700). at:4 put:(19 01665). shapel at:5 put:(25 01728). shapel at:6 put:(79 01653). shapel at:7 put:(151 0811 ). shapel at:8 put:(277 0532 ). shapel at:9 put:(145 0288 ). shaoel shapol shapel
shapel shapel shapel shapel shapel shapel
centre.
RTS(bject class i
Cache6cale := nil. "shape 1 stardirrg" shapel := Array ner:18. shapol at:1 put:(-1520773 ).
shapel at:10
:
nstarrceVar iablellames:
"
RTs0bject class mettpdsFor:' instarrce creat ion'
at:13 put:(-35
:
aPoi
nt start
i
ngAngle:
I
RTS0bjectld '= RTS&jectld + l. t€flD :=
self
ner.
tem
start start
ingPosi t
ion: aPoint
:
aStart i ngAngl e vieuAngle: vierAnsle i
nsAr€ le
id:RTSObjoct
ld
ingPosi t
at:1 at:2 shape2 at:3 shape2 at:4 shape2 at:5 shape2 at:6 shapo2 at:7 shape2 at:8 shape2 at:9
aStart i ngAng
I
nt start i ngAngle: e v i erAng e : v i orAng e he i ght : aPoi
I
I
h i gh
9792 ). 0621 ). put:(156 0798 ).
put:(123 AUZ
put:(0 putr(4
).
0200 ).
CI38 ). ).
put:(-1330528 put:(-1120662 put:(-1450776 put:(-1050706
).
at:12 shape2 at:13 shape2 at:14 shape2 at:15
). ). ). ). ).
). ).
shape2
at:16 put:(-80 0868
shape2
at:18 put:(10 0lll6).
ion: aPoint
shaps2
at:19 put:(38
81218).
:
shape2
at:A) put:(N2
01700).
vierAngle: viewAngle
shape2
at:21 put:(99
01220).
heisht: hish
Perspect iveShapes : = Ar rav
instincts: instincts RTSSjectld := RTSSjectld +
^self
shapo2
put:(75 put:(91
put:(-34 024 put:(-74 020 put:(-114028 at:10 put:(-146042 at:1l put:(-83 0260
shape2
ion:
).
shape2 rnv i ng"
shape2
-t€np
start
0l)
shaps! ;= Arrav nes:21. shape2
aStart insAnsle v ierArElo: vierAngle
I torp
0200 ).
at:14 put:(-74 08 ). at:15 put:(-106022 ). at:16 put:(-64 0230 ).
shape2 ingPosi t ion
put:(40
at:Il put:(43 010 ). at:12 put:(5 01 ).
shaml at: 17 put: (-2010331 ). shapel at:18 put:(-1320684 ). "
start
1.
nec
start start
insPosi t i
ngAngle
饉一 “““
w@ ari&aA !4ss el&Bitt tSIl @s
aStart i ngAngle
). shape2 at : 17 put : (-10801700).
ri
th : shapel wi th : shape2
instincts: instincts id:RTSObject ld
RTS0bject class nrethodsFor:
'class initial ization'
RISSject class methodsFor:' accessing' image:deg I
inilialize lshapel shape2l RTS(hjectld := 0.
tenP
I
tenp :=dos roundod tenp := tenp #* 180. t€np := Gerro // 30)
+1.
“四一饉一 蝉
響 響 “ 口
攣 ¨ 一攣 一︺
lillEiiiiiCs
crsd
li&ilirll
lii.il,l|
uieiliitrii {iea
-CachedSlrapes
nesated)) rotate: (ddi negated))*scale )
at : tefip
with:( ((75 nesatod negated))*scale ) rotate:(ddi resated)) 0(225 with:( ((75 negated 0 225) rotate:(ddi nesated))tscale).
shape
-Perspect
veShapes
i
“コ““
ww
ogc paint :ColorValue I ightGray.
RTSSject class rethodsFor
:'
color
private'
do:
[:cal lc dl c := ca at:1.
create I mages: sca I e
d := ca at:2. Cache6cale isili
I
f
sel
I
drarlmages:scale.
:= scale.
CachodScale i fFa
I
fTrr.re:
I
sel
f
l
a@
displayWounffiy: chest startArgle: sreepAngle: 360 at:( rco I d).
so:
[ (Cachec6ca i
igc paint:c. im do:[:a@l
ifTrue:
I
e -=sca I e)
aGC
drarlmages:scale. CachedScale
:= scale.
displayfe&eBoundedy: chest startAnsle:
ll
sreepAnglo: 360
ledh
createShapeSca
:
sca
I
e di rect
i
on
at:(
aGC di spl ayPol ygon : po
:ddi
at:
l.
color
do:
[:cal lc dl c := ca at:1.
ic '=( ic * scale) abs rounded + (16016).
d
:= Pixmap extent:ic. erasor := pixmap extent:ic. mask := task extent:ic. image
ca at:2.
igc Paint:c. im do:[:aGCl aCrC
mgc := mask graphicsContoxt.
di
egc := eraser graphicsContext. im := Array f ith: iglc rith:mgp rith:egc. color := Array with:(Array with:(ColorValue r'hito) rith:(1 nosatod 0 (1
splaytedg€Boundy:
wi th: (Ar ray
rith:(ColorYalue I ightcray) rith:(000))
(Ar raY
t. ^ArraY
image
rith:eraser
with:rpsk d raw I magBs
:
sca I e
put : (se
lco := ((Point r:225 theta:((ddi
-
90)
xSynrnetory -
I
f
createShapeSca
rith:(( QWnil
rotate:(ddi
ed)n: sca I e
: $toni tor i ng(bject instanceVar iablellarcs:' sirdor
RTS(hject subc I ass
poolDictionaries: category
negated) )tsca e) I
I
di rect i on : ( (deg-l )*30)). t.
classVar i ablellanes
(75075))*sca I e+cent re.
rith:(
:= Array new:6'
CachedShapes at:deg
* sca le).
poly := Array
rith: ic rith:
I to:6 do:[:desl
((Point r:225 theta:((ddi + 90)
)
ght /2)
.r
Cachec6hapes
dosreosToRadi ans) ) xSyrmetorY (75075) Xsca I e+cent re. degreesToRad i ans)
i
.
centre :=(ic / D rounded. chost := Rectarple origin:000 corner :((1500180) * scale). head := Rectansle origin:000
:=
0
: 360 at :d+cent re-( (head bottonfi rounded)
rith:(3 0 3)) ri th:
corner : ((3000J!g)
startAngle:
head
sreepAng I e
)
rco
'.=
imaoe graphicsContext.
with:(ColorValue gray)
y
I.
ic:=6000600.
)
I
d+contre.
lco poly head color image im ic egcl eraser igc mask mgc
nesated)
0
lco + d).
I centre chost rco
igc :=
0
:'
:"
col'
"
RealTimeSirulat ion'
((750(225
理口一獅一整
岬 “ ﹂ 攣
攣 攣 一蝉 一攣
攣 響 一攣 一﹃
攣 一攣 一簗 一︼
一g一一4一 麟
lsel lbni tor i ns0bject rcthodsFor
:'
f
class createlmages:scale.
access i ng'
Ps := scale.
l
Drocess
^eimuletion
shape := self class image:direction. origin := fiX(self sim,rlationArea) bottom).
proc€ss
ilonitoringsject rpthodsFor: 'task
ic :=shape at:1. image := shape at:2.
larguagp'
msk ilonitorins6bject nethodsFor:
setlnstirrct instincts add: (Llpper
createlnstinct:
self).
:=
1pp =
I
instincts add:(Basiclnstinctlal
instincts do:[:al decisions at:a put:0]. ool := ColorValue I ightGray
creategbstacle:
position) 8 (pd = direction)
lgc copyAroa: erasertask from:(eraser graphicsContext) sourcd)ffset:Point zero destinatior0ffset: scale)*offsot
obstacles add:
gc
(Basic$stacle
-
((pp xSyrnnetory centrel'
copyArea:mask frqn:(image
dest i nat ior0ffset:
'nonitoring'
((position xsvlrmetory scaleXoffset - centre.
self changed:Sclose. col := ColorValue lightGraY.
I origin) *
xsymnetory
Scrol
t i nsV
i
er
sr,bc I ass
scale)toffset
:
l6crol
col := ColorValue red
ooolDictionaries:
categpry:' [Perspect iveVier oper0n:sel f
ru&jcct rpttpdsFor :'
di sp I ayShape0n : gG sca I e : sca
I centre
I
]
:
of f
image mask eraser
eh€p€ erasernask
ps
Scrol I inslmageVier nethodsFor:
origin ic
I
S p “
sca I e.
super initialize. point := Point zero. pix := Pixmap extent: extent
initialize lgc
direction. pp
:=
positionl ifFalse: [(ps = scale) i
.
簗
彙
4-―
…
欝
趨
鎧
I
super initial ize. point := Point zero. pix := Pixrnap extent: 200ll,20iJ gc := pix graphicsContext .
gc paint :ColorValue black. sc di splayiledgo&urdedv : (Rectarule
fFa I se:
鵬
' initial ize-release'
extent : extent
set
istlil ifTrue: [self class
create lmages: sca le.
"
RealTimeSim'rlat ion'
fork.
di splavi ng'
e of f set
I i ng lmagoV i ew
instancevariablellanps: 'asp€ct point pix ' classVariablellames: "
monitoring
i
t origin) t
gc displayArcBoundedy: ((80 extent:2t2) startArEle:0 sreepAngle: 360 at: ((position
closetonitor
tor
* origin) *
graphicsContoxt) sourcdlffsot:Point zoro
self).
llonitoring(bject methodsFor:
Itoni
4.
ifFalse:
creatolnstinct:self).
setObstaclo
at:4'
sfrape
eraser :=(self class image:pd) at: 3. erasertask := (self class image:pd) at: centre :=(ic / D roLlnH' sc paint:col'
'initializo-reloase'
譴
:
e鸞
… ―
i“
― 悟
63樹
“
or
isi n:000 extent :2000200 ) startAnsle: 0 sreepAnglo: 360
Scrol l inglmageVien nethodsFor: 'scrol l l
widthTomove := width
at:
000.
carScrolltbrizontallv is
(offset x *widthTollove (= 0) t( (self cl ippingBox ridth)(=(self displav0bject boun6 ridth + (offset x )+
ing'
"Ansrer |*|ether there is information not visible and can be seen by scrol I irg horizontal ly. "
that
f,idthTotove)) ifTrue:
[self translate0ffsetBy:
(
widthTolove 0 0).
f
sel
^(offset
x <= 0)
graphicsContext
di splay0bject display0n:sel
I
at:offsetl
&( (sel f cl ippingBox f, idth)(=(sel f
disolay$ject
ridth + (offset x )))
bounds
scrollLimit
total
"Ansrer the canScrol lVertical
is
ly
receiver can scrol l.
"Ansrer whether there is information that not visible and can be seen by scrol ling verticallv. "
bounds
amount bv
rhich
the
"
^(self scrollGrid bottm))
- (self
displavObject
scrollVerticalDelta
^(offset
y <= 0)
"Answer the ccnposition rectar€le offset,
8( (self clippindox heisht)(=(self display0bject bounds height + (offset v ))) scrol
used rnostlv
-offset
lllorizontalDelta
"Ansrer the ccnposition roctanglo offset, used nrostly for scrol
I
for
scrol I ins. "
scrol lVertical
ing-
y
ly: anlnteger I the receiver vertical ly by
Scrol
anlnteger. "
^offset
x
scrollllorizontally: 'Scrol
I
self scrol lVertical lYBy: anlnteger on: self graphicsC'ontext grid: (self scrol lGrid v)'
anlntogp;
the receiver horizontal lv
bv
elf
anlnteg€r. sel
f
scrol lllor izontal lyBY: anlntegpr
on: sol f graPhicscontext
srid: (solf self
scrol lVert i ca I I yBy sr id: sr id
srid.
scrollHorizontallyBy: width on: aCraphicsContext grid: gr!d ''Scroil the receiver by width momlo the grid."
:
he
i
ght
on
:
aGraphicsContext
"scroll the receiver bv heisht nod.rlo
scrol lGrid x).
updateControls
Lpdatecontrols
the
"
l
heightTOnOve
l
heightToMove := heighi nlax: seif SCroliVerticalDelta. (heightTOMove abs between: O and:grid)
l widthTObVe
l
widthTo‖bve := (■ idth max: self
scrollHbrizontalDeita).
(widthTOuove abs between: O and:grid) ifTrue:[widthTobve := widthTomove sign * grid ] ifFalse:[widthTO‖ Ove := widthTomove truncateTo: grid].
ifTrue:[heightTomve:= heightToHove sign ‡grid ] ifFalse:[heightToHove :=
heightToppve truncateTo: grid]. heightTobYO := height. ,
0)
く (OffSet y +heightToHove 8((Self CtippingBox height)く =(Self diSplayObiect bOunds height + (offset y )│
職驚営 64蓋
i
extent ).
shtTotove) )
inrago di splal0n: (vier di sp lay0bject graphicsContext ).
fTrue: I
i
“一一“一“
一 ” 4 興 理 一
he
self translatd)ffsetBy: (0 0 vier
heightTotove ). sel
f
di
splav0bject displayOn:sel
f
display0n:
er
:'
nethodsFor
f
=
LookPrefererrces e&EDecorator oni vlew.
d i sp I ay i ng'
te|m comorEnt: contalner. te|rp open
aGC
sel diep leyor
i
:
trrapp€r useHor i zonta lScrol lBar. container add: wrapper in:(000 extent:100' 9)
graphicsContext at : of fsetl Scro I l i ns lmaseV
:vier.
rnodel
rrapper
di
splavsjoct
di splav0n:aC* at : (sel
f
Scrol I i rslmaseVier srbclass: SPlanVies nstanaeVer iablellmes
i
red i sp I ayRectang
I
e
:
aRcctang
I
e
on
:
aGraph
i
:'
plan rts0bjects scale sirulationArea display0rigin displayExtent redraw process signal '
igin). csContext
"Redisplav the rectangle aRectangle in the
classYar i ablel&anes
poolDictionaries:
receiver on aGraphicsContext. "
categPry
:'
Rea
I
pp
:" "
Tim"Sinul at ion'
lscl gc := aGraPhicscontext
PlanVier nFthodsFor
coPY.
gc cl ippingRectangle: aRoctangle. gc paint: self backgroundColor. gc disp layRectangle: aRectangle.
aspect
:
:'
accessiru'
anAspectSYttbol
aspoct : =
paint: self foregrorrrclColor. self display0bject display0n: gc at: self
go
anAsPectSYttbol
sensor
display0rigin.
lconl
&ro|
I
con:= container.
inslmaseVier nethodsFor: 'accessing'
d i sp I ay0bj
lcon containor == con containerl.
ect
nil]
rhiteFalse:[con
con sensor s innr
I
at i orfrocess:aProcess
pix
process : = aProcess PlanYier methodsFor Scrol inslmagoVier class instanceYar iablel&anesl I
"
:'
button access'
doZoonr
Itam aRectarEle Procossl process := tnodel Process.
Scrol I inglmageView class methodsFor: 'exapnle'
[tem : = (DialogVier self scale:teilr.
"Scrol I irrglmageVier examle" tonp container vier wrappor imagel
frodjser
imag€
:=
tw rfip
=Schedlledindor
:
lmage
aRectangle := rodel simulationArea. simulat ionArea . = aR€ctangle botto08iSht. displayExtent := (aRectanglo bottoilfiight *
.
new.
display0rigin + displayorigin
label :' Scrol I i nglmageVior exalple' container := CcrmositePart ner.
scale)
vier := ScrollinSlmapYier net
extent: ( imase
si ze' . di splayExtent pr
聾
菫│││“
│`“
鱗 “
…
ヽ 菫
:―“ 1 10と
―
:' scale' )
asl&riber.
exarple
I
roquest
―
― ―
-
1:::.`‐
‐
.=│`“ │コ ILIIIビ 1日│“ │ユ│“ LI1111L菫
“
`“
│││1菫 LI“ 11`菫 │さ
“
ヨ ロ ニ │││コ 薔 │││111111麟 “ “ “
rounded+ Transcr
菫
││1薔 ILI=││“
ユ │ILIILI薔 ││`LIILEI=SILI`“ “
││“
'
ipt shor:' ner mdim
」 菫 菫 │`01`141111ピ
LIこ
111“
“
intstr
ins.
菫 菫」 │」
`││││││││││││111111111111111111111中
…
65豊
瘤 饉 押│
ヨ一 コ“¨“
饉 撻 □ 墨 奎 奎 盪 饉■め 昌 彎 中
幽 腱 由 餞 籠 “
一︼ 一︼ 響 一幽
“
一 ¨ 一一 一蓼 一
“ “
“
螢 州 翅 秘 螢 料 畳 髯 綸 出 幽 蝉 四 幽 挫
饉 む 撻 罐 饉 出 圏 轡
‐ む 瘤 ‐ ‐ ‐ 出 ‐ 暉 贅 饉
む
“
“
scrollHorizontallyBy: width on: aCrachicsContext
grid:grid
pix :=Pi渕 臓p extent:displayExtent.
“ Scroll the receiver by ,idth momlo the
pix background:Colo「 Vaiue lightCray. grid."
pix clear seif dispiayWalis.
l widthTOhVe l widthToHove := (width max: seif
se!f displayObleCtS self inva!idate. process resulle ]forkAt:6.
scrollHorizontalDe!ta). (widthTo‖ bve abs between: O and:grid)
process suspe越
ifTrue:[widthTobve := widthToHove sign t grid ] ifFalse:[widthTomove :=
monitor:aPoint
widthToVove trullcateTc: grid]. widthTo‖ ove := width .
ltp origin l
tp :=(( (aPOint ―displayOrigin― Offset)/sca!e)一
(00(SiIIluiationArea y)))xS―
tOry.
modei monitor:tp.
(self graphicsConte2xt)paint yeHow. origin i= 00(simuiationArea y). (Seif graphicsContext)
(OffSet x +widthToppve く= 0) 8( (self ClippidoX Width)く =(self dispiayObject bounds width = (offset x )+
displayArcBoundeay:(ooo oxtent:202) startAngle10 sweepAngle: 360 at:((tp xS― tOry + origin) *
widthTo‖ ove)) ifTrue:
scalo)+offSet.
( widthTttVo 0 0). self dispiayObieCt diSplayOn:self
PlanView methodsFor: 'private'
graphicsContext at:offset.
[seif transtateOffsetBy:
redraw := nil] scale: aSca le
scroliVerticaliyBγ : height on: aGraphicsContext
scalo := aScale ‡5. modei scale: scaie
grid: grid "Scroil the receiver by height modulo the grid."
PianView methodsFor: ' initia!ize― release'
l heightTOHove
l
extent: aRectangie sca:e:aScale he19htTonove := he19ht max: self super initialize.
scroliVerticalDelta.
diSplaYOrigin :=404. self sca!e:aScalo.
(heightTOmove abs between: O and:grid) ifTrue:[heightToHbve := heightTo‖ bve sign * grid ]
simuiatlonArea := aRectangie bottorRight. point := Point 2erO.
heightToMove truncateTo: grid].
pp := Set new.
displayExtent := (aRectangle bottorRight * scale) rounded+ displayOrigin + displayOrigin . pix := PiXmap extent:disp!ayExtent.
ifFa:sc: [heightTOmOve :=
heightTomove:=height. (offSet y lheightTobVe
く = 0)
&( (Self C!ippingBox height)く =(Self
pix background:ColorVa!ue lightCrav.
diSpiaYObleCt bOunds height l (offset y )+
pix clear.
heightToMove))
seif displayWalls.
ifTrue:[
self transiateOffsetBy:(00
self disp:ayObleCtS. heightToHove ).
PlanView methoFOr: 'testing'
se!f displayObject displayOn:self graphicsContext at:offset.
PlanView methodsFor: 'scroli!ing'
redraw := nil]
”理一踵¨ 煙
攀 攣 一 ¨
攣 輌 一︺ 一蓼
︸ 囀 一¨ 一蓼
攣 摯 一簗 一興
聾“題一雪
PlanView mothodsFor:
'displaying'
whi te.
atal I displey0n: igc scale:scale offset:(display0rigin*shadow). atal I display0n:mgc sca I e : sca I e of f set : (d i sp I ayOr i g i n+shadow).
display6bjects self model rts0biects do: l:ar0bjectl ar0bject displayPlar0n:(pix
].
offset:(displav0rigin). anbject displayAndEraseFinished I
shadow
graphicsContext) scale:scale
:= (3 0 3)
walls
do:
[:afal | igp paint:
display0bjectsOn:gc self
|
rnodel rts0bjects
do:
ColorValue
black.
l:ar0b.iect i an0bject displayPlar0n:(pix
€f,al
offset:(display0rigin). displayAn€raseFinished
graphicsC,ontext) scale:scale
arfbject
.
sc paint:Colorvalue srav.
I
disPlaY0n: isc
scale:scale offset:(display0rigin+shadox)' atal I displayOn:mgc scale:scale offset:(display0rigin{shador).
I. t. di sp I ay0bjects0u i ck I y0n:gc wal
self
model rtsObjects
ls
do:
[:atal
arObject displayPlar0n:gc
scale:scale
allall display0n:
displayAn€raseFinished
ailal sca e: sca I
le
of f set :di spl ayOr i gi
l' (tc
aGC
rnethod." (self display0bject ) graphicsContext
"Qverride the parent's displaying
clear. self displav0bjects. solf displaytalts.
disPlaY0n:mgc
n.
copyArea:mask
redisplayRectangle: aRectangle on: aGraphicsContext "Redisplay the rectangle aRectangle in the
display0n:a@.
displaytalls
"
lscl
lsc ral ls shador
imase mask
igc mgc
I
sc := self displayobject graphicsContext. walls := Set new. imag€ := Pixmap extent:displayExtent. igrc := inrage graphicsC,ontext. mask := Sask extent:displayExtent. mgc r- masK graphicsContext. self model rooms do:[:aRocnl aRocrn walls
[:atal I I
I
from:(inrage graphicsContext) source0ffset:Point zero destinatior0ffset: Point zero'
receiver on aGraPhicsC,ontext.
do:
igc
scale:scale offset:displav0rigin.
l.
super
|
lightGray.
offset:( (self display0rigin)+display0rigin).
display0n:
|
igc Paint:ColorValue
[:anObjectl an0bject
do:
rral
95 := aGranhicsContext copy. gc clippingRectangle: aRectangle. gc paint: self backgroundColor. gc displayRectangle: aRectangle. gc paint: self foregroundColor' self displavobiect displavOn: gc
at: self
display0rigin' redraw :=
nil
ls add:alal l. ]1. shadow
:= (1 e 1)
xsymrFtory
ySyrmetory. t€l ls
do: [:alalll igc paint:
ColorValue
update: aParameter "lf the asp€ct of the model that this view ares about has changed, redisplay aParareter = aspect
彎■167」
$il4iwi nlrrSril
instincts := Set
ifTrue: lself inval idate. ]
tith: aParaleter frcrn: an0bject the asDect of the model that this viet cares about has chansed redisplav. " update: anAspect
sub
I
nst i nct
:
an
I
“一 赳麟一 S
“ 一] 一興 一]
W
ner.
nst i nctC I ass
"lf
nst i ncts add: (an I nst i nctC I ass orner : ouner )
i
(anAspect = aspect) & (andlject =,rpdel )
fTrue:
i
rodrar
I
i
st{ i
lnstinct class
I
fTrue:
i
nstanceVa r iab lollams
i
:
''
t Isel
f
inval idate.
I
redrar := resume.
ectsOu i ck I y0n
I
ass nothodsFor
create lnst inct : an0mer -sel f new orner :anOlner
:'
i
nstance creat i on
t
lnst i rrct stbc lass
fFa I se:
: ( se I
f
g
:
$Bas ic
Inst i nctla | |
instanceVar iablollanos:
Iself d i sp I ay(h j
c
process
I forkl i
nst i nct
fiyes.
classVariableilanes:
raph i csContext ).
"
"
poolDictionaries: " category:' Rea lTirneSimulat ion'
process resuel fork l.
process susponcl.
l [so wi
I
f
dec
redrar := nil.
:'
accessing'
ide
"avoid wal ls"
l
min oP dv directionl I sence ralls op:= oiner position.
0bject subclass: f Inst irrct i nstanceVar iablellames:' offter inst i ncts classVariableilames: "
poolDictionaries:
methods,For
r"pdato : anAspect
th:aParameter.
catogpry:'
I
Basiclnstirrctfal
fFa I se:
i
dv :=
"
000.
min:=
1500.
senc€ := orner currentsence.
RoalTirnsSimulat ion'
sence
size = 0 ifTrue: [^ArraY rith:0
with:0 with:01.
lnstinct
rethodsFor
:'
accessing' isRTSilal
dec i de " sr"rbc I
ass
resPons ib i I i tY"
I ar0rder speed direction tendoncyl direction := 90. speed := 1fl)0. tendencv := 0.1. ar0rder := Arrav lith: di rection ri th:spoed ri th: tendency. ^ar0rder
ralls := serrce select:[:aSencel aSence ll. ral ls := ral ls select : [ :aSencel (aSence
distance:op) (=minl.
ralls size = 0 ifTrue: [^ArraY with:0 rith:0 rith:01. ralls := ralls asSorteilol lection:[:nl :12l (wl distance:op) ( (r2 distance:op) l. ral ls do:[:ral I ldv := dv l(ral direct ion:m)1.
direction
I
:= ((((dv unitVector) theta
)
radiansToDegrees )).
lnstinct
methodsFor:
onne r : anRTSb j
ect
ouner := an&TS(bioct.
rith:diroction rith:1000 rith:5
0bject subclass: fAnglerRegion instanceYar
iableilms:' set'
@
w
i{ryrsl i{Hry$i{
螢 一躙饉一“一
@ @
-Arrav
8 一麟6
綱 一響 一︼ 一︼
一“ヨ”一墨
w w
' initial ize-release'
ヽヒ │=``ユ 二 二 三 二 」 三 二 二 三 三 二ニ 三 ニ ニニ ニ ニ 三こ こ二 ニ ニ三 二五ニニ````````1131`111`=│IL111=111`」 ニ三ニニ三二三二三二五EEEE`111単 ││111111111111111や Ξヨニニ三二三二二三二`│`ヨ ニ 五ニニ`````│“ ニニ ::::::::::::::::::ヨ 罵 FT',「 1■ ■「 :■ ::=====:=:======:==π 「 ==:iF==「 ====│=■ ==fT軍 ===買 「 :二
:ニ
:ニ
:こ
│`ヨ
│=│``│││``=LI`│“
:8三
::二 :二
:二::ヨ ::二 :二:ニ
││││││││:::二
││││││││:││││││││:二
:ニ :二
=ヽ
=``````││1111111, 争単│「 │ヤ
`■
1:二
重
c l assYar
i
ablellenps:
on mthodsFor
:'
「1111111111:111111111111111,111,,111111111,1111111111111itI11台
IIFI'1111,111111彎 │11単│││111111単 鸞幸 甲││1争 4111`:,1摯 ,.、 ‐ ニニL■ ・‐‐ ・薇=ヽ ●● 議■ヽさ ュ昌塾■ 「
111
[晉
=■
lI堂
:1,11111111i;」
111
111,11学 lド│11摯111:,111子 111111111:常
=ヽ
=ニ
■●
=“
出二■●
=“
“““
"
"
Iodel subclass: {fiealTimeSirulat ion
poolDictionaries: categorY:' Rea lTinP"SimuI at i on'
Angl erRegi
││]
“一J“一“
‐
︺ 摯 型 響
I Iニ
i nstarpeVar i ableilares :' simJ lat ion at i on0bj ect process cur rentT i me roons sca I e
s imu
I
npn i
tor
'
classVar iabldlanres:' Sim'
access i ng'
poolDictionaries: categprY
involve:aFloat
:'
"
RealTimeSimulat ion'
ltellpl
setあ :[:anAnglel(anAngle insi“
:aFloat) Rea I T i nres irru
ifTrue:[temp := anAngle]].
|
at i on tmthodsFor
:'
ini
t
i
a I i ze- re
I
ease'
^(tttp itti!)not def i nePl an
"sr"bclass should
involveAngle:aFloat
ltepl set do:[:anAnglel(anAngle inside:aFloat)
rocrns do: [ :aRoonl aRom p I an:
ifTrue:[temp := anAngle]]. ^tomp
sel
fl
def i reSta
AnglerRegion methodsFor
:'
rt i ndchecfu | e
addi ng'
^sel add: anAng I e
:=
self
involveAngle:(anAngle
f
involveAngle: (anArple
tenp2 : = sel
f
initialize
Itenpl tam2l
tqtpl
inplmnt'
' initial ize al I variables"
first)'
self setSinulation. currontTime:=
socond).
set
add: ( (anAnglo and: t€fipl
)
:= Set
rooNns
' initial
nec.
initial iz€. I initial ize.
RTSohject
and: tenpZ)
RTStal
AnglerRegion methodsFor:
0.
simulatior0bject := Set ner.
set remove:tdnpl ifAbsent:[]. set rffrove:tqrP2 iflrbsent : [].
ize'
setSirulat ion
initialize
simulation := self
set := Set nel. initial
startup self setSilllulation.
ize:anAngle
self defincPlan.
self defineStartingScheduie
set := Set ner. set
^self
add:anAngle startup:an:nteger self setSimulation.
AnglerRegion class
:"
instanceVar iablel{ames
procoss := [an:nteger timesRopeat:Eself moveAll.]] newProcess. process priority:(Processor userBackgroundPriority).
Angl erRegi
on
c
I
ass methodsFor
:
instance creation'
seif definePlan. self defineStarti円 驚 hedle. ^seif
nerOn: anAng I e
seif initialize:anAng:e
RealTirに Sinlulation methodsFor: 'private'
4M彙一型 ・
¨ 呻 岬 一攣
攣 一攣 ] 蝉
摯 攣 一弾 一蓼
攣 幽 一摯 一羹
墨“一題一“
菫一口螢一 聾
鏑 鶉 攣 撃
中 蝉 彎 中
rectanslo
top). l.
npve^ll
tl
l.
^000extent:(x0Y) currontTioE : = currentTimo+l. sim.rlat ior{bject do: [ :ar{bject lar{hject
tirc
^currentTinF
movel.
self
changed: finoved Rea I T
balTinesim,rlat ion motffiFor
:'
innsirrul at ion BEthodsFor
:'
task I anqlffi'
acoessing'
sqrce: arf,I$bject 'sence arfiIS(bject' s vier" I aPoint tcm(bjccts apoint := arfils(bjoct position. viot := arfiT$(bject vision. toflP(bjects := Set ner.
prooess prooess
procoss: aProcess
tem&jocts cur
procoss := aProcess
addAl t
:(
viel
I
(adTSbject
rentRoqr) i rf,Ebi tat ).
tcm(bjocts
addAl |
((arfiIlftject
:
cur rentRoqn) consi starrces ).
rooms
tembjocts r€spve: arnTs$j€ct. t€m{biocts := torn(bjects select: [ :ar0bject | (an6joct insideVicl:vier posi t i on:
"Ansrer tho current Plan"
aPoint
rooms
)
l.
-
term&jects im : [ :ol
asSortedCol lect
rtdbjects
:
o2
|
(ol
di starrco
:
aPo i nt
)
(ol distance:aPolnt) l.
"Ansrer the current rts(bjects" Rea I T i nteS i rnr
I
at i on nptho&For
:' button access'
^sirulat iorObject mnitor:aPoint ItqrPl
rtsPlan
t€lp := (sirnrlat ior$ject asSortodol loction:[:al :a2l ((41 position)aPoint )r < ((a2 position)-foint)l) at:1.
"Ansrer the current Plan" -pl
sca
an
(tenP -= rcnitor) ifTrue:[(npnitor isf,i | ) ifFalse:lmnitor c I ossilon i tor l.
le:aScale
scale := aScale
rcnitor := t€stF.
simllat ionArea
tenp npnitorirg.
lx vl
x := 0. y := 0. self rom
l
do: Rea
I
:aRoonl
aRocrn
mlls
do:
I
TispSirulat ion c lass instarrcoVar
iablefhs: "
a t
:afall I := x nax:(afall
Rea I T imosImuI
y
act ivoSirulat ion
x rectarule r idtt).
:= y max:(alall
at I on
c
Iass mthoGFor
:'
acc6s i ng'
襲彗瀬 曇
] 暉 ︼ ﹁
︺ 一 ︼ 彎
簗 攣 攣 彎
躙 撃輝躙
糧塾糠腱 ¨
彎
噸 …
^Sim
vier, RsalTimSimrlat ion class nptho&For
to coordinate the lir*s botroon thc mdel, ler. ln ordinary
and control
llsaso, tho rocoivcr is created and passed as the parmter to Vicrlcontrol lcr:
:' ex4le'
and the receiver's npdel and vier
exa|ple
arc sct
lirks
lp antmtically by the vier.'
exanple:arSIIi super
vier:
aVier.
aVier == nil
container planYler I rindot := Sche&lectindor nor.
I rindor
ifFalse: [sonsor := aYiel sensor]
ri rdor label :' Real t imeSim;lat ion' ri ndor mi n im.rrSi zo ;4lX)03{X}. container := CwositePart ner.
planYia := PlanYiel mdel :arflTS. planvi€il aspect:hved conta iner add:p anY i er borderedln I
RMall initialize
.
RTS(bject
:
initialize
(000
extent:101).
rindor cwoncnt : contairPr' rindor oen Roa I T inreS i mr
at i on
I
c
I
ass retlndsFor
:'
i
nstance
croat ion' ner
Sim :=
srper rw initialize'
-Sim
Cont ro I
I
rt i thteru gbc
o
I
ass
:
{P I anY i er0ont ro |
instarceYari*leilams: c
l
assVar iablellamos:
''
|
er
"
poolDictionaries: " cato@ry:' Roa lTimaSirulat ion'
Ier rptho&For
PlanVierControI
re6uttonlct
lsel
iv
f
i
:' nEru rcssa0es'
ty
scnsor re&rttorfressed]
tti
lcTrue:
[self poll. rndcl nronitor: (self sonsor cursorPoint)
l PlanVie*ontrol lsr rcthodsFor: ' accessirE
vl€r: avl€il "Controllerlvier: arc s€nt by Yiollcontrol
… 攣 攣
鶏鶏
― 岬 岬
﹃ 日 一鏑 一
彗 綸
:
︺ 一 摯 中
1翠
and Control lerlrrcdal
ler: in or&r