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


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
1128
KIRYUd3arrow,d3boxなどの回転について。6解決


KIRYU

リンク

2013/11/28(Thu) 17:42:51|NO.58509

平面座標回転演算

d3rotate x1, y1, x0, y0, va

x1, y1 : 出力値が返る変数 [double]
x0, y0 : 回転させる元のベクトル値
va : 回転させる角度 [rad](プラグイン / モジュール : d3module)


平面上のベクトル (あるいは位置) x0, y0 を、原点を中心に va [ラジアン] 回転させたベクトルを求めます。計算結果は、x1, y1 で指定した変数に代入されます。

角度は、ラジアン単位 (2π ≒ 6.2831853 を一回転とする角度単位) で入力します。

F1ヘルプにはこう書いていますが、中三の理解範囲は超えています。
どなたか、わかりやすく教えていただけませんでしょうか。
何を、学べばこれを理解できるか、でもかまいませんので。

自分でできることは自分でやるつもりです。
よろしくお願いします。


前スレでd3arrow,d3box…の使い方について質問させていただきました。
そこに書き込もうと思ったのですが、新しい質問と言うことで新しいスレとさせていただきました。



この記事に返信する


FunnyMaker

リンク

2013/11/28(Thu) 18:38:22|NO.58510

>何を、学べばこれを理解できるか、でもかまいませんので。

三角関数・ベクトルの理解と応用が必須です。
一般的な校高の学習ペースだと、2年生の前期頃には完了するかと思います。


>中三の理解範囲は超えています。どなたか、わかりやすく教えていただけませんでしょうか。

明らかに中3の範囲は超えていますね。
範囲を超えている以上、「分かりやすく」というのは残念ですが不可能かと思われます。
三角関数・ベクトルを一切持ち出さずに中3の範囲で3次元空間における演算をするとなると、三角関数・ベクトルを用いるよりもかえって多くの労力が必要になり、非効率です。数学では、途中をすっ飛ばして先を論じることは出来ません。


>自分でできることは自分でやるつもりです。

その姿勢は素晴らしいです。大切にしてください。
現時点で三角関数・ベクトルを独学でマスターするというのも不可能ではありませんが、中3という時期も考えると、困難を極めるでしょう。おすすめはしません。(しかし、高校に入る前に高校数学を習得している人が居るのも事実なので(同じクラスに居ました(笑))、希望はあります。)
三角関数・ベクトルの理解(のみならず応用)のためにはさらに低レベルの数学的なことを数多く使いこなせるようになる必要があります。

しかし、校高に入って、数学を最低でも人並にはやっていけば、きっと分かるようになります。心配はいりません。
今焦って中途半端に事を急ぐより、今後2年かけてじっくりやっていく方が、質の高いものを目指せると思います。



kiryu

リンク

2013/11/28(Thu) 19:51:28|NO.58512

FunnyMakerさん、非常に丁寧なお返事、ありがとうございます。
高2ですか、、先は長いですね(⌒-⌒; )

三角関数はすこしかじったことがありますが、独学に限界を感じてしまって。
FunnyMakerさんのおっしゃる通り、じっくりとやって行こうと思います。

平面をじっくりと学んで行こうと思います。まだまだ平面すらもしょぼしょぼですので・・・。
どうも、ありがとうございました。



ショーグン

リンク

2013/11/28(Thu) 19:55:50|NO.58513

後追い失礼します。

>FunnyMakerさん
確かにそのとおり。いずれは理論をしっかり勉強して、
なぜこのようになるのか、を考えてみて頂きたいです。
が。

>KIRYUさん
動かしながら、勉強できるのがHSPなのに
動かすために勉強が必要、ではアレですよね。
サンプルを見てみても、初心者向けではなかったです。(sample08_ballでしたか?)

d3rotateは2次元座標を基本として使うものと思ってください。
その上で、以下を読んで見てください。

#include "d3m.hsp" repeat ; 画面クリア color 0,0,0 boxf ; d3rotate "回転"命令 ; (一周を256等分) ; d3rotate x,y,0,160,3.14 * 2 / 256 * val val++ if val=256 :val=0 ; 座標描画 color 255,255,255 pos 0,0 mes x :mes y ; 動く点描画 color 128,255,192 bx=320+x :by=240+y boxf bx,by,bx+8,by+8 ; val値描画 pos bx,by mes "val="+val await 34 loop

ボクも数学的なことを説明するのは
困難を極めるので、あくまで命令の説明にとどめますが、

実行すると、回転する点と、座標が表示されるはずです。
なんとなく数学的でない、イメージとしての説明にとどめますが、

サンプル中の
d3rotate x,y,0,160,3.14 * 2 / 256 * val
これは、
1、 グラフにしたときの「中心点(0,0)」から「点P(0,160)」まで線を引き、
2、 (0,0)を中心に回転させるもので、
(x,y)に代入される値は、回転した後の、点Pの座標になります。
3.14 * 2 / 256 * val 左は
π(円周率)=3.14として、
一周(2π)を、256個に割り(/256して)、
val= 1~255 の範囲の値で一周を制御しようというものです。
数学的な事情で反時計回り制御になります(笑)

