前提・実現したいこと
以下の図の赤丸のようにスケールバーの指定の場所をくり抜いて奥の表示を出現させるテクニック、あるいは目的の描写を周囲に被らせないように行うトリミングのテクニックを知りたい。
出典はこちら
発生している問題・エラーメッセージ
beginContour()とendContour()内に図に表示された赤丸内の白線をvertexで作成すると、リファレンス通り、指定した個所をくり抜いてくれるのですが、beginShape()とbeginContour()のコード内に座標変換や他の図形(例:rect、ellipse)を使うことが出来ないので、どうしたものかと行き詰っています。
###取り得る手法
1)一番奥のレイヤ(エディタ内では上の行)に赤丸内のラベルを潜ませて、何かしらの方法でくりぬく
→そのくり抜く方法とは?
2)一番手前のレイヤ(エディタ内では下の行)に枠からはみ出した部分をトリミングして指定した位置に貼り付ける。
→後ろを透かせつつトリムする方法がわからない。
該当のソースコード
一応ソースを載せます。
大雑把の説明ですが、1つ目のソースコードはsetup()とdraw()しか記述していません。2つ目にはdraw()の中にあるspeed_region()の中身を書いており、
一番下の15行がbeginContour()を使ってくり抜いている部分になっています。
それ以外のところはラベルを表示しているコードになっています。
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;//方位角 13float kvc = 0;//CAS 14float kph = 0;//気圧高度 15 16void setup() 17{ 18 size(displayWidth, displayHeight); 19 Font = loadFont("Verdana-48.vlw"); 20 strokeWeight(displayHeight/350); 21 22 //udp = new UDP (this, 60000); 23 //udp.listen(true); 24} 25 26void draw() 27{ 28 font_size_small = displayHeight/40; 29 font_size_large = displayHeight/30; 30 textFont(Font, font_size_small); 31 32 kvc = 50; 33 34 bank = radians(-phi); 35 36 background(255); 37 fill(0, 255, 0); 38 smooth(); 39 speed_region(); 40}
void speed_region() { float mask_width = displayWidth / 8.0; float mask_height = displayHeight / 7.5; int spd_label_max = 1000; //速度の最大表示はMAX1000 [kt] int spd_delta = 20;//速度の表示間隔は20 [kt] int spd_num = spd_label_max / spd_delta; float spd_scale_length = displayHeight * 0.35; float spd_num_distance = spd_scale_length / spd_num; float spd_num_reach = mask_width * 0.35; float spd_scale_main_reach = mask_width * 0.20; float spd_scale_sub_reach = mask_width * 0.10; float spd_num_exist; float spd_scale_sub_exist; float R = displayHeight / 50; textFont(Font, font_size_large); rectMode(CORNER); noStroke(); fill(0); rect(0, 0, mask_width, displayHeight);//速度計の背景をセット stroke(0, 255, 0); line(mask_width, mask_height, mask_width, displayHeight - mask_height); fill(0); translate(mask_width, displayHeight / 2); textAlign(RIGHT); //速度計表示 for (int i = 0; i <= spd_label_max; i += spd_delta) { float y = map(kvc, 0, 1000, 0, spd_scale_length * ((spd_label_max / spd_delta) - 30)); spd_num_exist = -(i * spd_num_distance) + y; spd_scale_sub_exist = spd_num_exist - spd_num_distance * (spd_label_max/100); fill(0, 255, 0); text(i, -spd_num_reach, spd_num_exist + font_size_large * 0.3); line(0, spd_num_exist, -spd_scale_main_reach, spd_num_exist); line(0, spd_scale_sub_exist, -spd_scale_sub_reach, spd_scale_sub_exist); } beginShape(); fill(0, 255, 0); scale(-1, 1); for (int i = 0; i < 3; i++) { vertex(R*cos(radians(360*i/3)), R*sin(radians(360*i/3))); } endShape(CLOSE); fill(0); scale(-1, 1); translate(-mask_width, -displayHeight / 2); noStroke(); rect(0, 0, displayWidth, mask_height);//速度計の上端の見切れをセット stroke(0, 255, 0); line(0, mask_height, mask_width, mask_height); translate(0, displayHeight); scale(1, -1); noStroke(); rect(0, 0, displayWidth, mask_height);//速度計の下端の見切れをセット stroke(0, 255, 0); line(0, mask_height, mask_width, mask_height); scale(1, -1); translate(0, -displayHeight); //noFill(); beginShape(); vertex(0, 0); vertex(mask_width, 0); vertex(mask_width, displayHeight); vertex(0, displayHeight); beginContour(); vertex(0, displayHeight / 15 + displayHeight / 2); vertex(mask_width / 1.25, displayHeight / 15 + displayHeight / 2); vertex(mask_width / 1.25, displayHeight / 45 + displayHeight / 2); vertex(mask_width / 1.10, displayHeight / 2); vertex(mask_width / 1.25, -displayHeight / 45 + displayHeight / 2); vertex(mask_width / 1.25, -displayHeight / 15 + displayHeight / 2); vertex(0, -displayHeight / 15 + displayHeight / 2); endContour(); endShape(CLOSE); }
補足情報(FW/ツールのバージョンなど)
processing 3.3.6
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。