私は現在、JavaScriptの初心者であり、キャンバスを学んでいます。右から左に後ろに引いた場合、入力に負の数が表示される理由を誰かが説明するのではないかと思いました。長方形をどの方向に描いても、長方形の実際のサイズを表示することを積極的にする方法はありますか?
これがJSフィドルです。https://jsfiddle.net/asn6wzw4/2/
HTML
<form id="areaform">
<label for="wid">Width:</label>
<input id="wid" type="number">
<label for="hgt">Height:</label>
<input id="hgt" type="number">
<br/>
<label for="area1">Area:</label>
<output id="area"></output>
<br/>
<label for="perimeter1">Perimeter:</label>
<output id="perim"></output>
<br/>
<button onclick="getarea()" type="button">Get Area</button>
</form>
<div id="drawRectangle">
<canvas id="rectCanvas" width=500 height=500></canvas>
</div>
JS
var canvas, context, startX, endX, startY, endY;
var mouseClicked = 0;
function mouseUp(e) {
if (mouseClicked !== 0) {
mouseClicked = 0;
var pos = getMousePos(canvas, e);
endX = pos.x;
endY = pos.y;
drawRectangle();
}
}
function mouseDown(e) {
mouseClicked = 1;
var pos = getMousePos(canvas, e);
startX = endX = pos.x;
startY = endY = pos.y;
drawRectangle();
}
function mouseXY(e) {
if (mouseClicked !== 0) {
var pos = getMousePos(canvas, e);
endX = pos.x;
endY = pos.y;
drawRectangle();
}
}
function drawRectangle() {
var width = endX - startX;
var height = endY - startY;
var offsetX = (width > 0);
var offsetY = (height > 0);
document.getElementById("wid").value = width;
document.getElementById("hgt").value = height;
context.clearRect(0, 0, canvas.width, canvas.height);
context.beginPath();
context.rect(startX + offsetX, startY + offsetY, width, height);
context.fillStyle = "#88EF5E";
context.fill();
}
function getMousePos(canvas, evt) {
var rect = canvas.getBoundingClientRect();
return {
x: evt.clientX - rect.left,
y: evt.clientY - rect.top
};
}
function init() {
canvas = document.getElementById("rectCanvas");
context = canvas.getContext("2d");
canvas.addEventListener("mousedown", mouseDown);
canvas.addEventListener("mousemove", mouseXY);
canvas.addEventListener("mouseup", mouseUp);
}
init();
確かMath.abs()
に、結果の計算で使用するだけです。
var width = Math.abs(endX - startX);
var height = Math.abs(endY - startY);
その理由は、通常、最初に終点を使用して幅/高さを計算し、次に始点を差し引くためです。
START END
10 30
END - START = 20
ただし、開始点の前に終了点が開始すると、値が逆になります。
END START
2 10
END - START = -8
ABSを使用すると、値は関係なく正になります。
var ctx = c.getContext("2d");
var startX = 200, startY = 150, endX, endY;
ctx.font = "16px sans-serif";
window.onmousemove = function(e) {
endX = e.clientX;
endY = e.clientY;
var width = endX - startX;
var height = endY - startY;
var absWidth = Math.abs(width)
var absHeight = Math.abs(height);
ctx.clearRect(0,0,c.width,c.height);
ctx.strokeRect(startX, startY, width, height);
ctx.fillText("W: " + absWidth + " H: " + absHeight, 10, 20);
};
body {margin:0}
canvas {background:#ccc}
<canvas id=c width=400 height=300></canvas>
負のときに描画されないようにするだけの場合は、代わりに値を制限します。
var width = endX - startX;
var height = endY - startY;
if (width < 0) width = 0;
if (height < 0) height = 0;
長方形には0の値を使用できますが、その場合は描画手順をスキップすることをお勧めします。
if (width && height) /* draw rectangle */
注意:正しいマウス位置を計算するには、この回答を参照してください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加