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

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

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

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

Q&A

0回答

647閲覧

processing 物体の反発

oruta_key

総合スコア7

Processing

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

0グッド

0クリップ

投稿2018/01/23 04:40

編集2022/01/12 10:55

###前提・実現したいこと
processingのプログラムにおいて、物体が反発を行うように改良しているのですが、上手くいきません。
どのようにプログラムを改良すればよいでしょうか。

何卒よろしくお願いします。
###発生している問題・エラーメッセージ

反発せず、物体それぞれが目標方向へと向かう。

###該当のソースコード
int n=3;
float r=1;
float a=40;
float rij;
float d;
float A=2;
float B=0.08;
float K=12;
float k=1;
float g;
float ri[]=new float[n];
float rj[]=new float[n];
float fx[]=new float[n];
float fy[]=new float[n];
float nx[]=new float[n];
float ny[]=new float[n];

float x[]=new float[n];
float y[]=new float[n];
float vx[]=new float[n];
float vy[]=new float[n];
float X[]=new float[n];
float Y[]=new float[n];
float Vx[]=new float[n];
float Vy[]=new float[n];
float Lx = 20, Ly = 10;
float dt = 0.01;
float m=1;
float e0x[]=new float[n];
float e0y[]=new float[n];
float tx;
float ty;
Float Xe=Lx/2;
float Ye=Ly;
float v0=1;
float t=1;

float vt[]= new float[n];

void setup(){
size(400, 400);
frameRate(50);

for(int i=0;i<n;i++){

x[i] = 10+i*3;
y [i]= 5;
vx [i]= 0;
vy [i]= 0;

ellipse(x[i] * width / Lx, y[i] * height / 2 /Ly, r * width / Lx, r * height/ 2 / Ly);

}
}

void draw(){
background(200);

for(int i=0;i<n;i++){

for(int j=0;j<n;j++){

d=sqrt(pow(x[j]-x[i],2)+pow(y[j]-y[i],2));
nx[i]=(x[j]-x[i])/d;
ny[j]=(y[j]-y[i])/d;
tx=-ny[j];
ty=nx[i];
vt[i]=(x[j]-x[i])*tx+(y[j]-y[i])*ty;
rij=(ri[i]+rj[j])/2;

g=rij-d;
if(g<0){
g=0;
}

fx[i]=(Aexp(((x[i]-d)/B))+Kg*(x[i]-d))nx[i]+kg*(x[i]-d)vt[i]tx;
fy[i]=(A
exp(((y[j]-d)/B))+K
g*(y[j]-d))ny[j]+kg*(y[j]-d)*vt[i]*ty;
ellipse(x[i],y[i],ri[i],ri[i]);
}

e0x[i]=((Xe-x[i])/sqrt(pow(Xe-x[i],2)+pow(Ye-y[i],2)));
e0y[i]=((Ye-y[i])/sqrt(pow(Xe-x[i],2)+pow(Ye-y[i],2)));

Vx[i]=((v0*e0x[i]-vx[i])/t)dt+vx[i];
Vy[i]=((v0
e0y[i]-vy[i])/t)dt+vy[i];
X[i] = x[i] + vx[i] * dt;
Y[i]= y[i] + vy [i]
dt;
x[i]=X[i];
y[i]=Y[i];
vx[i]=Vx[i];
vy[i]=Vy[i];

if ((x[i] + r/2 >= Lx) || (x[i] - r/2 <= 0))
{
vx[i]= -vx[i] ;
}
if ((y[i] + r/2 >= Ly) || (y[i] - r/2 <= 0))
{
vy[i] = -vy[i] ;
}

fill(0);
line(0,height/2,width/2-20,height/2);
fill(0);
line(width/2+20,height/2,width,height/2);
fill(0);
fill(255);

ellipse(x[i] * width / Lx, y[i] * height / 2 /Ly, r * width / Lx, r * height/ 2 / Ly);

}}

###試したこと
おそらく

d=sqrt(pow(x[j]-x[i],2)+pow(y[j]-y[i],2));
nx[i]=(x[j]-x[i])/d;
ny[j]=(y[j]-y[i])/d;
tx=-ny[j];
ty=nx[i];
vt[i]=(x[j]-x[i])*tx+(y[j]-y[i])*ty;
rij=(ri[i]+rj[j])/2;

g=rij-d;
if(g<0){
g=0;
}

この式だと思うのですが、上手く式が動作せず、この式判定後のプログラムにうまく反応しません。

###補足情報(言語/FW/ツール等のバージョンなど)
processing

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問