プレイ日記
moh6an moh6an
32bit整数配列を二値で読み書きする関数を作りたい
12そうだね
プレイ済み
返信[1]
親投稿
moh6an moh6an
横幅は32ドット単位で制御するの二値画像制御用に「INT2BIT」とか言う関数を作りたいので構想を練る、定義とかにツッコミがあったらくださいな。 DEF INT2BIT(配列名,書込値(0か0以外),幅w,x,y) 二値、dot座標書き込み用 DEF BIT2INT(配列名,出力値(trueORfalse),幅w,x,y) 二値、DOT読み出し用
0そうだね
プレイ済み
返信[2]
親投稿
moh6an moh6an
幅DOTは32ドット単位で切り捨て、配列名の要素数で割られて2次元配列として機能する。
0そうだね
プレイ済み
返信[3]
親投稿
moh6an moh6an
となると、どう書けばいいんだろ? DIM 高さ=LEN(配列名)/(幅*32) DIM Bit桁数=X%32余り DIM 対象配列要素数=FLOOR(X/32)+(X*Y) 配列[対象配列要素数]=配列[対象配列要素数] XNOR (1<<bit桁数) ・・・・でいいのかな?実装してみよう・・・
0そうだね
プレイ済み
返信[4]
親投稿
moh6an moh6an
DIM 高さ=LEN(配列名)/(幅*32)←まちがい DIM 高さ=LEN(配列名)/FLOOR(幅/32)ですね。
0そうだね
プレイ済み
返信[5]
親投稿
moh6an moh6an
懸念点:3DSの上画面が400ピクセルなので32で割り切れない
0そうだね
プレイ済み
返信[6]
親投稿
moh6an moh6an
となると、8dot*4dotの方が良いのだろうか・・・これなら割り切れるし 計算が分からない感はある。
0そうだね
プレイ済み
返信[7]
親投稿
moh6an moh6an
幅と高さを指定してしまう様にするか・・・そんでもって勝手に要素数を揃えちゃうように・・・・できるか?
0そうだね
プレイ済み
返信[8]
親投稿
moh6an moh6an
となると DEF INT2BIT(配列,入力値,x,y,w,h)でスッキリしそう そんでw*hに合わなかったらPUSH/POPで強制的に合わせちゃうとか wは8倍数切り捨て、hは4倍数切り捨て
0そうだね
プレイ済み
返信[9]
親投稿
れい rei-nntnd
何をしたいのかわからん…
1そうだね
プレイ済み
返信[10]
親投稿
れい rei-nntnd
Booleanの配列が欲しいなら普通に ARRAY%[i>>5]AND(1<<(i%32)) みたいな感じじゃだめなんか 2次元配列にしたいならi=x+y*wとしておけばよくて。 GSAVEやGLOADつかえないけど。 そういうことじゃないの?
4そうだね
プレイ済み
返信[11]
親投稿
moh6an moh6an
んーんー、ちょ・・・ちょっと理解が追いついてないです。 ARRAY%[i>>5]あたりが、 「普通に」そういうワンライナーが思いつかないのです・・・orz 要求としては ・省メモリ目的で整数値帯域をみっちり使ったBOOLEAN配列が欲しい ・入力XY値は実XY座標を入力したい ・ただ、割当が横32ドット*高さ1単位だとなんか不便かな?とかおもっている。 ・GSAVE/GLOAD対応は不要 こんなところです。
1そうだね
プレイ済み
返信[12]
親投稿
moh6an moh6an
あーなるほどi<<5は32で割るということか!!
1そうだね
プレイ済み
返信[13]
親投稿
moh6an moh6an
逆だったorz1>>5
1そうだね
プレイ済み
返信[14]
親投稿
moh6an moh6an
なるほど!!れいさんのでトピ立て時点の仕様が満たせてる!!
1そうだね
プレイ済み
返信[15]
親投稿
ツララ LongIceSword
要するに1ドットのARGBとかの色情報を全部捨ててモノトーンにする代わりに情報を保持する範囲をw8×h4みたく32の約数の幅に拡充した自前のGSAVEやGLOAD命令を作りたいって事ですよね? 色情報と範囲のトレードオフみたいな。 用途としてはマスクなのかな?
0そうだね
プレイ済み
返信[16]
親投稿
moh6an moh6an
そーす、二値の画像なら情報量少なくていいなとかおぼろげに、 用途としてはエアブラシの上限フラグとか、縦横4倍解像度の二値画像レイヤとか考えてます。メモリが足りなくなっているのですが。juhsyにまだ表示スプライトが400*240エリアまるまる手付かずなので、 8*4にして4*4の16ドット単位で処理すれば縮小時のアンチエイリアスの計算もしやすいかな・・と、そんなことをつらつらと。
0そうだね
プレイ済み
返信[17]
親投稿
moh6an moh6an
実数型って64ビット論理演算できましたっけ? できたら8*8が行けそうな・・・
0そうだね
プレイ済み
返信[18]
親投稿
moh6an moh6an
れいさんのを使用するならドット単位の入出力は座標変換だけですね。これを書かねば。
0そうだね
プレイ済み
返信[19]
親投稿
れい rei-nntnd
遅いよ?
0そうだね
プレイ済み
返信[20]
親投稿
moh6an moh6an
たしかにビット毎に配列アクセスになるのはありますね、それだけだと遅いかも。 ただ4*4単位にしておけば、おそらく大半のアクセスを占めるであろう全ビット同じの処理を16or32ドット一括で処理できそうな気がします。他に問題点とかありそうですか?
0そうだね
プレイ済み
返信[21]
親投稿
れい rei-nntnd
やっぱりわからない… 全ドット同じ処理でドット当たりの情報量が1ビットならそれはSetかClearかXORしかないのでは?
0そうだね
プレイ済み
返信[22]
親投稿
moh6an moh6an
え?、その手が使えるのでそれでいいと思いますが。 4×4ビットのフラグの立った個数で表示濃度を16段階で表示したらいいと思ったのです、これを32×1ドットで割り当てたら縦方向だと配列要素をまたがる事になり煩雑かなと感じたので。
0そうだね
プレイ済み
返信[23]
親投稿
moh6an moh6an
座標計算はれいさんのに倣うなら Array%[((y*w)>>2)+(x>>3)] and 1>>((y%4)>>3)+(x%4)+(floor((x%8)<<2)>>2))とか・・ (可読性が著しく低下した計算(;´Д`)) (下手なことしないで32*1で良いような気がしてきた)
0そうだね
プレイ済み
返信[24]
親投稿
moh6an moh6an
ドット単位の計算することは線を引くとか計算量の少ないものばかりなので 8*4で格納するのと32*1で格納して濃度計算をする場合に配列読み出し4回をしなきゃいけないのとどっちが早いのか自信がなくなってきた・・・・(;´Д`)
0そうだね
プレイ済み
返信[25]
親投稿
れい rei-nntnd
濃度ってなんだ… ビット深度のこと? ドットとピクセルの違いがわからん
0そうだね
プレイ済み
返信[26]
親投稿
moh6an moh6an
濃度は二値レイヤの出力不透明度のつもりでいいました。 ドットは二値配列の点単位 ピクセルは画面に出力する際の単位として使ってたのですが・・・ 認識これで合ってますかね?
0そうだね
プレイ済み
返信[27]
親投稿
れい rei-nntnd
全然わからない…orz Booleanを作ったのにその1ビットと画面の1ピクセルが対応していないの? ドットとビットとの違いは? moh氏難しいことしようとしてる?
0そうだね
プレイ済み
返信[28]
親投稿
moh6an moh6an
自分の認識では ビットとドットが1:1で対応してて配列1要素に対して 前述画像の配置で並ばせようとしていると思ってください 拡大していない通常の解像度に於いて 4*4ドットで画面の1ピクセルで表示しようとしてます。 画面の1ピクセルに出力する濃度は(実際にはα値を経由しますが) 仮に黒0,0,0だとすると0,0,0から255,255,255まで4*4ドット内のビットが1の個数で決定(つまり0/16~16/16まで17段階)します。
0そうだね
プレイ済み
返信[29]
親投稿
れい rei-nntnd
ビット=コンピューターの情報の最小単位。0か1かの情報を持つ ドット=表示デバイスの最小単位。輝点一つ。 ピクセル=色相彩度明度など、色を構成する情報を持つ最小単位。
1そうだね
プレイ済み
返信[30]
親投稿
moh6an moh6an
あぁ・・・ドットの認識自分間違ってるか・・・
0そうだね
プレイ済み
返信[31]
親投稿
れい rei-nntnd
その4x4というのはなんで4x4の2次元なの? 4x4で1ピクセルなら16bitで1ピクセルじゃだめなの? 1の個数をいちいち考えるなら、 初めから1の個数を記録しておいたらダメ? 4bitあれば0~15まで16段階表現できる。 16bitの1/4で情報量はほぼ同じ。
0そうだね
プレイ済み
返信[32]
親投稿
moh6an moh6an
通常解像度において、ドットは直接的には表示に関係してこないので 使わないほうが良かったのかも・・・
0そうだね
プレイ済み
返信[33]
親投稿
moh6an moh6an
拡大したときに二値で表示したいのです。
0そうだね
プレイ済み
返信[34]
親投稿
moh6an moh6an
内部的には400*240の縦横4倍解像度1200*960の二値画像として記録しておきます。
1そうだね
プレイ済み
返信[35]
親投稿
れい rei-nntnd
拡大縮小の話をしてるのか。 縮小が簡単なpixelあたり1bitの画像の持ち方を考えている、 ということね
1そうだね
プレイ済み
返信[36]
親投稿
moh6an moh6an
重いかもしれない・・・・あとtouchの座標精度が良くないので 座標の計算どうしようかと言うのはありますね。
0そうだね
プレイ済み
返信[37]
親投稿
moh6an moh6an
関数は呼び出しコストがかかりますし、れいさんのお陰で1行に収まったので めでたしめでたし。(←実装しろよ
0そうだね
プレイ済み
返信[38]
親投稿
れい rei-nntnd
配列アクセス激重だし、更新するときには読んで書かなきゃいけないので そのあたりまとめて分離しておいた方が早いと思うよ。 あと、縮小して使う場合が多いなら深度4bitで保存しておいて、 それに追加で情報を載せる手もあるが。
0そうだね
プレイ済み
返信[39]
親投稿
moh6an moh6an
えぇ、1ドット単位のGPSETに相当するアクセスは前述の通りで楽観的に考えてます(細い線は範囲狭いので計算量も配列経由でも少ないかと) 広い範囲ならFILLとcopyが使えるので32画素いっぺんに処理できるところは 使えそうです。まぁ無理だったら2*2の4階調に落とします。
0そうだね
プレイ済み
返信[40]
親投稿
moh6an moh6an
juhsyの座標を整数値で保持してたデメリットにやっと気がつく。 (誤差が蓄積して拡大回転時に座標がずれてた)
0そうだね
プレイ済み