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

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

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

コメント

アバター
あまさとしおん 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
困ったことにスクロールも結構待つようになってしまった
直したい
アバター
あまさとしおん 2025/5/3 23:19 ◆mzDKTVUAtwqE
原因判明。11ms×数十個分が乗っかっていた。バイパスして改善した

OSMビューアーとしてはそろそろ配信を考える(少なくともα版といえば納得される)出来になった
ただ1つの問題は、本来のベクタ画像メーカーとして動くかどうか分からないこと(魔改造しすぎたので)
アバター
あまさとしおん 2025/5/4 19:50 ◆mzDKTVUAtwqE
楽しーーーーい!
(トイレ埋没バグから目を背けながら)
アバター
あまさとしおん 2025/5/4 21:26 ◆mzDKTVUAtwqE
トイレを取り戻した
(草地を建物より先に入れ替える機能を実装)
アバター
あまさとしおん 2025/5/6 14:20 ◆mzDKTVUAtwqE
仮(建物を草地の上にするだけ)の描画順序システムを本来の仕様(layerの値を考慮)に改修する

3バイトの順序値を持ち

下から
種類による優先度
levelの値*
layerの値*

(*は下限-20から8bit範囲、つまり「-20〜235」に丸める)
という感じにする(当初は十進の桁でやる仕様にしていたが、ビット演算が使えないのが不便なので変えるつもり)
アバター
あまさとしおん 2025/5/6 14:21 ◆mzDKTVUAtwqE
種類優先度は
・建物などが+2
・道路などが+5(歩道は+7)
とりあえずこれだけ定める

levelの列挙(エレベーターなどにある「0;1;2」など)は最も右の値を採用する(処理上の便宜、本来は数字が最大のほうがいい)

順序値が同じである地物が重なっている場合、どちらが上に描かれるか、描画する都度入れ替わることも許される(処理上の便宜)
アバター
あまさとしおん 2025/5/6 14:28 ◆mzDKTVUAtwqE
layerを超える優先度を実装する場合、順序値に4バイト目を設けることができる
ただし、今のところ予定なし
アバター
あまさとしおん 2025/5/6 14:32 ◆mzDKTVUAtwqE
あっ
階数は0.5階があり得るので変えよう。3を掛けるか
アバター
あまさとしおん 2025/5/6 16:45 ◆mzDKTVUAtwqE
2進法の描画順序システム完成。
値×2+32を8bit範囲に丸めることにしました。
(中2階はよくある一方で、100階を超える建物はほぼ無いので)

つまり地下16階(level=-16)から中113階(level=111.5)まで対応します。

列挙も対応するが、範囲指定「0-5」は今のところ解釈に失敗します(単項マイナスと区別が面倒なので非対応)
アバター
おちゃめ 2025/5/10 22:59 ◆jH1opV6FnGyx
すでに解決済と思いますが参考としてプチコンmkIIの頃に書いたベクトルの外積を使った衝突判定を置いておきます。
多角形の内包判定は外積を使えば確実に分かるのですが演算量が多いので簡易処理で済ませるのも1つの手ですね。
アバター
おちゃめ 2025/5/10 23:02 ◆jH1opV6FnGyx
画像が縮小されすぎて文字が読めないので私のサイトのプチコン講座「ベクトルの内積・外積を使った衝突判定」から見てください。
http://ochameclub.web.fc2.com/petitcom/lecture.htm

コメントを書く

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

- WEB PATIO -