HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
1215
ありす2つのtxtファイルで関連付けたラインの引き方8解決


ありす

リンク

2012/12/15(Sat) 13:09:03|NO.51168

再び質問させていただきますがよろしくお願いします

test.txtとtest2.txtの2つがあるとして、test.txtの内容は

A
A
A
B
B

test2.txtは

Z
X
C
V
N
とした場合、この2つのtxtファイルを使って
test.txtの1行目2行目3行目が"A"なのでtest2.txtの1行目2行目3行目を関連付け、
同じようにtest.txtの4行目5行目は"B"なのでtest2.txtの4行目5行目を関連付ける
図を作成したいと思っています

1
/ /|
1 2 3

2
/|
4 5

ずれていたら申し訳ありません。
このように図示したいと考えてますが、1-1,2-4間のように関連付けをして
ラインの引く、というところで詰まっております…何か良い書き方はあるでしょうか…


screen 0,1000,600,0,150,150 exist "test.txt" exist "test2.txt" if strsize=-1:mes "ファイルがありません!":stop //下段数字の描写 notesel test noteload "test.txt" count = 0 ct=1 a=100 b=50 randomize repeat notemax pos a-35,310 color 0,0,0 font "MS ゴシック",40 mes ct ct++ a=a+70 b=b+70 loop repeat notemax noteget target,cnt repeat notemax-cnt-1,cnt+1 noteget out,cnt if target=out : z=1 loop if z=0 : count++ z=0 loop //上段の数字の描写 ct2 = 1 v=0 repeat count color 255,0,0 pos v+340,50 mes ct2 ct2++ v = v + 200 loop //ライン描写 noteload "test2.txt" a = 100 repeat notemax color 0,0,0 line a-20,300,350,100 a = a+70 loop

自分なりに作ったコードはこのようになっています。
冗長な箇所などがあるかもしれませんが、よろしければご指摘お願いします。



この記事に返信する


@key

リンク

2012/12/15(Sat) 14:42:42|NO.51170

やっぱりtextの文法が悪いと思う
textに
A,Z,X,C
B,V,N

と書けばもっと楽にできるのでは
行ごとがグループで、一文字目は親、二文字目以降は関連付ける子
「,」で区切っていて、split関数で抜き出せる



YSR

リンク

2012/12/15(Sat) 16:49:25|NO.51174

>@keyさん
いや、test.txtがtest2.txtに対する「フィルタ」として機能する場合、
1ファイルに纏められない可能性もあるのでは?

ところでありすさん、例えば「1\n1\n2\n2\n1」(\nは改行)とtest.txtに書かれていた場合、

 ・1,2,5行目と3,4行目を纏めて考える(何行目でも同じ内容なら同じグループとして扱う)
 ・1,2行目と3,4行目と5行目を纏めて考える(同じ行内容でも連続していないと別扱い)

のどちらですか? 書くコードがそれで全然違ってくるので。



ありす

リンク

2012/12/15(Sat) 17:19:41|NO.51180

@keyさん、split関数について調べてみました。これならできそう、かもしれません
情報ありがとうございます。もう少し勉強してみます


YSRさん、お返事ありがとうございます。
そうですね、1ファイルにまとめるのは少し難しいです…自分で書き換えればいい話なんけども。
それと私が考えているのは前者の
 ・1,2,5行目と3,4行目を纏めて考える(何行目でも同じ内容なら同じグループとして扱う)
です。



YSR

リンク

2012/12/15(Sat) 17:49:56|NO.51185

>・1,2,5行目と3,4行目を纏めて考える
なら、どう考えても@keyさん式にデータを書いて、それを読み出す方向の方が楽
それも、test.txtもtest2.txtもあらかじめ用意するタイプなら尚更

「両方行数が多い or test2.txtの一行辺りのサイズが大きい から合体させるのが面倒」
というのなら、なんとかプログラム側で処理する必要がありそうですね……

例(例外処理省略Ver):

fontsize=40 :ysize=200 //test.txtを読み出し notesel buf :noteload "test.txt" ;行データの種類数・位置を取得 ;(仮に一行を64バイト、行数を500行程度までだとする) maxdatasize=notemax sdim linestr,64,maxdatasize sdim linepos,1024,maxdatasize dim linesize,maxdatasize datasize=0 repeat maxdatasize n=cnt :noteget getline,n flg=-1 repeat datasize if linestr(cnt)=getline :flg=cnt :break loop if flg=-1 { ;新規登録 linestr(datasize)=getline linepos(datasize)=str(n) linesize(datasize)=1 datasize+ } else { ;既出追加 linepos(flg)+=","+n linesize(flg)+ } loop //test2.txtを読み出し notesel buf2 :noteload "test2.txt" ;テキストを読み込みながら、『縦向き』で文字を表示+線引き ;(test.txt、test2.txtの一行は1文字だけだとする) screen 0,(fontsize*2)*maxdatasize,ysize :title "サンプル" font msgothic,fontsize,16 xpos=0 repeat datasize pos xpos*fontsize*2,0 mes linestr(cnt) linestrsize=strlen(linestr(cnt)) split linepos,",",gline for n,0,linesize(cnt) noteget getline,int(gline(n)) pos (xpos+n)*fontsize*2,ysize-fontsize mes getline getlinesize=strlen(getline) line (xpos+n)*fontsize*2+fontsize/4*getlinesize,ysize-fontsize,xpos*fontsize*2+fontsize/4*linestrsize,fontsize next xpos+=linesize(cnt) loop stop



YSR

リンク

2012/12/15(Sat) 17:51:45|NO.51186

・・・投稿してから、
>一行辺りのサイズが大きい

>一行は1文字だけ
が矛盾していることに気がついたorz
仕様も目的も割りと曖昧なので、以降の修正は他の人にお願いします



@key

リンク

2012/12/15(Sat) 19:39:59|NO.51193

screen 0,1000,600,0,150,150
oya="" sdim ko,50,50 mesx=10;描画ソート用 mesy=10;描画ソート用 //下段数字の描写 notesel buf ;noteload "test.txt" buf={"A,Z,X,C B,V,N"} repeat notemax noteget strn,cnt split strn,",",oya,ko;oyaに親、koに子を区切って入れる pos mesx,mesy : mes oya repeat stat-1;子の数でループ pos mesx+cnt*10,mesy+50 : mes ko(cnt) line mesx+4,mesy+17,mesx+cnt*10+5,mesy+50 loop mesy+=80 loop

textの文法を変えただけで驚きの完成の速さと短さ



@key

リンク

2012/12/15(Sat) 19:46:44|NO.51194

必要最低限にしてあるので使うなら好きに改変して下さい



ありす

リンク

2012/12/15(Sat) 22:18:45|NO.51200

@keyさん、YSRさん、本当にありがとうございます

txtファイルの文法1つでこんなにも変わるんですね…
とても参考になりました!



ONION software Copyright 1997-2023(c) All rights reserved.