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


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
0606
Quiet目的座標への行き方9解決


Quiet

リンク

2008/6/6(Fri) 23:08:51|NO.16476

ある座標をスタート地点とし、ある座標へとboxfを直線で行き渡らせるには
どうすれば求められるでしょうか。
教えてください!



この記事に返信する


panda

リンク

2008/6/6(Fri) 23:28:48|NO.16478

質問の意味が理解できそうで、理解できないので、質問の意味を質問します(苦笑

ある地点(x,y)からある地点(x',y')に移動したい…ならわかるのですが、

その後の文
・boxfを使って
・直線でいきわたらせる

…という部分があるために、意味が良くわからないです。
もう少し具体的にしたいことを書いてください。



onclick gosub *click x = 30 y = 30 stop *click title "始点:("+x+","+y+") 終点:("+xd+","+yd+")" xd = mousex yd = mousey color 0,0,0 : boxf : color 255,255,255 boxf x,y,xd,yd color 255,0,0 line x,y,xd,yd return



たこ

リンク

2008/6/6(Fri) 23:50:04|NO.16480

たしかに何が聞きたいのか分かりませんが予想で答えてみる


randomize sx = 0 : sy = rnd(480) ex = 640 : ey = rnd(480) a = 1.0*(sy-ey)/(sx-ex) b = sy-a*sx repeat color 255,255,255 : boxf color 255 line sx,sy , ex,ey mx = mousex : my = mousey if sx < mx & mx < ex { px = mx : py = a*mx+b color ,,255 boxf px-5,py-5 , px+5,py+5 } await 20 loop



KENTA

リンク

2008/6/6(Fri) 23:52:47|NO.16481

>ある座標をスタート地点とし、ある座標へとboxfを直線で行き渡らせる
2つの座標どうしを直線で結ぶということですか?
そういうことならば、grectを利用するとできます。

//左クリックでA地点(赤)を、右クリックでB地点を変更します。 //分かりやすいように... #define x 0 #define y 1 dim PosA,2 :dim PosB,2 onclick *click title "クリックしてください" stop *click //座標の変更 if wparam=1 :PosA=mousex,mousey //A地点の座標 (x,y) if wparam=2 :PosB=mousex,mousey //B地点の座標 (x,y) title "A地点 ("+PosA.x+","+PosA.y+") B地点 ("+PosB.x+","+PosB.y+")" Angle=atan(PosA.y-PosB.y,PosA.x-PosB.x) box_size=sqrt((PosA.x-PosB.x)*(PosA.x-PosB.x)+(PosA.y-PosB.y)*(PosA.y-PosB.y)) color 255,255,255 :boxf //A地点描画 color 255 :circle PosA.x-10,PosA.y-10,PosA.x+10,PosA.y+10 //B地点描画 color ,,255 :circle PosB.x-10,PosB.y-10,PosB.x+10,PosB.y+10 //A地点とB地点をつなぐ color :grect (PosA.x+PosB.x)/2,(PosA.y+PosB.y)/2,Angle,box_size,15 stop



Quiet

リンク

2008/6/6(Fri) 23:55:40|NO.16482

例えば、


screen 0,500,350 x=100 repeat color 255,255,255:boxf color 200,200,200:line 100,100,400,100 color 100,100,100 circle 100-5,100-5,100+5,100+5 circle 400-5,100-5,400+5,100+5 pos 80,110:mes "START":pos 385,110:mes "GORL" color 0,0,0:boxf x-5,100-5,x+5,100+5 x+:if x>=400:x=100 redraw 1:await 10:redraw 0 loop

このような形であれば目的地(GORL)に着くことができますが、


screen 0,500,350 x=100.00:y=100.00 repeat color 255,255,255:boxf color 200,200,200:line 100,100,420,241 color 100,100,100 circle 100-5,100-5,100+5,100+5 circle 420-5,241-5,420+5,241+5 pos 50,110:mes "START "+100+","+100+"":pos 390,251:mes "GORL "+420+","+241+"" color 0,0,0:boxf x-5,y-5,x+5,y+5 x+=0.6 y+=0.3:if (y>=241)or(x>=420):y=100:x=100 redraw 1:await 10:redraw 0 loop

このように目的地が微妙に複雑な座標だったら、とすれば実数で行うしかありません。
ですがフリーハンドで求めようとすると絶対にずれてしまうのです。
どうすれば・・・?



飛角

リンク

2008/6/7(Sat) 00:24:30|NO.16483

たこさんのスクリプトが答えになっていると思いますが…

screen 0,500,350 sx=100:sy=100 ex=420:ey=241 a=1.0*(sy-ey)/(sx-ex) b=sy-a*sx px=sx repeat py=a*px+b color 255,255,255:boxf color 200,200,200:line 100,100,420,241 color 100,100,100 circle 100-5,100-5,100+5,100+5 circle 420-5,241-5,420+5,241+5 pos 50,110:mes "START "+100+","+100+"":pos 390,251:mes "GORL "+420+","+241+"" color 0,0,0:boxf px-5,py-5,px+5,py+5 if (py>=241)or(px>=420):py=100:px=100 redraw 1:await 10:redraw 0 px++ loop



panda

リンク

2008/6/7(Sat) 00:26:07|NO.16484

このように無理やり補正できますが…


sx = 100 ; スタート sy = 100 ex = 456 ; ゴール ey = 321 x = sx : y = sy repeat redraw 0 // 背景 color 255,255,255:boxf:color 0,0,0 pos 10,10 mes "始点("+sx+","+sy+")" mes "終点("+ex+","+ey+")" mes "\n("+x+","+y+")" line sx,sy,ex,ey // 描画 pos sx,sy mes "★" pos x,y mes "★" pos ex,ey mes "★" // 判定加算 if (x < ex){ x++ } if (x > ex){ x-- } if (y < ey){ y++ } if (y > ey){ y-- } redraw 1 wait 1 loop

もしかして、あのライン上を走るようにしたいのでしょうか?



Quiet

リンク

2008/6/7(Sat) 00:31:51|NO.16486

たこさんのスクリプトでやってみたら出来ました。
ありがとうございます。



Quiet

リンク

2008/6/7(Sat) 00:33:09|NO.16487

>もしかして、あのライン上を走るようにしたいのでしょうか?
そうです。



flory

リンク

2008/6/7(Sat) 00:51:11|NO.16488

せっかくプログラミングしてるんだから、計算を駆使しましょう。

#define xx1 100.0 ;スタートx座標 #define xx2 420.0 ;ゴールx座標 #define yy1 100.0 ;スタートy座標 #define yy2 241.0 ;ゴールy座標 #define frame 200.0 ;ここで指定したフレーム数で到達 screen 0,500,350 x=xx1 : y=yy1 repeat redraw 0 color 255,255,255 : boxf color 200,200,200 : line xx1,yy1,xx2,yy2 color 100,100,100 circle xx1-5,yy1-5,xx1+5,yy1+5 circle xx2-5,yy2-5,xx2+5,yy2+5 pos 50,110 : mes "START "+int(xx1)+","+int(yy1)+"" : pos 390,251 : mes "GORL "+int(xx2)+","+int(yy2)+"" color 0,0,0 : boxf x-5,y-5,x+5,y+5 x+=(xx2-xx1)/frame y+=(yy2-yy1)/frame if (y>=yy2)or(x>=xx2) : y=yy1 : x=xx1 redraw 1 await 10 loop



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