
おはようございます。
jquery初心者です。
現在、マウスが要素に入って来た位置と出る位置(上下左右)を検出して、
その方向に合わせてホバーエフェクトをするという物をガイド本に沿って制作しているのですが、
そこでのマウスの方向を検出する関数の説明(特に数学的な処理)が所々省略されていて、ほとんど分かりません。(;;)
おおまかな仕組みは、
switchを使用して、0,1,2,3と分岐させたpositionを作り、この値をマウスの方向を検出する関数で分岐させているといったものです。
マウスの方向を検出する関数は、は以下のようになっています。
function MouseDirection (event) {
var $el = $(event.currentTarget),
offset = $el.offset(),
w = $el.outerWidth(),
h = $el.outerHeight(),
/*この辺りが特に分からないです(;;)*/
x = (event.pageX - offset.left - w / 2) * ((w > h)? h / w: 1),
y = (event.pageY - offset.top - h / 2) * ((h > w)? w / h: 1),
direction = Math.round((Math.atan2(y, x) * (180 / Math.PI) + 180) / 90 + 3) % 4;
return direction;
}
三角関数を使用しているようですが、これもまた良く分かっていません(;;)
申し訳ないですが、お教え頂けると助かります。
No.1ベストアンサー
- 回答日時:
まずは
x = (event.pageX - offset.left - w / 2) * ((w > h)? h / w: 1),
置き換えると
x = (マウスの位置 - 要素の座標 - 要素サイズの半分) * ((w > h)? h / w: 1),
x = (要素の中心からの距離) * ((w > h)? h / w: 1),
x = (要素の中心からの距離) * 要素の縦横比(アスペクト比),
x = アスペクト比を考慮した円周上の点
※縦横が同じ比なら真円、異なれば楕円上の座標
つぎは
direction = Math.round((Math.atan2(y, x) * (180 / Math.PI) + 180) / 90 + 3) % 4;
direction = Math.round((Math.atan2(y, x) * (180 / 円周率) + 180) / 90 + 3) % 4;
direction = Math.round(ラジアン * (180 / 円周率) + 180) / 90 + 3) % 4;
direction = Math.round(角度 + 180) / 90 + 3) % 4;
この段階で、中心からの角度となりますが、負の値も含むので、180度足して正の値の角度にします
direction = Math.round(角度 ) / 90 + 3) % 4;
で/ 90で4方向に分け、+3で端数切り上げ
roundで四捨五入して% 4でふたたび4等分
※ここの計算はかなりくどいですね、なんでもっと簡単な式にしないのだろうか?
ご説明本当にありがとうございます。m(_ _)m
全く分からなかったのでこれでどのような仕組みか何となく分かりました。m(_ _)m
アスペクト比をかけるのはどういったような意味があるのでしょうか。
試しにアスペクト比を無くしても機能しました。
また、最後の+3で端数切り上げという事ですが、これをする事で0が3になり、1が0になり、2が1になり、3が2になりますが、
これをする事で、switchに返る数を調整しているという事でよろしいのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
MFCを使って、ひとつのkey(CStr...
-
「Cancel = True」とはどういう...
-
デジタル時計の時刻合わせの方...
-
Youtubeのバグ
-
マイページはどこを開くの
-
Outlookでこのような表示がされ...
-
エクセルのシート上に別のシー...
-
小さな表示窓の呼び方は
-
Javascript_submit()完了後に処...
-
[Java] Edgeでのアドレスバー非...
-
ウインドウを毎回同じ位置、大...
-
スクリプトって、何ですか?ど...
-
一定時間おきにアラームやポッ...
-
パソコンを起動させたら文字の...
-
スライドショーを全画面でなく...
-
サブウィンドウを常に最前面に...
-
5ちゃんねる
-
Outlookのエラー表示について
-
PDFを(htmlのように)無限に縦...
-
別フォームから戻ったときのイ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【VBA/HTML】特定のタグ要素に...
-
JavaScriptでクリップボードの...
-
ajax
-
JQuery、セレクトボックスをル...
-
モーダルウィンドウにおける処...
-
PL/Iについて、教えてください。
-
エクセルでタグの内容が取得で...
-
スプレッドシートのチェックボ...
-
bxSliderで動画をスライドごと...
-
VC++のデバッガでvectorの要素...
-
WebサイトのHTMLオブジェクトの...
-
(VBS) テキストファイル読込で...
-
lispについて質問です
-
ajaxで追加したdom要素にscript...
-
MFCを使って、ひとつのkey(CStr...
-
フォームで入力時自動で次の項...
-
[C++] vector<string> の各要素...
-
VBAでセル参照して要素の順番を...
-
離れている文字の色だけ同時に...
-
デジタル時計の時刻合わせの方...
おすすめ情報