<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />스프레이 페인트 무리를 짓는 행동에 대한 잘못된 시도였습니다.제가 놓친 부분은 정렬이라고 생각합니다. http://gamedevelopment.tutsplus.com/tutorials/the- three-simple-rules-of-flocking-behaviors-alignment-cohesion-and-separa… 나를 향해 방향을 잡았습니다.여기 새로운 비디오가 있습니다.
ChanceOfDragons-YouTube

그리고 여기에 비트맵 생성을 위한 JSL이 있습니다. 다시 한 번 말씀드리지만, 슬라이더를 사용하려면 반복 기능에서 이웃 및 근접 계산을 제거해야 합니다.흥미로운 결과를 만들 수 있는 몇 가지 매개 변수 값을 찾으려고 할 때 초기 JSL이 아닌 모든 비트맵을 만들기 위해 몇 시간 동안 실행된 최종 JSL입니다.
// 아이디어를 빌린 것
// http://gamedevelopment.tutsplus.com/tutorials/the- three-simple-rules-of-flocking-behaviors-alignment-cohesion-and-separation--gamedev-3444
이웃 = 2; // 인근 지역의 반경
근처=20; // 동네에서 찾을 이웃의 수
a=.04;b=0.08;c=0.2;
w=.8;//1-w는 중앙으로 당김
속도 = 8; // 작을수록 빠릅니다.
x = 1;
y = 2;
dx = 3;
다이 = 4;
색상=5;
nvar = 5;
nflock = 1700;
무리 = J( nflock, nvar, . );
// 초기 위치를 10에서 90으로 설정하고 초기 속도를 1보다 작게 설정합니다.
병렬 할당(
{x = x, y = y, dx = dx, dy = dy, nflock = nflock, 색상=색상},
무리[i, v] = If( v < dx,
100*(i+100)/(nflock+200),//임의의 정수( 10, 90 ),
if(v
)
);
프레임 = 0;
반복 = 함수( {},
{temp = 무리, iflock, irow, kdt = KDTable( 무리[0, 1 :: 2] ), dxsum, dysum, xsum, ysum, myx, myy, xdif, ydif, neighbor, nneighbors, len},
nnear = 10*(1.1+sin(프레임/2000)); // 1~20개의 가장 가까운 이웃
이웃 = 1*(1+cos(프레임/3000)); // 0~2 이웃
{행, 거리} = kdt << KNearestRows( {nnear, 이웃} );
프레임++;
For( iflock = 1, iflock <= nflock, iflock++,
myx = 온도[iflock, x];
myy = 임시[ilock, y];
dxsum = 0;
디스섬 = 0; // 이웃 속도의 합
x합 = 0;
ysum = 0; // 이웃 위치의 합
xdif = 0;
ydif = 0; // 이웃 거리의 합
이웃 = 0;
For( irow = 1, irow <= nnear & (이웃 = 행[iflock, irow]) != 0, irow++,
이웃++;
dxsum += 온도[이웃, dx];
dysum += 온도[이웃, dy];
만약(1,
xsum += 온도[이웃, x];
ysum += 온도[이웃, y];
만약(1,
xdif += (myx - 온도[이웃, x]); // 이웃으로부터 멀어지는 벡터
ydif += (myy - 임시[이웃, y]);
))
);
len = Sqrt( dxsum * dxsum + dysum * dysum );
If( len != 0,
dxsum /= len; // 그룹 방향으로 속도가 1이 됩니다.
Dysum /= len;
,
dxsum = 0;
디스섬 = 0;
);
만약(n이웃,
xc = 50+40*sin((choose(1+mod(iflock,3),3,5,7)*frame)/2207);
yc = 50+40*cos((choose(1+mod(ilock,3),11,13,17)*frame)/3067);
xsum = ((1-w)*xc+(w*(xsum) / (n이웃))) - myx; // 이 벡터는 그룹 중심에 대한 방향을 제공합니다.
ysum = ((1-w)*yc+(w*(ysum) / (n이웃))) - myy;
len = Sqrt( xsum * xsum + ysum * ysum );
if(len!=0,xsum/=len;ysum/=len,xsum=0;ysum=0);// 1로 정규화됨
len = Sqrt( xdif * xdif + ydif * ydif );
if(len!=0,xdif/=len;ydif/=len,xdif=0;ydif=0); // 1로 정규화됨
,
x합 = 0;
ysum = 0;
xdif = 0;
ydif = 0;
);
무리[iflock, dx] += a*dxsum + b*xsum + c*xdif;
if(abs(flock[iflock, dx])>1, Flock[iflock, dx]*=.9);
무리[iflock, x] += 무리[iflock, dx]/속도;
if((flock[iflock, x] < -5 & 무리[iflock, dx] < 0)|(flock[iflock, x] >105 & 무리[iflock, dx] > 0), 무리[iflock, dx] = - 무리[iflock, dx]);
무리[iflock, dy] += a*dysum + b*ysum + c*ydif;
if(abs(flock[iflock, dy])>1, Flock[iflock, dy]*=.9);
무리[iflock, y] += 무리[ilock, dy]/속도;
if((flock[iflock, y] < -5 & 무리[iflock, dy] < 0)|(flock[iflock, y] >105 & 무리[iflock, dy] > 0), 무리[iflock, dy] = - 무리[iflock, dy]);
Flock[iflock,color]=heatcolor((nneighbors)/(nnear),"spectral");//heatcolor((nneighbors-1)/(nnear+10),"jet");//3+nneighbors;/ /hlscolor(.4-.6*(n이웃)/(nnear),.5,1);//
);
);
반복();
새 창( "무리",
V 목록 상자(
gb = 그래프 상자(
억제 축,
프레임 크기( 1922, 1082 ),
<<배경색( RGB 색상( 0, 0, 0 ) ),
펜 크기( 3 );
For( i = 1, i <= nflock, i++,
펜 색상( Flock[i, color] );
Line( {flock[i, x] - 무리[i, dx], 무리[i, y] - 무리[i, dy]}, {flock[i, x], 무리[i, y]} );
);
),
H 목록 상자(
텍스트 상자( " 정렬" ),
슬라이더 상자( 0, .16, a ),
텍스트 상자( " 응집력 " ),
슬라이더 상자( 0, .2, b ),
텍스트 상자( " 분리 " ),
슬라이더 상자( 0, .4, c ),
텍스트 상자( " 이웃" ),
슬라이더 상자( 0, 30, 이웃 ),
,
텍스트 상자( " Near" ),
슬라이더 박스( 1, 30, nnear ),
텍스트 상자( " 속도" ),
슬라이더 박스( .5, 30, 속도 )
)
)
);
동안(프레임<=27000,
gb << 무효;
gb << 업데이트창;
잠깐( 0 );
temp=gb[framebox(1)]<
픽셀=온도<
픽셀=픽셀[3::1082,3::1922];
temp<
temp<
반복();
);