ダーツ得点計算 2015 年 6 月 12 日 徐 丙鉄 方針:ハードディスクに習っ

2015 年 6 月 12 日
徐 丙鉄
方針:ハードディスクに習って、矢の当たった位置をトラックとセクタで指定する。
ダーツ得点計算
的の座標系
targetX, targetY
図 1: ディスクの構造。
(A) トラック
(B) (幾何学的)セクタ
(C) トラックセクタ
from: wikipedia
<!DOCTYPE html>
<html>
<head>
<style>
html, body{ margin: 0; padding: 0; }
.arrow{ position: absolute;
div タグで,角丸の半径を 50%として円を描き,
border: solid white 1px;
背景を塗りつぶす。position 絶対指定で left と top
background-color: red;
で位置を指定する。
width:20px; height: 20px;
border-radius: 50%;
}
</style>
</head>
<body>
<img src="darts.png">
<script>
var X0= 498; var Y0 = 477;
//的の中心座標
var targetR = [14, 59, 195, 216, 306, 365]; //的のトラックの半径
var N = 20;
//的のセクタの数
var sectorTheta = 360/20;
//1セクタ当たりの中心角
var diskWidth = 20;
//矢が当たった場所に描く円の直径
var degree = 180.0/Math.PI;
//クリックした位置の client 座標取得
function getClickedXY(event){
var x = event.clientX;
var y = event.clientY;
drawDisk(x,y)
calcTrackAndSector(x,y);
client 座標:client(ブラウザ)の左上隅を原点とした
座標。その他に screen(モニタの左上隅を原点とし
た座標)やドキュメントの左上隅を原点としたグロ
ーバル座標がある。グローバル座標は sclient 座標に
scrollLeft,scrollTop を加えて得る。
}
//クリックした点に赤丸を描く
function drawDisk(x,y){
var disk = document.createElement("div");
div 要素を生成し,
disk.className = "arrow";
デザインは arrow クラスとして css で
disk.style.left = (x-0.5*diskWidth)+"px";
指定。
disk.style.top = (y-0.5*diskWidth)+"px";
位置は style.left と style.top で指定。
document.body.appendChild(disk);
}
//クリックした点に対して、トラックとセクタを計算する
function calcTrackAndSector(x,y){
var targetX = x-X0;
// 的の中心を原点とする座標系
var targetY = Y0-y;
// y 軸は上を正とする
//的の中心からの距離 r を計算
var r = Math.sqrt(targetX*targetX+ targetY*targetY);
//track の計算
var track=10; //的外れを 10 とした
for( var i = targetR.length-1; i>=0; i--){
R = targetR[i];
if( r < R ){ track=i; }else{ break; }
}
θ=Math.atan2(y, x)
//セクタの計算
θ
//y 軸となす角度を計算
x
var theta = Math.atan2(targetX,targetY)*degree;
//alert("x=" + x + ", y=" + y + "r=" + r + ", track=" + track + ", theta=" + theta);
theta += 0.5*sectorTheta; //sectorTheta の半分だけ時計回りに加算
var sector = Math.floor( theta/sectorTheta );
alert("track="+track+", sector="+sector);
}
document.addEventListener("click", getClickedXY );
</script></body></html>
y
//クリックイベント登録
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Math/atan2
構文 Math.atan2(y,x) 説明:atan2 メソッドは、(x,y) 座標のシータ角を表す -PI から PI までの数値を返します。 これは、正
の X 軸から (x,y) 座標までをラジアン単位で表した逆時計回りの角度です。このメソッドへ渡す引数は、
y 座標が 一番目、x 座標が 二番目であることに注意してください。
atan2 は、x と y が分割されて渡され、atan は、それらの 2 つの引数の比率が渡されます。
atan2 は Math オブジェクトの静的なメソッドなので、自ら生成した Math オブジェクトのメソッドとしてでは
なく、常に、Math.atan2() として使用するようにしてください。
Math.atan2( ±0, x ) は、x < 0 に対しての ±PI を返します。
Math.atan2( ±0, x ) は、 x > 0 に対しての ±0 を返します。
Math.atan2( y, ±0 ) は、 y > 0 に対しての -PI/2
Math.atan2( ±y, -Infinity ) は、無限大 と y > 0 に対しての ±PI を返します。
Math.atan2( ±y, +Infinity ) は、 無限大 と y > 0 に対しての ±0 を返します。
Math.atan2( ±Infinity, +x ) は、無限大 と x に対しての ±PI/2 を返します。
Math.atan2( ±Infinity, -Infinity ) は、±3*PI/4 を返します。
Math.atan2( ±Infinity, +Infinity ) は、±PI/4 を返します。
Math.atan2( ±0, -0 ) は、±PI を返します。
Math.atan2( ±0, +0 ) は、±0 を返します。