はじめに
クラスタリングを覚えたのでなんかに応用してしてみたいと思った結果こうなりました。
定義
- Mapのサイズ
- 幅: 64
- 高さ: 32
- 部屋の数
- 2 ~ 9個をランダムに決定
- 使用したライブラリ
- ncurses v5.86.0
- rand v0.3
- クラスタリングアルゴリズム
- K-Means
実装内容
- マップの中に点をランダムにいくつか生成する
- 生成した点をクラスタリングする
- クラスタリングされた点の群から、最小のx,yを左上、最大のx,yを右下として四角く部屋とする
動作イメージ
点を生成
- 数値はlabelに相当します
- 数値の隣にドット(.)がついているのはそのラベルのセントロイドです

点をクラスタリング

クラスタリングした点から部屋のサイズを取得
- label内の点の最小のx,yが左上、最大のx,yが右下の四角い部屋を作成したいので、その値を取得
- ここでは、左上のx,yとそこからのwidthとheightを取得しています
部屋のサイズから、実際にマップに描画

問題点
- 部屋数を現在ランダムで決定しているので、クラスタリングが失敗するときがある
- K-Meansを用いているので、一応分割的ではあるが、斜めに分割されると、部屋が被るときがある
- これに関しては、点と点をうまく結ぶことで回避は可能
まとめ
- クラスタリングで部屋生成することができた
- 他のクラスタリング手法を使えばバリエーションも増やせそうに感じた