2010-12-02 7 views
18

私はキャンバスでグラフを描いており、y軸が「後方」であるという事実に苦しんでいます。原点は左上隅にあり、増加する値は上方向ではなく下になります。HTML5 Canvasでは、y軸を下ろすのではなく上にすることはできますか?

(0,0)   (x,0)  (0,y)^
     +-------------->    | 
     |       | 
     | CANVAS     |  INSTEAD 
     | DOES THIS    |  OF THIS 
     |       | 
     |       +-----------------> 
(0,y) v      (0,0)    (x,0) 

translate()を使用して原点を左下隅に移動できます。

context.translate(0, canvas.height); 

私はscale()を使ってy軸を反転できることを知っています。

context.scale(1, -1); 

これは、テキストが逆さまに表示されることを除いて、動作するようです。キャンバスの座標を私の予想どおりに動作させる方法はありますか?

答えて

10

より近代的なセットアップのために、あなたはcontext.transform(1, 0, 0, -1, 0, canvas.height)を使用することができます。これはy軸を反転させ、キャンバス全体を1画面分移動させます。利用可能な変換の

より: ​​

+0

ちょっとした注意 - マウスのロジックを処理している場合は、マウスイベントのポインタの位置を反転する必要があります。 –

+0

Tom、マウスイベントのポインタ位置をどうやって逆転させますか? –

10

私はあなたがそれに慣れるのにはるかに良いと思います。原点は左上にあり、ほとんどのピクセルベースのビデオ/スクリーンAPIがあります。

Here's a discussion on the subject

+1

は、それはかなり混乱します。 –

+2

それはあなたがそれについて数分間考えると、それほど紛らわしいことではありません。実際には、右>左(多くの人間の言語には当てはまらない)という受け入れられた知恵よりもはるかに恣意的ではありません。パラダイムは、左上隅が分かっており、すべての値がそこから外れることです。これは、何かが任意のサイズのスクリーンやドキュメントの中にレンダリングされたときに実際に数えられる唯一のものなので、論理的です。 – joshstrike

+2

*文書*はここのキーワードですと思います。画面は、テキストまたはデカルトグラフを表示するために使用されているかどうかに応じていずれかの方法で表示できます。 *上のコーナーで起源を持つことが多い理由は、**ドキュメント**がほぼすべての人間言語(下から上への移動はほとんどありません)でトップからボトム、トップからボトムに移動するためです。 HTMLは文書のコンセプト(したがってDOM)に基づいているため、HTML5のキャンバスはこの規約に従います。ピクセルベースではありません。 – LarsH

5

プロットgraph_height - y

例:http://jsfiddle.net/nVUUM/

<canvas></canvas> 

<script> 
var e = document.getElementsByTagName('canvas')[0]; 
var c = e.getContext('2d'); 

function plot(x,y) { 
    c.fillRect(x, e.height-y, 5, 5); 
} 

plot(100,50); 
plot(200,100); 
</script> 
+0

私はこのアプローチを取ってきましたが、しばらくすると、y座標を含むすべての呼び出しでそれを行う必要があり、非常に面倒で、エラーが発生しやすく、不必要に煩雑です。私はむしろむしろ使用するhttp://stackoverflow.com/a/33499668/423105 – LarsH

0

それはあなたが私はこれを試み、それが最初では動作しませんでした.scaleを置く場所によって異なります。あなたはmoveTo()の間に.scaleを置く必要があります。どこ `下> top`バウンディングボックスを持っているものの

ctx.arc(50,50,50,0,2*Math.PI); ctx.moveTo(50,50); ctx.scale(1,-1); ctx.lineTo(50,100); ctx.stroke();

関連する問題