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

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

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

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

Q&A

解決済

3回答

1504閲覧

Processing3.5.4のarc()またはradians()にはバグがありますか?

kumasan

総合スコア6

Processing

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

0グッド

0クリップ

投稿2020/05/01 12:31

前提・実現したいこと

これはProcessing3.5.4(2020年5月1日現在の最新版)のバグなのでしょうか。
P5.jsとProcessingで挙動が異なっているような気がします。
これってProcessing側のバグでしょうか?
それとも私が間違えていますでしょうか。
どうぞよろしくお願いいたします。

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

arc()の挙動が両者で異なる?

該当のソースコード

Processing

1void setup() { 2 size(400, 400); 3 ellipseMode(RADIUS); 4} 5 6void draw() { 7 translate(0, height/2); 8 background(220); 9 noStroke(); 10 strokeWeight(1); 11 fill(255, 255, 0); 12 arc(0, 0, 200, 100, radians(-30), radians(30)); //←問題の箇所 13 fill(64); 14 arc(0, 0, 140, 200, radians(-30), radians(30)); //←問題の箇所 15}

P5js

1//実行環境はhttps://editor.p5js.org 2//Processing版とほぼ同じコードです。 3 4function setup() { 5 createCanvas(400, 400); 6 ellipseMode(RADIUS); 7} 8 9function draw() { 10 translate(0, height/2); 11 background(220); 12 noStroke(); 13 strokeWeight(1); 14 fill(255, 255, 0); 15 arc(0, 0, 200, 100, radians(-30), radians(30)); //←こっちはうまく動く 16 fill(64); 17 arc(0, 0, 140, 200, radians(-30), radians(30)); //←こっちはうまく動く 18}

補足情報(FW/ツールのバージョンなど)

実行環境

PC版
Processing3.5.4

P5.js版
https://editor.p5js.org

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

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

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

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

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

hoshi-takanori

2020/05/01 17:40

JavaScript の方は開始と終了の角度が実際の角度なのに対して、Java は媒介変数 t (離心近点角?) になっているようですね。Java と JavaScript (Canvas) の描画プリミティブの仕様の違いなのかも。 https://ja.wikipedia.org/wiki/%E6%A5%95%E5%86%86
kumasan

2020/05/02 06:24

ご返信頂きありがとうございます。 離心近点角という概念は初めて知りました。 勉強になりました。 ありがとうございました。
kumasan

2020/05/07 10:33

Java版Processingのarc()はやはり離心近点角で描画されているような気がします。ちゃんと検証していないので、未だに曖昧ですみません。
guest

回答3

0

自己解決

よく分からなかったので結局自作して解決しました。
経緯や詳細は先日張ったURLです。
角度の処理が合っているかちょっと微妙なのですが…(特にstartdegに負の角度が与えられた場合をまだ考慮できていないような…)
ご参考にでもなれば…
白線は45度を表示しています。
xcをインデントしまくっているのは、私が混乱しないようにするためです。このように書かないと括弧の対応関係が頭の中でごちゃごちゃになってしまうため。

arc2()

Processing3(Java)

1 2void settings() 3{ 4 size(200, 200); 5} 6 7void setup() 8{ 9 background(0); 10 stroke(255); 11 line(0, height, width, 0); 12 //translate(width/2, height/2); 13 //translate(0, height/2); 14 translate(0, height); 15 noStroke(); 16 fill(255, 255, 0, 190); // yellow 17 arc2(0, 0, 200, 100, -45, 0); 18} 19 20void arc2(float x, float y, float w, float h, float startdeg, float stopdeg){ 21 println("arc2"); 22 float a = w/2; 23 println("a:"+a); 24 float b = h/2; 25 println("b:"+b); 26 float deg_step = 1; 27 28 beginShape(); 29 vertex(x, y); 30 float xp, yp; 31 for(float i = startdeg; i <= stopdeg; i+=deg_step){ 32 println("i:"+i); 33 xp = xc(a, b, i); 34 yp = yc(xp, i); 35 if(0 == i){ 36 xp = a; 37 yp = 0; 38 }else if( (0 < i) && (i < 90) ){ // 1st quadrant. 39 xp = abs(xp); 40 yp = abs(yp); 41 }else if(90 == i){ 42 xp = 0; 43 yp = b; 44 }else if( (90 < i) && (i < 180) ){ // 2nd quadrant. 45 xp = -abs(xp); 46 yp = abs(yp); 47 }else if(180 == i){ 48 xp = -a; 49 yp = 0; 50 }else if( (180 < i) && (i < 270) ){ // 3rd quadrant. 51 xp = -abs(xp); 52 yp = -abs(yp); 53 }else if(270 == i){ 54 xp = 0; 55 yp = -b; 56 }else if( (270 < i) && (i < 360)){ // 4th quadrant. 57 xp = abs(xp); 58 yp = -abs(yp); 59 } 60 vertex(xp+x, yp+y); 61 } 62 endShape(CLOSE); 63} 64 65float xc(float a, float b, float theta_deg){ 66 float xc; 67 xc = 1 / ( 68 sqrt( 69 sq(1/a) + sq( 70 tan( 71 radians(theta_deg) 72 ) / b 73 ) 74 ) 75 ); 76 println("xc:"+xc); 77 return xc; 78} 79float yc(float xc, float theta_deg){ 80 float yc; 81 yc = xc*tan(radians(theta_deg)); 82 println("yc:"+yc); 83 return yc; 84}

投稿2020/05/07 10:44

kumasan

総合スコア6

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

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

0

バグというからには、なにか仕様があってそれと異なっているということを言わないと。

開始/終了の「角度」の解釈がJavaとP5.jsで異なっている、という事実だけですよね。
あなたの都合のいいほうが正、ということでもないはずですし。

回避不可能な事態ではないのだから、とりあえず対応しておいて現象はコミュニティに報告しておく、というのがオープンソース的に適切な対応だと思います。


真面目に座標変換とかしないで直感でなんとかならないかと別の方法でやってみましたが、
fillの描画色を使わないとか、noStroke()前提とか、制限が一杯でてしまいました。

Processing

1void setup(){ 2 size(400,400); 3} 4void arc2(float x, float y, float radx, float rady, float start, float end){ 5 PGraphics pg=createGraphics(width,height); 6 PGraphics mask=createGraphics(width,height); 7 float rad=radx>rady?radx:rady; //radxとradyの大きい方 8 pg.beginDraw(); 9 pg.background(255,255,0);//これが描画色になる 10 pg.endDraw(); 11 mask.beginDraw(); 12 mask.background(0); 13 mask.noStroke(); 14 mask.fill(255); 15 mask.ellipse(x,y,radx,rady); 16 mask.fill(0); 17 mask.arc(x,y,rad,rad,end,start+2*PI);//円のarcは期待の角度。開始/終了角の扱いかなりいい加減 18 mask.endDraw(); 19 pg.mask(mask); 20 image(pg, 0,0); 21} 22 23void draw(){ 24 background(204); 25 arc2(width/2,height/2,150,100,radians(-30),radians(30)); 26 27 //参照用斜め線 28 translate(width/2,height/2); 29 rotate(radians(30)); 30 stroke(0); 31 line(0,0,200,0); 32 rotate(radians(-60)); 33 line(0,0,200,0); 34}

投稿2020/05/02 05:35

編集2020/05/07 14:09
thkana

総合スコア7703

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

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

kumasan

2020/05/02 06:25

ご返信頂きありがとうございます。 バグという表現は言い過ぎだったかもしれません。 そうですね、仰るとおりです。 私は数学もあまり得意では無いため、角度を指定しているのに思ったとおりには動いていなかったので、短絡的に、「バグなのかな」と思ってしまいました。 アドバイス頂いたとおりに、コミュニティに報告してみたいと思います。 ありがとうございました。
kumasan

2020/05/12 13:25

thkana様 お返事が遅くなりましてすみません。 正確な検証というのはできていないのですが、投稿していただいたプログラムは正確に動作しているように見えます。 凄いです。 標準のarc()へのパラメーターの与え方でこんなにかんたんに実装できるんですね。 どうもありがとうございました。
guest

0

皆様のご参考になればと思い、現状を報告します。

双方のサイトで多くの方々にご教示頂きました。皆様のお力あっての理解です。改めまして、ありがとうございます。
詳細はこちらにあります。
https://discourse.processing.org/t/i-have-a-question-about-arc/20396

これらはまだ確証があるものではありませんが、どうやら、

  • P5.jsは楕円を指定された角度で切り取っている。
  • Processing(Java)は円を指定された角度で切り取ったものを、指定された縦幅と横幅の比率の楕円にしている。

…ということなのかもしれません。

詳しくは、Processing(Java)ではAWTのarcオブジェクトを使っているようなので、そちらのソースコードか仕様書を参照する必要があるみたいです。まだ調査できていません。

投稿2020/05/03 05:15

kumasan

総合スコア6

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問