|
|
2016/2/7(Sun) 16:25:53|NO.74495
惑星の見かけの運動を再現したソフトを作りたいです。
どうやったら、円周上で点を動かせますか?
また、点から点への線の延長はどうやったら描くことができますか?
よろしくお願いします
|
|
2016/2/7(Sun) 17:16:37|NO.74496
点の描画はpsetでできますが、circleを使った方が見やすいと思います。
線の描画はlineでできます。
|
|
2016/2/7(Sun) 22:28:36|NO.74506
簡易的な動きなら円として表現できますが、どの程度精密な計算を
しているのかで回答も変わります。
|
|
2016/2/8(Mon) 07:15:56|NO.74507
こういう時に三角関数って使うものなのですか。
すごく難しそう
何とか作ってみます
|
|
2016/2/8(Mon) 07:24:42|NO.74509
なんかうまくいきません
#define RADIUS 100
#define O_POSX 300
#define O_POSY 260
#define STARRADIUS 10
repeat
x=cos(cnt)*RADIUS+O_POSX:y=sin(cnt)*RADIUS+O_POSY
color 0,0,0
circle x-STARRADIUS,y-STARRADIUS,x+STARRADIUS,y+STARRADIUS
wait 30
color 255,255,255
circle x-STARRADIUS,y-STARRADIUS,x+STARRADIUS,y+STARRADIUS
loop
|
|
2016/2/8(Mon) 07:44:45|NO.74510
こんな感じでどうですか?
#define RADIUS 100
#define O_POSX 300
#define O_POSY 260
#define STARRADIUS 10
repeat
color 255,255,255
boxf
color 0,0,0
x=cos(0.01*cnt)*RADIUS+O_POSX:y=sin(0.01*cnt)*RADIUS+O_POSY
color 0,0,0
circle x-STARRADIUS,y-STARRADIUS,x+STARRADIUS,y+STARRADIUS
await 5
loop
|
|
2016/2/8(Mon) 18:11:17|NO.74516
おー
ありがとうございます!
|
|
2016/2/8(Mon) 18:51:14|NO.74517
#define O_POSX 300
#define O_POSY 320
#define SUN_STARRADIUS 20
#define EARTH_RADIUS 100
#define EARTH_STARRADIUS 10
#define EARTH_SPEED 0.01
#define MARS_RADIUS 160
#define MARS_STARRADIUS 6
#define MARS_SPEED 0.0108
screen 0,600,600
repeat
redraw 0
color 255,255,255
boxf
color 0,0,0
circle O_POSX-SUN_STARRADIUS,O_POSY-SUN_STARRADIUS,O_POSX+SUN_STARRADIUS,O_POSY+SUN_STARRADIUS
pos earth_posx-10,earth_posy-30
mes "地球"
earth_posx=cos(EARTH_SPEED*cnt)*EARTH_RADIUS+O_POSX:earth_posy=sin(EARTH_SPEED*cnt)*EARTH_RADIUS+O_POSY
circle earth_posx-EARTH_STARRADIUS,earth_posy-EARTH_STARRADIUS,earth_posx+EARTH_STARRADIUS,earth_posy+EARTH_STARRADIUS
circle O_POSX-EARTH_RADIUS,O_POSY-EARTH_RADIUS,O_POSX+EARTH_RADIUS,O_POSY+EARTH_RADIUS,0
pos mars_posx-10,mars_posy-26
mes "火星"
mars_posx=cos(MARS_SPEED*cnt)*MARS_RADIUS+O_POSX:mars_posy=sin(MARS_SPEED*cnt)*MARS_RADIUS+O_POSY
circle mars_posx-MARS_STARRADIUS,mars_posy-MARS_STARRADIUS,mars_posx+MARS_STARRADIUS,mars_posy+MARS_STARRADIUS
circle O_POSX-MARS_RADIUS,O_POSY-MARS_RADIUS,O_POSX+MARS_RADIUS,O_POSY+MARS_RADIUS,0
line mars_posx,mars_posy,earth_posx,earth_posy
redraw 1
await 10
loop
https://www.youtube.com/watch?v=AiihBdsy2_0
この線を延長したいです。
| |
|
2016/2/8(Mon) 18:53:08|NO.74518
15分目あたりのところの、天球に投影するところを再現したいです。
|
|
2016/2/8(Mon) 19:36:22|NO.74521
|
|
2016/5/21(Sat) 01:10:16|NO.75534
>天球に投影
動画では3次元の空間でしたが、
NO.74517スクリプトのようになら
比較的簡単(簡単)な計算でできます。
1.あらかじめ投影したいY座標を決めておきます(仮にscreen_posy)
2.線を画面上にある1次関数のグラフとして考えます
3.傾き(仮にkatamuki)はdouble(earth_posy-mars_posy)/(earth_posx-mars_posx)
ただし、earth_posx=mars_posxの場合は除く、
その場合は、screen_posx=earth_posx
4.切片は(仮にseppen)はearth_posy-katamuki*earth_posx
5.切片と投影先Y座標の差(仮にsessa)は、
screen_posy-seppen
6.投影先X座標(screen_posx)は、
double(sessa)/katamuki
ただし、katamuki=0.0の場合は除く
このscreen_posx,screen_posyが天球上の座標になります。
さらに、天球上の座標から地球より火星が近ければ、見えることになります。
スクリプトはありますので、必要ならば投稿します。
|
|
2016/5/21(Sat) 07:12:05|NO.75535
本当ですか!
色々三角関数について勉強してみたのですが難しくて
スクリプト、お願いします
|
|
2016/5/21(Sat) 13:15:52|NO.75540
NO.74517のcircleからredraw 1までのところを置き換えてください。
screen_posy = 50
if earth_posx != mars_posx{
katamuki = double(earth_posy-mars_posy)/(earth_posx-mars_posx)
if katamuki != 0{
seppen = earth_posy-katamuki*earth_posx
sessa = double(screen_posy-seppen)
screen_posx = sessa/katamuki
}else{
screen_posy = earth_posy
screen_posx = 0
}
}else{
screen_posx = earth_posx
}
if (screen_posx - earth_posx)*(screen_posx - earth_posx)>(screen_posx - mars_posx)*(screen_posx - mars_posx){
line screen_posx,screen_posy,earth_posx,earth_posy
}
天球の理解を間違えたかもしれません。
間違いでしたらご指摘ください。
あとMARS_SPEEDのほうがEARTH_SPEEDより速いのは問題だと思います。
このスクリプトは、ご自由にどうぞ。
|
|
2016/5/21(Sat) 15:26:32|NO.75541
tds12さん、ありがとうございます。
ただ、惑星が外惑星を抜かす時の、天球上での逆行が再現できなかったので、
スペースさんのおっしゃった通り、atanで角度を求める方法をとることにしました。
#define O_POSX 300
#define O_POSY 320
#define SUN_STARRADIUS 20
#define EARTH_RADIUS 120
#define EARTH_STARRADIUS 8
#define EARTH_SPEED 0.016
#define MARS_RADIUS 150
#define MARS_STARRADIUS 5
#define MARS_SPEED 0.01
screen 0, 600, 600
repeat
redraw 0
color 255, 255, 255
boxf
color 255, 100, 0
circle O_POSX - SUN_STARRADIUS, O_POSY - SUN_STARRADIUS, O_POSX + SUN_STARRADIUS, O_POSY + SUN_STARRADIUS
color 0, 0, 200
circle O_POSX-EARTH_RADIUS, O_POSY - EARTH_RADIUS, O_POSX + EARTH_RADIUS, O_POSY + EARTH_RADIUS, 0
earth_posx = cos(EARTH_SPEED * cnt) * EARTH_RADIUS + O_POSX
earth_posy = sin(EARTH_SPEED * cnt) * EARTH_RADIUS + O_POSY
color 0, 0, 0
circle earth_posx - EARTH_STARRADIUS, earth_posy - EARTH_STARRADIUS, earth_posx + EARTH_STARRADIUS, earth_posy + EARTH_STARRADIUS
color 0, 0, 0
pos earth_posx - 10, earth_posy - 30
mes "地球"
color 0, 0, 200
circle O_POSX - MARS_RADIUS, O_POSY - MARS_RADIUS, O_POSX + MARS_RADIUS, O_POSY + MARS_RADIUS, 0
mars_posx = cos(MARS_SPEED * cnt) * MARS_RADIUS + O_POSX
mars_posy = sin(MARS_SPEED * cnt) * MARS_RADIUS + O_POSY
color 0, 0, 0
circle mars_posx - MARS_STARRADIUS, mars_posy - MARS_STARRADIUS, mars_posx + MARS_STARRADIUS, mars_posy + MARS_STARRADIUS
color 0, 0, 0
pos mars_posx - 10, mars_posy - 26
mes "火星"
rad = atan(mars_posy - earth_posy, mars_posx - earth_posx) //地球から見た火星の角度
mars_globe_posx = cos(rad) * (1000) + earth_posx //角度から線の先の座標を求める(長さは1000)
mars_globe_posy = sin(rad) * (1000) + earth_posy
color 0, 200, 0
line mars_globe_posx, mars_globe_posy, earth_posx, earth_posy //線を描画
redraw 1
await 10
loop
| |
|
2016/5/22(Sun) 19:38:37|NO.75552
ちょっと楕円にしてみるとか楽しそうですね
|
|