|
|
2008/6/6(Fri) 23:08:51|NO.16476
ある座標をスタート地点とし、ある座標へとboxfを直線で行き渡らせるには
どうすれば求められるでしょうか。
教えてください!
|
|
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
|
|
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
|
|
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
|
|
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
もしかして、あのライン上を走るようにしたいのでしょうか?
|
|
2008/6/7(Sat) 00:31:51|NO.16486
たこさんのスクリプトでやってみたら出来ました。
ありがとうございます。
|
|
2008/6/7(Sat) 00:33:09|NO.16487
>もしかして、あのライン上を走るようにしたいのでしょうか?
そうです。
|
|
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
|
|