参加型シミュレーションの開発に関する研究

Page 1

参加型 シミュレーシ ョンの開発 に関す る研究

響 囀 ︸ ¨ 岬 妬

中 囀 ﹃ 一 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を 返す。

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==

:「

=「

“ 一

‐― 一

¨ 中 一¨ 一︺

一 一一 一一 一

一 一一 一一 一︼

粗コ一コ一コ

│││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茇


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



Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.