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

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

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

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

Q&A

解決済

1回答

318閲覧

解像度が変わっても表示できるようにしたい。

P5_USER

総合スコア73

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

0グッド

0クリップ

投稿2017/08/21 03:08

###前提・実現したいこと
キーボードで表示(矢印の色や向き)が変わるプログラムを作成しています。

  • T:緑色
  • t:黒色
  • 9:赤色
  • ↑:画面中央方向
  • ↓:画面外側方向

###発生している問題・エラーメッセージ
画面の解像度を変えると表示されなくなりました。
0. 1920×1080:表示された
0. 1280×720:表示されなかった

###該当のソースコード
※キーボードで変化が見られるのは,先に挙げた5つのキーだけになっています。
※他の割り当てられたキーや変数はa()のように別タブで作成して使用しています。

int dW , dH , dW30 , dW15 , dW10 , dH30 , dH15 , dH10 ; int DoRaP = 1, DoRaR = 1, DoRaY = 1, DaT = 1, tcg = 0, tcr = 0, pcg = 0, pcr = 0, rcg = 0, rcr = 0, ycg = 0, ycr = 0; float alpha , beta , p , q , r , theta , phi , psi , dv , dh; void setup() { size(displayWidth, displayHeight);//ディスプレイデータを取得しフルサイズを描写範囲とする frameRate(60);//フレームレートを設定 } void keyPressed() {//今後消去する予定 switch(key) { case 'w': DoRaP = 1; break; case 's': DoRaP = -1; break; case 'd': DoRaY = 1; break; case 'a': DoRaY = -1; break; case 'p': pcg = 0; pcr = 0; break; case 'P': pcg = 255; pcr = 0; break; case '6': pcg = 0; pcr = 255; break; case 'r': rcg = 0; rcr = 0; break; case 'R': rcg = 255; rcr = 0; break; case '5': rcg = 0; rcr = 255; break; case 'y': ycg = 0; ycr = 0; break; case 'Y': ycg = 255; ycr = 0; break; case '8': ycg = 0; ycr = 255; break; case 't': tcg = 0; tcr = 0; break; case 'T': tcg = 255; tcr = 0; break; case '9': tcg = 0; tcr = 255; break; } switch(keyCode) { case RIGHT: DoRaR = 1; break; case LEFT: DoRaR = -1; break; case DOWN: DaT = 1; break; case UP: DaT = -1; break; } } void draw() { background(0, 0, 0);//黒色背景 smooth();//滑らかな描写 stroke(0, 255, 0);//線の色:緑 fill(0, 255, 0);//充填の色:緑 global_variable();//グローバル変数の呼び出し scale(1, -1);//x軸右側正&y軸上側正 translate(dW/2, -dH/2);//画面中央に原点移動 a(); }
void global_variable(){ dW=displayWidth; dH=displayHeight; dW30=dW/30; dW15=dW/15; dW10=dW/10; dH30=dH/30; dH15=dH/15; dH10=dH/10; }
void a() { float diagonal = sqrt(dW^2+dH^2);//How long 対角線? stroke(tcr, tcg, 0); for (int i=1; i>=-1; i=i-2) {//縦軸対象に鏡写し for (int ii=1; ii>=-1; ii=ii-2) {//横軸対象に鏡写し scale(i, ii); rotate(atan2(dH, dW));//描写画面の対角線の角度にx軸を回転 translate(30*diagonal, 0); line(2*DaT*dW30, 0, -DaT*dW30, 0);//右上矢印基線 line(2*DaT*dW30, 0, DaT*dW30, dH15/3);//右上上側線 line(2*DaT*dW30, 0, DaT*dW30, -dH15/3);//右上下側線 translate(-30*diagonal, 0);// rotate(-atan2(dH, dW));//回転させたx軸を元に戻す scale(i, ii); } } stroke(0, 0, 0); }

###試したこと
strokeWeight()を設けて線の太さを変えてみました(Tweakモードで確認)が,
2.での解像度では変化が見られませんでした。
しかし,1.の解像度では確り線の太さが変わっていました。
何が問題なのかがつかめない状況です。
###補足情報(言語/FW/ツール等のバージョンなど)
Processing3.3.5を使用しています。

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

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

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

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

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

guest

回答1

0

ベストアンサー

a()という関数の定義に誤りがあります

1.対角線の長さが異常
定義で使用されているdiagonalという変数の値が
あなたの期待されるような対角線の長さになっていません
dW = 1920
dH = 1080
だと対角線の長さは2203くらいになるはずですが
float diagonal = sqrt(dW^2+dH^2);で代入される値は
30.854498です

xの2乗を計算したい場合
x^2という計算式は使えません
(^は累乗演算子ではなくビットXOR演算子です)
pow(x,2)もしくはsq(x)と書くのが正しいやり方です

ですので
diagonalの代入式
float diagonal = sqrt(dW^2+dH^2);を
float diagonal = sqrt(sq(dW)+sq(dH));
としてみてください

もしくは距離を求める関数をつかって
float diagonal = dist(0,0,dW,dH);
と(0,0)と(dW,dH)の距離を求めて
代入してもよいです

2.矢印の移動距離が異常
diagonal が本来より小さい値なので無理矢理
translate(30diagonal, 0);
...
translate(-30
diagonal, 0);
と拡大されてるようですが

実際は対角線の長さの半分より小さい値で良いので
translate(0.42diagonal, 0);
...
translate(-0.42
diagonal, 0);
などと縮小しなければいけません

3.その他
size()を使って全画面表示をしているようですが
size()の代わりにfullScreen()を使用すれば全画面表示となります
(escキーで終了します)

あと現在の動作のみであれば
global_variable()関数は
定義の内容をsetup関数内に書き1度実行すればよいので
定義する&draw関数で毎回呼ぶ必要はないように思うのですが
いかがでしょうか?

投稿2017/08/30 06:30

e-cube

総合スコア284

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

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

P5_USER

2017/08/31 04:01

e-cubeさん なるほど,キャレット(^)の使い方はExcelと勝手が違うのですね。 もう少し,自己研鑽が必要なようです。 矢印の移動距離が敏感すぎたのですね。 適正な倍率があることが分かりました。 >3.その他 試してみました。 古い関数が載っていた本を参考にしていたため,fullScreen();に気が付きませんでした。 global_variable()もご指摘の通り変更したところ,プログラムが十分期待した動きをしてくれました。 色々反省・学習するところがありました。 ありがとうございます。
e-cube

2017/08/31 05:29

累乗演算に関しては四則演算に比べると 使用頻度が高い割に言語ごとに違いが大きい部分で 新しい言語を使う時は確認しておいた方が良いと思います 大抵の言語は演算子がなくて関数利用か アスタリスク2つ「**」かのどっちかです (「**」はFORTRAN由来らしいです) Web上の表記や表計算・数値計算は「^」ですけどね RやHaskellなんかは「^」も使えるようです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問