<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, 이웃, 이웃, len},
니어 = 10*(1.1+sin(프레임/2000)); // 1~20개의 가장 가까운 이웃
이웃 = 1*(1+cos(frame/3000)); // 0에서 2까지의 이웃
{행, 거리} = kdt << KNearestRows( {근처, 이웃} );
프레임++;
For( iflock = 1, iflock <= nflock, iflock++,
myx = temp[iflock, x];
myy = temp[iflock, y];
dxsum = 0;
디섬 = 0; // 이웃 속도의 합
xsum = 0;
합 = 0; // 이웃 위치의 합
xdif = 0;
ydif = 0; // 이웃 거리의 합
이웃 = 0;
For( irow = 1, irow <= near & (neighbor = rows[iflock, irow]) != 0, irow++,
이웃++;
dxsum += temp[이웃, dx];
dysum += temp[이웃, dy];
만약(1,
xsum += temp[이웃, x];
ysum += temp[이웃, y];
만약(1,
xdif += (myx - temp[이웃, x]); // 이웃에서 멀어지는 벡터
ydif += (myy - temp[이웃, y]);
))
);
len = Sqrt( dxsum * dxsum + dysum * dysum );
If( len != 0,
dxsum /= 렌; // 이것은 그룹 방향으로 속도를 1로 만듭니다.
dysum /= 렌;
,
dxsum = 0;
디섬 = 0;
);
이웃이라면,
xc = 50+40*sin((선택(1+mod(iflock,3),3,5,7)*프레임)/2207);
yc = 50+40*cos((선택(1+mod(iflock,3),11,13,17)*프레임)/3067);
xsum = ((1-w)*xc+(w*(xsum) / (이웃))) - myx; // 이 벡터는 그룹 중심에 대한 방향을 제공합니다.
ysum = ((1-w)*yc+(w*(ysum) / (이웃))) - 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;
합 = 0;
xdif = 0;
ydif = 0;
);
무리[iflock, dx] += a*dxsum + b*xsum + c*xdif;
if( abs(flock[iflock, dx])>1, 무리[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, 무리[iflock, dy]*=.9);
무리[iflock, y] += 무리[iflock, dy]/속도;
if((flock[iflock, y] < -5 & 무리[iflock, dy] < 0)|(flock[iflock, y] >105 & 무리[iflock, dy] > 0), 무리[iflock, dy] = - 무리[iflock, dy]);
무리[iflock,color]=heatcolor((nneighbors)/(near),"spectral");//heatcolor((nneighbors-1)/(near+10),"jet");//3+nneighbors;/ /hlscolor(.4-.6*(이웃)/(가까운),.5,1);//
);
);
반복();
새 창( "떼",
V 목록 상자(
gb = 그래프 상자(
억제 축,
프레임 크기(1922, 1082),
<<배경색( RGB 색상( 0, 0, 0 ) ),
펜 크기( 3 );
For( 나는 = 1, 나는 <= nflock, 나는 ++,
펜 색상( 무리[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, 니어 ),
텍스트 상자( " 속도" ),
슬라이더 상자( .5, 30, 속도 )
)
)
);
동안( 프레임 <= 27000,
GB << 인발;
gb << 업데이트 창;
대기( 0 );
temp=gb[프레임박스(1)]<<그림 가져오기;
픽셀=temp<
픽셀=픽셀[3::1082,3::1922];
temp<
temp<
반복();
);