コミュニティアイコン プチコン 非公式コミュニティ プレイ日記

アバター
あまさとしおん ◆mzDKTVUAtwqE
2025/5/2 13:38
前回の投稿でしれっと書いた「野望」の方はこれです

求:太さのある直線を描画するプログラム

コメント

アバター
あまさとしおん 2025/5/2 13:39 ◆mzDKTVUAtwqE
プチコンからネット接続はできないので、事前にダウンロード&転送が必須ですが
現実の地図を表示できる作品はたぶん史上初でしょう
アバター
あまさとしおん 2025/5/2 13:41 ◆mzDKTVUAtwqE
Misskeyのほうでまめに書いていますが、この範囲で描画そのものは1秒(new3ds系)ほど(起動した瞬間のみ長めのデータ変換処理が入ります)
今後は塗りつぶしと線の太さを実装するので残念ながらもうちょっと遅くなります
アバター
あまさとしおん 2025/5/2 13:43 ◆mzDKTVUAtwqE
xmlはちゃんとパースしていなくて文字列検索でそれっぽく引っ掛けていますが、OSM本体でエクスポートする限り大丈夫そうです
アバター
あまさとしおん 2025/5/2 14:26 ◆mzDKTVUAtwqE
線描画、それっぽいのあった
https://x.com/lfo_whisper/status/979385006605844480
「細いと汚い」が気になるけど
アバター
あまさとしおん 2025/5/2 15:48 ◆mzDKTVUAtwqE
おきのどくですがトイレはきえてしまいました(描画順序処理未実装)
アバター
あまさとしおん 2025/5/2 16:27 ◆mzDKTVUAtwqE
indexが3個ぐらいあり作者混乱している
アバター
あまさとしおん 2025/5/2 17:06 ◆mzDKTVUAtwqE
線(ウェイ)には4個の識別子がある(1個はプチコンの配列添字としてはない)

1.xmlデータ上のid属性
これは大きな数でそのまま配列添字にできないので2.の番号に変換する
2.idの出てくる順にプチコンのために付けた添字
3.xmlデータ上の行番号 変数名RCLN
4.描画する順番になる番号 変数名LN

という感じ
正直2.は3.に統合してもいいと思う(あとから気づいた)
一方で、統合するとウェイとしては欠番になる番号がたくさん出る欠点がある(xmlの全ての行がウェイではないため)
アバター
あまさとしおん 2025/5/2 17:09 ◆mzDKTVUAtwqE
そもそもRCLNは最初は存在しなかったけど、高速化の過程で生まれたもの
PRGGETした文字列を描画更新(拡大率変更など)毎にパースすると大変無駄なので、起動時の1回だけ必要な要素を配列にしまっておくことにしたもの
アバター
あまさとしおん 2025/5/2 17:14 ◆mzDKTVUAtwqE
まあ、その
プチコン3号に連想配列が無いのが悪いという見方もできる
アバター
あまさとしおん 2025/5/2 18:29 ◆mzDKTVUAtwqE
もう1つの問題
塗りつぶしをするときに「内側の座標」を計算するんだけど、変な形の物(画像、notプチコン)はノードの座標の平均値を出すと事故る(内側ではない場所を塗り世界が真っ赤になる)
解決方法が分からない
アバター
あまさとしおん 2025/5/2 18:36 ◆mzDKTVUAtwqE
例の「変な形」だけなら全ノードではなく
「最初と終わりの2点ずつを結んだ四角形に対する平均」で行けそうな気がする
ただしそれ以外のものが逆に詰むかもしれない

追記:
「形がL型または凹型かどうかを検出して4点平均に切り替える」がわりと正解そう
(ところで、その検出アルゴリズムが思いつかないのですが)
アバター
あまさとしおん 2025/5/2 19:31 ◆mzDKTVUAtwqE
それにしても、ベクタ画像メーカーのついでの思い付きのくせして製作開始3日でこのぐらいできるの、自分すごい(自画自賛)