(サンプルの点が、255(から0に変わる)位のときにちょうど一周している
ことからもわかると思います。)


正直、完璧な説明はボクには無理です。
ベクトル、という概念を高校数学の数B?でやると思います。
詳しくはそこで頑張って勉強して見てください。



KIRYU

リンク

2013/11/28(Thu) 20:43:07|NO.58514

ショーグンさん、お返事ありがとうございます。
こちらの返事が遅れて申し訳ありません。
スクリプトのサンプルをありがとうございます。
なんとな〜・・・くですが、わかりました。
皆さんのおっしゃる通り、
詳しくは、高二になってから頑張ろうと思います。
#include "d3m.hsp"

repeat

; 画面クリア
color 0,0,0
boxf

; d3rotate "回転"命令
; (一周を256等分)
;
d3rotate x,y,0,160,3.14 * 2 / 256 * val

val++
if val=256 :val=0

; 座標描画
color 255,255,255
pos 0,0
mes x :mes y

; 動く点描画
color 128,255,192
bx=320+x :by=240+y
boxf bx,by,bx+8,by+8

; val値描画
pos bx,by
mes "val="+val

await 34
loop
これについてはショーグンさんのご説明と照らし合わせながら、勉強してみようと思います。

みなさん、改めてありがとうございました。



GENKI

リンク

2013/11/28(Thu) 22:14:47|NO.58515

一周は2πラジアンだから計算式はえーと…と考え無くていいです。度(弧度法)のままで考えていいんです。
でも単位が違うので使う時は単位を変換する計算は必要です。
HSPではこれを意識しなくても簡単に変換できるマクロdeg2radとrad2degが用意されています。
どちらも角度を表す数字で単位が違うだけなのです。変換はマクロに投げちゃいましょう。


三角関数はよく分からなくても何とかなったりもしますが、ベクトルはそうは行きません。
ベクトルを修得するならまず2次元(平面)から入ってください。2次元と3次元はほとんど同じなので簡単な方から入ってください。
習得はは基本レベルなら難しくありません。必ず図で説明してるサイトを見てください。図が重要です。
数字を使った計算いりませんし。sin,cosナニソレ?なレベルで大丈夫です。
中学生でも実用レベル(ゲーム作成に利用できるレベル)の知識は習得できると思います。


ショーグンさんのサンプルをもう少し理解しやすい?ように書き換えてみました。

;--ここから無視してください-------------------------------- #module ; 矢印描画モジュール #deffunc arrow int x1, int y1, int x2, int y2 t = sin(deg2rad(15)) x = double(x2-x1) / 10.0 y = double(y2-y1) / 10.0 xx = x * cos(t) - y * sin(t) yy = y * cos(t) + x * sin(t) line x1, y1, x1+xx, y1+yy xx = x * cos(-t) - y * sin(-t) yy = y * cos(-t) + x * sin(-t) line x1, y1, x1+xx, y1+yy line x1, y1, x2, y2 return #global ;--ここまで無視してください-------------------------------- #include "d3m.hsp" ;見やすい位置に移動するために、描画位置をX方向にcx、 ;Y方向にcyだけ平行移動しています。 ; 中心座標 cx = ginfo_winx/2 cy = ginfo_winy/2 ; 長さ rr = 160 repeat redraw 0 ; 画面クリア color 0,0,0 boxf ; d3rotate "回転"命令 ; 一周は360度。 ; 「ベクトル(0,rr)」を1度ずつ回転させます。 ; d3rotate x,y, 0,rr, deg2rad( deg ) ; 回転角を1度増やす deg++ if val=360 :val=0 ; 座標軸描画 color 127,127,127 line 0,cy,ginfo_winx,cy line cx,0,cx,ginfo_winx circle -rr+cx, -rr+cy, rr+cx, rr+cy, 0 pos cx, cy+rr : mes "+X" pos cx+rr, cy : mes "+Y" color 255 arrow 0+cx, rr+cy, cx, cy pos ginfo_cx+10, ginfo_cy-30 : mes "回転する元のベクトル" ; 回転後のベクトル(矢印)を描画 color 128,255,192 bx = cx+x : by = cy+y ;boxf bx-4,by-4,bx+4,by+4 ;line bx, by, cx, cy arrow bx, by, cx, cy ; val値描画 pos bx,by+10 mes "deg = "+deg+" [度]" mes "x="+x : mes "y="+y redraw 1 await 34 loop



check

リンク

2013/11/29(Fri) 07:23:29|NO.58521

GENKI氏のスクリプトの中で氏が意図していないであろう挙動をする部分があった。

; 回転角を1度増やす deg++ if val=360 :val=0
ここのif val=360:val=0をif deg=360:deg=0にすると、
おそらくGENKI氏の意図したように表示されるはず。



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