いつもお世話になっています。
前提・実現したいこと
負の値を持つときでも、剰余(%)でループ処理ができるようにしたい。
(例)psiが-90の時に目盛で27を示す。
発生している問題・エラーメッセージ
psiが負の値を持つとき、剰余(%)演算がされない。
該当のソースコード
tweakモードでpsiをスライドしてもらえると、問題への理解が早まると思います。
processing
1import hypermedia.net.*; 2UDP udp; 3 4PFont Font;//HUDフォント 5float newX = 0, newY = 0; 6float bank; 7float font_size_small; 8float font_size_large; 9 10float theta = 0;//ピッチ各 11float phi = 0;//バンク角 12float psi = 0;//方位角 13 14void setup() 15{ 16 size(displayWidth, displayHeight); 17 Font = loadFont("Verdana-48.vlw"); 18 strokeWeight(displayHeight/350); 19 20 //udp = new UDP (this, 60000); 21 //udp.listen(true); 22} 23 24void draw() 25{ 26 font_size_small = displayHeight/40; 27 font_size_large = displayHeight/30; 28 textFont(Font, font_size_small); 29 30 theta = 0; 31 phi = 0; 32 psi = 0; 33 34 bank = radians(-phi); 35 36 background(0); 37 fill(0, 255, 0); 38 smooth(); 39 horizon_region(); 40}
void horizon_region() { int[] pitch_label_str_plus = { 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90};//ピッチ角がプラスのラベル int[] pitch_label_str_minus = {-5, -10, -15, -20, -25, -30, -35, -40, -45, -50, -55, -60, -65, -70, -75, -80, -85, -90};//ピッチ角がマイナスのラベル int pitch_num = pitch_label_str_plus.length;//表示するラベルの数 float pitch_scale_length_half = displayHeight * 3.00;//片方のピッチラベルの表示する長さ float pitch_num_distance = pitch_scale_length_half / pitch_num;//ラベルの座標的な間隔 float pitch_num_plus_exist;//ピッチ角が正のラベルの存在するy座標 float pitch_num_minus_exist;//ピッチ角が負のラベルの存在するy座標; float pitch_num_interval = displayWidth * 0.15;//数字ラベルの存在するx座標 float line_outer = displayWidth * 0.145;//線の外側端点x座標 float line_inner = displayWidth * 0.075;//線の内側端点x座標 float y = map(theta, -90, 90, -pitch_scale_length_half, pitch_scale_length_half); translate(displayWidth / 2, displayHeight / 2); rotate(bank); line(-displayWidth/14, 0, displayWidth/14, 0); line(-displayWidth/14, 0, -displayWidth/10, displayHeight/20); line(-displayWidth/14, 0, -displayWidth/10, -displayHeight/20); line(displayWidth/14, 0, displayWidth/10, displayHeight/20); line(displayWidth/14, 0, displayWidth/10, -displayHeight/20); for (int i=0; i <= pitch_num-1; i++) { pitch_num_plus_exist = - (1 + i) * pitch_num_distance + font_size_small + y; textAlign(LEFT); text(nf(pitch_label_str_plus[i], 2), pitch_num_interval, pitch_num_plus_exist); textAlign(RIGHT); text(nf(pitch_label_str_plus[i], 2), -pitch_num_interval, pitch_num_plus_exist); line(line_inner, pitch_num_plus_exist - font_size_small, line_outer, pitch_num_plus_exist - font_size_small); line(-line_inner, pitch_num_plus_exist - font_size_small, -line_outer, pitch_num_plus_exist - font_size_small); line(line_outer, pitch_num_plus_exist, line_outer, pitch_num_plus_exist - font_size_small); line(-line_outer, pitch_num_plus_exist, -line_outer, pitch_num_plus_exist - font_size_small); } for (int i=0; i <= pitch_num-1; i++) { pitch_num_minus_exist = (1 + i) * pitch_num_distance + y; textAlign(LEFT); text(nf(pitch_label_str_minus[i], 2), pitch_num_interval, pitch_num_minus_exist); textAlign(RIGHT); text(nf(pitch_label_str_minus[i], 2), -pitch_num_interval, pitch_num_minus_exist); line(line_inner, pitch_num_minus_exist, line_outer, pitch_num_minus_exist); line(-line_inner, pitch_num_minus_exist, -line_outer, pitch_num_minus_exist); line(line_outer, pitch_num_minus_exist, line_outer, pitch_num_minus_exist - font_size_small); line(-line_outer, pitch_num_minus_exist, -line_outer, pitch_num_minus_exist - font_size_small); } rotate(-bank); translate(-displayWidth / 2, -displayHeight / 2); int[] azimuth_label_str = {34, 35, 36, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 1, 2};//方位を数字で格納するための配列 int azi_num = azimuth_label_str.length; float azi_scale_length = displayWidth * 15.0; float azi_num_distance = azi_scale_length / azi_num; float azi_num_exist; float scale_sub_exist; float x = -map(psi, 0, 360, (0) * azi_num_distance, (36) * azi_num_distance); translate(displayWidth / 2, displayHeight / 2); rotate(bank); if (psi >= 0) { x = x%(36 * azi_num_distance); } if (psi < 0) { //ココ x = x%(36 * azi_num_distance);//仮 } noFill(); stroke(0, 255, 0); textAlign(CENTER); for (int i = 0; i <= azi_num - 1; i++) { azi_num_exist = x + (i-2) * azi_num_distance; scale_sub_exist = azi_num_exist + azi_num_distance / 2; text(nf(azimuth_label_str[i], 2), azi_num_exist, -displayHeight/30 + y);//数字 line(azi_num_exist, y, azi_num_exist, -displayHeight/40 + y);//大目盛 line(scale_sub_exist, y, scale_sub_exist, -displayHeight/70 + y);//小目盛 line(azi_num_exist, y, x + (i-3) * azi_num_distance, y); } rotate(-bank); translate(-displayWidth/2, -displayHeight/2); }
試したこと
xをabs(x)にしたり、←当然ダメ
xを-xにしたり、←同じくダメ
してみましたが、どうすれば、(例えば)psiが-90の時に目盛で27を示してくれるのでしょうか。
補足情報(FW/ツールのバージョンなど)
processing 3.3.6
どういう計算をしたいんでしょうか?ソース読むのがめんどいです
現在、方位計を作成しています。外部入力をpsiという変数で受け止めています。ただし、画面の中での描写はピクセル数なので、psiの値をそのまま入れてしまっては駄目で、map()を使用して幅をpsiの値を画面の値に対応させています。その時の返り値がxという変数に格納されていて、xの値で目盛の表示する場所をコントロールしています。今回、psiが360以上でも、例えばpsi=370の時は剰余の関係から画面の目盛は10を示していてくれていますが、psiが負の値をとったときに剰余の演算子が機能しなくなっている状況です。
360の剰余を求めたいという話ですか?それでphiのとり得る最小値はいくらでしょうか
あ、phiじゃなくpsiですか
申し訳ありません。こちらのミスでphiをpsiと書いていました。>360の剰余を求めたいという話ですか?:その通りです。psiのとり得る値は未知数です。psiの値等は運動計算模擬PCからの出力となっていて、中身が分からないためです。
回答3件
あなたの回答
tips
プレビュー