キャンバスで長方形のネガティブドローイングを停止するにはどうすればよいですか?

logan26

私は現在、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();
user1693593

確か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]

編集
0

コメントを追加

0

関連記事

分類Dev

長方形をキャンバスの中央に配置するにはどうすればよいですか

分類Dev

HTML5キャンバスの長方形にスクロールバーを追加するにはどうすればよいですか?

分類Dev

ストロークの色を設定してキャンバスに長方形を描画するにはどうすればよいですか?

分類Dev

ネガティブルックビハインドが期待どおりに機能しない.2番目のグループが文字列をキャプチャしないようにするにはどうすればよいですか?

分類Dev

回転したキャンバスにラバーバンド選択長方形を正確に描画するにはどうすればよいですか?

分類Dev

キャンバスに描かれた長方形にイベントリスナーを追加するにはどうすればよいですか?

分類Dev

JavaScriptキャンバス内の他のすべての長方形の上に長方形を配置するにはどうすればよいですか?

分類Dev

wpfで長方形の高さを変更した後、キャンバス上の長方形を再配置するにはどうすればよいですか?

分類Dev

雄弁でlaravelを使用したネストされたイーガーローディングを使用して、別のテーブルで外部キー名を取得するにはどうすればよいですか?

分類Dev

ユニティのワールド単位でキャンバスを特定のサイズに設定するにはどうすればよいですか?

分類Dev

matplotlibのプロットキャンバス内に可変長ティックラベルを配置するにはどうすればよいですか?

分類Dev

ネイティブRubyバインディングを使用してGEOSをインストールするにはどうすればよいですか?

分類Dev

Androidブロードキャストをテストするときに、バンドルを追加で含めるにはどうすればよいですか?

分類Dev

HTMLキャンバスのテキストの周りに長方形を描くにはどうすればよいですか?

分類Dev

HTMLキャンバスのテキストの周りに長方形を描くにはどうすればよいですか?

分類Dev

lineCapプロパティをキャンバスに追加するにはどうすればよいですか?

分類Dev

長方形または円弧を使用してキャンバスで重力をエミュレートするにはどうすればよいですか?

分類Dev

オブジェクト指向プログラミングを使用せずに、tkinterでキャンバスオブジェクトのサイズをウィンドウサイズに変更するにはどうすればよいですか?

分類Dev

スイングパネルのテキストフィールドを拡大するにはどうすればよいですか?

分類Dev

フローティングIPの背後でdockerswarmモードマネージャーを使用するにはどうすればよいですか?

分類Dev

マウスのドラッグに合わせてHTMLキャンバスの長方形のサイズを変更するにはどうすればよいですか?

分類Dev

スクロールバーをキャンバスの高さまで埋めるにはどうすればよいですか?(グリッドベース)

分類Dev

キャンバスに複数の半透明の長方形を描画するにはどうすればよいですか?

分類Dev

キャンバスの長方形の下に画像を移動するにはどうすればよいですか?

分類Dev

複数の長方形を一度にキャンバスに描画するにはどうすればよいですか?

分類Dev

角が丸いtkinterキャンバスの長方形を作成するにはどうすればよいですか?

分類Dev

Cocoaバインディング、テキストフィールドにバインドされたデフォルトの文字列値。この文字列をプログラムで読み取るにはどうすればよいですか?

分類Dev

ログインマネージャのキーボードレイアウトを変更するにはどうすればよいですか?

分類Dev

ログインマネージャのキーボードレイアウトを変更するにはどうすればよいですか?

Related 関連記事

  1. 1

    長方形をキャンバスの中央に配置するにはどうすればよいですか

  2. 2

    HTML5キャンバスの長方形にスクロールバーを追加するにはどうすればよいですか?

  3. 3

    ストロークの色を設定してキャンバスに長方形を描画するにはどうすればよいですか?

  4. 4

    ネガティブルックビハインドが期待どおりに機能しない.2番目のグループが文字列をキャプチャしないようにするにはどうすればよいですか?

  5. 5

    回転したキャンバスにラバーバンド選択長方形を正確に描画するにはどうすればよいですか?

  6. 6

    キャンバスに描かれた長方形にイベントリスナーを追加するにはどうすればよいですか?

  7. 7

    JavaScriptキャンバス内の他のすべての長方形の上に長方形を配置するにはどうすればよいですか?

  8. 8

    wpfで長方形の高さを変更した後、キャンバス上の長方形を再配置するにはどうすればよいですか?

  9. 9

    雄弁でlaravelを使用したネストされたイーガーローディングを使用して、別のテーブルで外部キー名を取得するにはどうすればよいですか?

  10. 10

    ユニティのワールド単位でキャンバスを特定のサイズに設定するにはどうすればよいですか?

  11. 11

    matplotlibのプロットキャンバス内に可変長ティックラベルを配置するにはどうすればよいですか?

  12. 12

    ネイティブRubyバインディングを使用してGEOSをインストールするにはどうすればよいですか?

  13. 13

    Androidブロードキャストをテストするときに、バンドルを追加で含めるにはどうすればよいですか?

  14. 14

    HTMLキャンバスのテキストの周りに長方形を描くにはどうすればよいですか?

  15. 15

    HTMLキャンバスのテキストの周りに長方形を描くにはどうすればよいですか?

  16. 16

    lineCapプロパティをキャンバスに追加するにはどうすればよいですか?

  17. 17

    長方形または円弧を使用してキャンバスで重力をエミュレートするにはどうすればよいですか?

  18. 18

    オブジェクト指向プログラミングを使用せずに、tkinterでキャンバスオブジェクトのサイズをウィンドウサイズに変更するにはどうすればよいですか?

  19. 19

    スイングパネルのテキストフィールドを拡大するにはどうすればよいですか?

  20. 20

    フローティングIPの背後でdockerswarmモードマネージャーを使用するにはどうすればよいですか?

  21. 21

    マウスのドラッグに合わせてHTMLキャンバスの長方形のサイズを変更するにはどうすればよいですか?

  22. 22

    スクロールバーをキャンバスの高さまで埋めるにはどうすればよいですか?(グリッドベース)

  23. 23

    キャンバスに複数の半透明の長方形を描画するにはどうすればよいですか?

  24. 24

    キャンバスの長方形の下に画像を移動するにはどうすればよいですか?

  25. 25

    複数の長方形を一度にキャンバスに描画するにはどうすればよいですか?

  26. 26

    角が丸いtkinterキャンバスの長方形を作成するにはどうすればよいですか?

  27. 27

    Cocoaバインディング、テキストフィールドにバインドされたデフォルトの文字列値。この文字列をプログラムで読み取るにはどうすればよいですか?

  28. 28

    ログインマネージャのキーボードレイアウトを変更するにはどうすればよいですか?

  29. 29

    ログインマネージャのキーボードレイアウトを変更するにはどうすればよいですか?

ホットタグ

アーカイブ