私は2 ellipsesを持っており、それらの重なりを検出する必要があります。ここで 2つの楕円の重なりを計算する
は二つの円の間の重複を検出する例である、と私は楕円のために似たような探しています: 楕円の場合var circle1 = {radius: 20, x: 5, y: 5};
var circle2 = {radius: 12, x: 10, y: 5};
var dx = circle1.x - circle2.x;
var dy = circle1.y - circle2.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < circle1.radius + circle2.radius) {
// collision !
}
縦軸上の私の半径が2倍であるので、私は同じ変数を持っています
var oval1 = {radius: 20, x: 5, y: 5};
var oval2 = {radius: 12, x: 10, y: 5};
// what comes here?
if (/* condition ? */) {
// collision !
}
var result = document.getElementById("result");
var canvas = document.getElementById("canvas");
var context = canvas.getContext("2d");
// First eclipse
var eclipse1 = { radius: 20,
x: 100,
y: 40 };
// Second eclipse
var eclipse2 = { radius: 20,
x: 120,
y: 65 };
function have_collision(element1, element2)
{
var dx = element1.x - element2.x;
var dy = element1.y - element2.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance <= element1.radius + element2.radius) {
return true;
}
else {
return false;
}
}
function draw(element) {
// http://scienceprimer.com/draw-oval-html5-canvas
context.beginPath();
for (var i = 0 * Math.PI; i < 2 * Math.PI; i += 0.01) {
xPos = element.x - (element.radius/2 * Math.sin(i)) * Math.sin(0 * Math.PI) + (element.radius * Math.cos(i)) * Math.cos(0 * Math.PI);
yPos = element.y + (element.radius * Math.cos(i)) * Math.sin(0 * Math.PI) + (element.radius/2 * Math.sin(i)) * Math.cos(0 * Math.PI);
if (i == 0) {
context.moveTo(xPos, yPos);
} else {
context.lineTo(xPos, yPos);
}
}
context.fillStyle = "#C4C4C4";
context.fill();
context.lineWidth = 2;
context.strokeStyle = "#FF0000";
context.stroke();
context.closePath();
}
function getMousePos(canvas, evt) {
var rect = canvas.getBoundingClientRect();
return {
x: evt.clientX - rect.left,
y: evt.clientY - rect.top
};
}
canvas.addEventListener('mousemove', function(e) {
var mousePos = getMousePos(canvas, e);
eclipse2.x = mousePos.x;
eclipse2.y = mousePos.y;
result.innerHTML = 'Collision ? ' + have_collision(eclipse1, eclipse2);
context.clearRect(0, 0, canvas.width, canvas.height);
draw(eclipse1);
draw(eclipse2);
}, false);
draw(eclipse1);
draw(eclipse2);
result.innerHTML = 'Collision ? ' + have_collision(eclipse1, eclipse2);
#canvas {
border: solid 1px rgba(0,0,0,0.5);
}
<canvas id="canvas"></canvas>
<p id="result"></p>
<code>distance = Math.sqrt(dx * dx + dy * dy);</code>
私はそれが本当にうまくいかないと思うか、あなたを理解できません。あなたはここであなたの数式を試すことができます:https://jsfiddle.net/rodriguevb/c60aefwn/ – Rodrigue
非常に素晴らしいフィドル!私は自分の答えを更新しました。私はあなたの半径がY方向の半径であると最初は考えていましたが、私は今あなたのフィドルでX方向にあり、Y座標は半分になっています。したがって、式には '4 * dy * dy'が必要です。私はあなたのフィドルを使用し、私の答えに更新版を入れました。 – trincot
ありがとうございました!それは今、完璧に動作します。問題は解決しました! – Rodrigue