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


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
0913
暇人hsplet3でgradfが使えるように同等の命令を実装してみる1解決


暇人

リンク

2012/9/13(Thu) 22:55:28|NO.49354

gradfを使用時にline命令で裏画面に完成させてgcopyで表に描画(個別IDを作り登録)
再度サイズ、モード、色が同じ設定が使われた場合
既に完成されてるのをコピーする

#module "mod_gradf" #define gradf_bufid 1234 //バッファID(適当なIDから使用開始) #undef gradf #deffunc gradf int p1,int p2,int p3,int p4,int p5,int p6,int p7 if f=0 {sdim ppp,12*1000:f=1}//1000個まで保持 pp=str(( (p3*65536) | p4 + ( (p6<<1) - p7 ) ) <<1 | $80000000 | p5) //サイズ、モード、色で固有のIDを作る(本当に固有IDになってるかは不明) i=instr(ppp,0,pp) //既に登録されてるか検索 sizx=abs(p3) sizy=abs(p4) if p3<0 {x=p1+p3}else{x=p1} if p4<0 {y=p2+p4}else{y=p2} if i<0{//登録無し id_bak=ginfo(3) buffer gradf_bufid+idmax,sizx,sizy memset ppp,' ',12,12*idmax memcpy ppp,pp, strlen(pp),12*idmax+12-strlen(pp)//ID登録 c1_rgb=p6 c2_rgb=p7 c1_r=peek(c1_rgb,2) c1_g=peek(c1_rgb,1) c1_b=peek(c1_rgb,0) r=peek(c2_rgb,2)-c1_r g=peek(c2_rgb,1)-c1_g b=peek(c2_rgb,0)-c1_b if p5 { d=1.0/sizy repeat sizy,(p4<0) color d*r*cnt+c1_r,d*g*cnt+c1_g,d*b*cnt+c1_b if p4>0 {line sizx,cnt,0,cnt}else{line sizx,sizy-cnt,0,sizy-cnt} loop }else{ d=1.0/sizx repeat sizx,(p3<0) color d*r*cnt+c1_r,d*g*cnt+c1_g,d*b*cnt+c1_b if p3>0 {line cnt,sizy,cnt,0}else{line sizx-cnt,sizy,sizx-cnt,0} loop } gsel id_bak i=idmax idmax++ if idmax=1000 {idmax=0}//登録が1000超えたら最初に戻す }else{//登録有り i/12 //ID一つが12文字なので } pos x,y gcopy gradf_bufid+i,0,0,sizx,sizy return #global
モジュールをmod_gradf.hspって名前で保存したとして
使用例

#cmpopt optprm 0 //HSP3.31RC1なら必要ないみたい #runtime "hsplet3" #include "mod_gradf.hsp" repeat 5 rgb(cnt)=(rnd(256)<<16) +(rnd(256)<<8)+rnd(256) loop repeat 3 xy(cnt)=10+rnd(10)*30 loop repeat redraw 0 repeat 30 gradf rnd(400),rnd(300),xy(rnd(3)),xy(rnd(3)),rnd(2),rgb(rnd(5)),rgb(rnd(5)) loop redraw 1 await 15 loop



この記事に返信する


暇人

リンク

2012/9/15(Sat) 07:33:22|NO.49362

instrで11文字の文字列検索するのと
配列に数値入れてループ回して検索は
どっちが早いか気になった

i=instr(ppp,0,pp)
これと
repeat idmax
if pp=ppp(cnt){i=cnt:break}
loop

これでは、instrの方が早い
但しIDを文字列に変換するコストがあるから実際には二つ以上からinstrの方が早い
10個以上になるとループを回すよりinstrの方が2、3倍早い


後NO.49354のにはちょっと間違いがあった

> pp=str(( (p3*65536) | p4 + ( (p6<<1) - p7 ) ) <<1 | $80000000 | p5) //サイズ、モード、色で固有のIDを作る(本当に固有IDになってるかは不明)


pp=str(( (((p3*65536) | p4) + ( (p6<<1) - p7 ) ) <<1) | $80000000 | p5) //サイズ、モード、色で固有のIDを作る(本当に固有IDになってるかは不明)
に修正
 | より + が優先度高いのを忘れてた・・・



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