質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

3824閲覧

canvasで複数のテキストを回転

Karna554

総合スコア10

canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2020/05/10 11:59

前提・実現したいこと

現在HTMLのcanvasを勉強しています。
下の画像はAdobeXDのデザインデータで作ったデザインで、こちらを目標として色々試していますがrotateがうまく扱えません。

↓完成予定図
完成予定図

発生している問題・エラーメッセージ

rotateとtranslateを使用することはわかりますが、うまく目標に近づけることができません。
saveやrestoreなどもどこに書けばいいのか見当がつきません。

↓現状
現状

該当のソースコード

Javascript

1const brown_text_name = ['brown_a_1', 'brown_a_2', 'brown_c', 'brown_H', 'brown_i', 'brown_M', 'brown_p', 2'brown_P_1', 'brown_P_2', 'brown_s_1', 'brown_s_2', 'brown_T', 'brown_v']; 3 4// 茶色文字?の設定(X座標、Y座標、角度、フォントの種類&サイズ, 色, 出力文字) 5var brown_text = { 6 7 'brown_a_1' : {'pointX': 1044, 'pointY': 373, 'angle': 20,'font_size': '200px Fredoka One', 'color': 'rgba(88, 56, 34, 1)', 'value': 'a'}, 8 'brown_a_2' : {'pointX': 823, 'pointY': 427, 'angle': -20, 'font_size': '120px Fredoka One', 'color': 'rgba(88, 56, 34, 1)', 'value': 'a'}, 9 'brown_c' : {'pointX': 1087, 'pointY': 645, 'angle': 20, 'font_size': '120px Fredoka One', 'color': 'rgba(88, 56, 34, 1)', 'value': 'c'}, 10 'brown_H' : {'pointX': -58, 'pointY': 290, 'angle': 340, 'font_size': '330px Fredoka One', 'color': 'rgba(88, 56, 34, 1)', 'value': 'H'}, 11 'brown_i' : {'pointX': 1259, 'pointY': 754, 'angle': 20, 'font_size': '230px Fredoka One', 'color': 'rgba(88, 56, 34, 1)', 'value': 'i'}, 12 'brown_M' : {'pointX': 319, 'pointY': 74, 'angle': 20, 'font_size': '240px Fredoka One', 'color': 'rgba(88, 56, 34, 1)', 'value': 'M'}, 13 'brown_p' : {'pointX': 1381, 'pointY': 656, 'angle': -10, 'font_size': '200px Fredoka One', 'color': 'rgba(88, 56, 34, 1)', 'value': 'p'}, 14 'brown_P_1' : {'pointX': 669, 'pointY': -45, 'angle': -25, 'font_size': '350px Fredoka One', 'color': 'rgba(88, 56, 34, 1)', 'value': 'P'}, 15 'brown_P_2' : {'pointX': 1074, 'pointY': 113, 'angle': -25, 'font_size': '230px Fredoka One', 'color': 'rgba(88, 56, 34, 1)', 'value': 'P'}, 16 'brown_s_1' : {'pointX': 414, 'pointY': 496, 'angle': -30, 'font_size': '270px Fredoka One', 'color': 'rgba(88, 56, 34, 1)', 'value': 's'}, 17 'brown_s_2' : {'pointX': 312, 'pointY': 716, 'angle': -20, 'font_size': '120px Fredoka One', 'color': 'rgba(88, 56, 34, 1)', 'value': 's'}, 18 'brown_T' : {'pointX': 169, 'pointY': 178, 'angle': -20, 'font_size': '150px Fredoka One', 'color': 'rgba(88, 56, 34, 1)', 'value': 'T'}, 19 'brown_v' : {'pointX': 927, 'pointY': 311, 'angle': -20, 'font_size': '150px Fredoka One', 'color': 'rgba(88, 56, 34, 1)', 'value': 'v'}, 20 21}; 22 23$(document).ready(function() { 24 25 // TOP部分の描画コンテキスト取得 26 var canvas = document.getElementById('top_canvas'); 27 28 // 描画範囲設定 29 canvas.width = window.innerWidth; 30 canvas.height = 1900; 31 32 // コンテキスト取得 33 if (canvas.getContext) { 34 var context_brown = canvas.getContext('2d'); // 茶色文字用コンテキスト 35 } 36 37 context_brown.textAlign = "center"; 38 context_brown.textBaseline = "middle"; 39 40 context_brown.save(); 41 42 for (let i = 0; i <= brown_text_name.length-1; i++) { 43 44 var x = brown_text[brown_text_name[i]]['pointX']; 45 var y = brown_text[brown_text_name[i]]['pointY']; 46 context_brown.font = brown_text[brown_text_name[i]]['font_size']; 47 context_brown.fillStyle = brown_text[brown_text_name[i]]['color']; 48 49 // context_brown.translate(x, y); 50 // context_brown.rotate(brown_text[brown_text_name[i]]['angle'] * Math.PI / 180); 51 context_brown.fillText(brown_text[brown_text_name[i]]['value'], x, y); 52 // context_brown.rotate((brown_text[brown_text_name[i]]['angle'] * (-1)) * Math.PI / 180); 53 context_brown.restore(); 54 55 console.log(brown_text[brown_text_name[i]]['value'], x, y); 56 } 57}

試したこと

ソースコードのとおり描画するテキストを連想配列で定義し、for文で各値を連想配列から取得して描画しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

①save、restoreはfor文の中で、各文字個別にfont/fontSize/fillTextなどを与える前のコンテキストをsaveし、与え終わったら与える前のコンテキストにrestore(戻す)という感じかと思います。

②rotate, translateはfillTextする前に記述するのだと思います。
rotateは画面左上からなので、translateで文字の座標に回転の中心を変更してから、rotate
rotateし終わったら、座標を戻してからfillText

③あとは、angleプロパティを地道に直していけば、いい感じになると思います。

for文内のみ直せば、いいと思います。

javascript

1 for (let i = 0; i <= brown_text_name.length-1; i++) { 2 context_brown.save(); 3 4 var x = brown_text[brown_text_name[i]]['pointX']; 5 var y = brown_text[brown_text_name[i]]['pointY']; 6 context_brown.font = brown_text[brown_text_name[i]]['font_size']; 7 context_brown.fillStyle = brown_text[brown_text_name[i]]['color']; 8 context_brown.translate(x, y); 9 context_brown.rotate((brown_text[brown_text_name[i]]['angle'] * (-1)) * Math.PI / 180); 10 context_brown.translate(-x, -y); 11 context_brown.fillText(brown_text[brown_text_name[i]]['value'], x, y); 12 13 context_brown.restore(); 14 15 console.log(brown_text[brown_text_name[i]]['value'], x, y); 16 }

投稿2020/05/10 12:58

omori3

総合スコア274

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Karna554

2020/05/10 23:17

ありがとうございます。 無事解決しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問