ちなみに、実用性はたぶんないです(最低でも1つの市を自由に見て回れるぐらいじゃないと地図の必要性がない、現状は数百m四方しか無理)
アバター
あまさとしおん 2025/5/2 19:38 ◆mzDKTVUAtwqE
形の検出アルゴリズム、要は頂点の角度を求める必要があるのか
面倒

ちなみに:
点線(破線)を描くDEFも欲しいけど、途中の頂点で間隔がリセットされないようなやつはさすがに無いよな…
アバター
あまさとしおん 2025/5/2 20:51 ◆mzDKTVUAtwqE
形というか内外判定その物っぽいやつ
https://www.nttpc.co.jp/technology/number_algorithm.html
ただ私には難しい話なのでゆっくり読む…

交差数判定がなんとなくわかったけど、判定したい図形の線を通るか見ないといけないのか
アバター
あまさとしおん 2025/5/2 20:59 ◆mzDKTVUAtwqE
内外判定というかノード座標の羅列からズバリ内側の点を出したいしなぁ
交差数判定で外だったら別の点を判定(→内になるまで繰り返し)をするのは場合によって試行回数が増えそうだし
アバター
あまさとしおん 2025/5/3 14:40 ◆mzDKTVUAtwqE
交差数判定よりもっと雑な方法を実装した

a:おそらく内側だろうと当たりを付けた座標を入れる変数
1.塗りつぶし前画像をキャッシュし、aに全ノード平均座標を代入
2.aに塗りつぶしを実行
3.(0,0)と(0,511)に色がついた?
yes→画像を巻き戻し、aにランダムな値を代入し、2.へ行く
no→処理終了(座標確定)
という方法

大多数は全ノード平均座標(最初のaの値)で当たっていて、少数の外れだけ求めればいいので可能な方法
aへのランダム値代入に最大試行数を設定している関係上、確率的に見つからないことがある(その場合は塗らない)

3.の判定は意味的には四隅を見るほうが正しい
アバター
あまさとしおん 2025/5/3 14:53 ◆mzDKTVUAtwqE
もちろん、あてずっぽうでループするのは重たいので一度確定した座標は変数にしまっておく(スクロール量を除外したピクセル単位で、拡大率を変更すると全破棄。スクロールによる再描画の時だけ使われる)

緯度経度値でキャッシュすれば拡大率変更しても使いまわせるんだけど実装上面倒なので…
アバター
あまさとしおん 2025/5/3 15:19 ◆mzDKTVUAtwqE
理想的なのは全てが軽快に動くことなんだけど、3DSとプチコンの性能の限度は超えられないので
起動時に十数秒待ってもらうことは許してもらう方向性

それにしても、カレント行番号が大きいほどPRGGET$がめちゃくちゃ遅くなるのは解決方法ないかな…
アバター
あまさとしおん 2025/5/3 16:18 ◆mzDKTVUAtwqE
作者も大混乱しているため、endifに説明文が書かれる事態が発生
アバター
あまさとしおん 2025/5/3 20:51 ◆mzDKTVUAtwqE
困ったことにスクロールも結構待つようになってしまった
直したい

コメントを書く

  • こちらは「プチコン3号」「プチコンBIG」など、プチコンシリーズに関する話題を扱ったコミュニティです
  • プチコンシリーズにまったく関係ない書き込みはご遠慮下さい。削除の対象となります
  • こちらにはその他のゲームや雑談のコミュニティはなく、作る予定もありません (ひとりで管理できないため)。ごめんなさい
  • ユーザー登録なしで書き込みができます
  • 秘密の合い言葉は成りすましの防止 (トリップ機能)、書き込みの編集時の本人認証に使用します
  • 秘密の合い言葉に他人に推測されやすい言葉、他サービスと同じパスワードは入力しないでください。
  • 書き込むと、投稿時に入力したお名前と秘密の暗号が記憶され、ログイン状態になります

- WEB PATIO -