@@ -29,17 +29,26 @@ public static void Copy2D(ManagedArray dst, ManagedArray src, int minx, int miny
2929 }
3030 }
3131
32- // Copy 2D[index_list][ y]
33- public static void Copy2DX ( ManagedArray dst , ManagedArray src , ManagedIntList index_list , int minx )
32+ // Copy 2D[index_list[minx + x]][miny + y]
33+ public static void Copy2D ( ManagedArray dst , ManagedArray src , int minx , int miny , ManagedIntList index_list )
3434 {
35- for ( var y = 0 ; y < dst . y ; y ++ )
35+ if ( miny > = 0 & miny < src . y )
3636 {
37- var dstoffset = y * dst . x ;
38- var srcoffset = y * src . x ;
37+ for ( var y = 0 ; y < dst . y ; y ++ )
38+ {
39+ var sx = ( miny + y ) * src . x ;
40+ var dx = y * dst . x ;
3941
40- var xx = index_list [ minx ] ;
42+ for ( var x = 0 ; x < dst . x ; x ++ )
43+ {
44+ var xx = index_list [ minx + x ] ;
45+
46+ var srcoffset = sx + xx ;
47+ var dstoffset = dx + x ;
4148
42- MemCopy ( dst , dstoffset , src , srcoffset + xx , dst . x ) ;
49+ dst [ dstoffset ] = src [ srcoffset ] ;
50+ }
51+ }
4352 }
4453 }
4554
@@ -79,19 +88,22 @@ public static void Copy3D(ManagedArray dst, ManagedArray src, int minx, int miny
7988 }
8089 }
8190
82- // Copy 3D[x][y][index_list]
83- public static void Copy3DZ ( ManagedArray dst , ManagedArray src , ManagedIntList index_list , int minz )
91+ // Copy 3D[minx + x][miny + y][index_list[minz + z] ]
92+ public static void Copy3D ( ManagedArray dst , ManagedArray src , int minx , int miny , int minz , ManagedIntList index_list )
8493 {
85- if ( minz < src . z )
94+ if ( minx >= 0 & minx < src . x & miny >= 0 & miny < src . y & minz >= 0 & minz < src . z )
8695 {
8796 for ( var z = 0 ; z < dst . z ; z ++ )
8897 {
8998 var zz = index_list [ minz + z ] ;
9099
100+ var offsets = zz * src . y + miny ;
101+ var offsetd = z * dst . y ;
102+
91103 for ( var y = 0 ; y < dst . y ; y ++ )
92104 {
93- var dstoffset = ( z * dst . y + y ) * dst . x ;
94- var srcoffset = ( zz * src . y + y ) * src . x ;
105+ var dstoffset = ( offsetd + y ) * dst . x ;
106+ var srcoffset = ( offsets + y ) * src . x + minx ;
95107
96108 MemCopy ( dst , dstoffset , src , srcoffset , dst . x ) ;
97109 }
@@ -262,6 +274,25 @@ public static void Copy2D4DIJ(ManagedArray dst, ManagedArray src, int i, int j)
262274 }
263275 }
264276
277+ // Fisher–Yates shuffle algorithm
278+ public static void Shuffle ( ManagedIntList index_list )
279+ {
280+ System . Random random = new System . Random ( System . Guid . NewGuid ( ) . GetHashCode ( ) ) ;
281+
282+ int n = index_list . Length ( ) ;
283+
284+ for ( int i = n - 1 ; i > 1 ; i -- )
285+ {
286+ int rnd = random . Next ( i + 1 ) ;
287+
288+ var value = index_list [ rnd ] ;
289+
290+ index_list [ rnd ] = index_list [ i ] ;
291+
292+ index_list [ i ] = value ;
293+ }
294+ }
295+
265296 public static void Free ( params ManagedArray [ ] trash )
266297 {
267298 foreach ( var item in trash )
0 commit comments