Salut à tous.
J'ai cette question très compliquée à expliquer ici. Donc, fondamentalement, voici la table de données:

Je suis censé créer une colonne intitulée "Coordonnées globales autour de vous" à l'aide du script JSL, en imaginant qu'il y a 8 carrés autour de la coordonnée particulière (à l'exclusion de sa propre coordonnée en principe), comme illustré par l'image ci-dessous, où le petit cercle bleu représente cette coordonnée particulière. Ainsi, le "Nombre total de coordonnées autour de vous" maximum est de 8. Par exemple, comme le montre l'image ci-dessus, sous le numéro 9998887, la coordonnée (-2,1) a un "Nombre total de coordonnées autour de vous" de 3, qui sont (-2,2), (-1,1) et (-1,0). Juste pour une note, l'axe horizontal représente le décalage en abscisse et de même, l'axe vertical représente le décalage en abscisse. À partir du tableau de données ci-dessus, il est facile de créer 20 "Coordonnées totales autour de vous", mais dans mes tâches actuelles, il y a environ 23 000 lignes à traiter. Aussi, encore une chose, je suis censé trier les nombres en fonction, comme 9465371 et 9998887 montrés dans le tableau de données ci-dessus, respectivement (ils ont les mêmes coordonnées), avant de travailler sur le "Total Coordinates Around You".

dt = current data table();
dt << New column ("Total Coordinates Around You",
numeric,
continuous,
formula (
For ( i = 1, i<= N Row(), i++,
(:Total Coordinates Around You = 0; munipulated_x = :X-Coordinate - 1; munipulated_y = Y-Coordinate - 1; j = 1; k = 1; formula (
For ( j = 1, j <= 3, j++,
(formula(
For ( k = 1, k <= 3, k++,
(formula( If (munipulated_x == :X-Coordinate & munipulated_y == :Y-Coordinate, :Total Coordinates Around You))
; munipulated_y ++)
)
) ; munipulated_x ++)
)
) ; :Total Coordinates Around You --)
)
)
);Ci-dessus est un script que j'ai créé et dont je ne suis pas sûr de la raison pour laquelle cela ne fonctionne pas, en utilisant des boucles. Quelqu'un peut-il m'éclairer sur les étapes et les solutions sur la façon de traiter ce problème? Il y a une deuxième partie à cette question, que je vais essayer une fois ma première partie terminée. Permettez-moi d'expliquer en cas de doute, en particulier sur la clarté de la question et de l'explication, et encore une fois, excusez-moi de m'expliquer. Je vous remercie.
Je ne le ferais pas dans une formule car elle est exécutée pour chaque ligne. Par conséquent, si vous passez en boucle dans une formule, vous serez assez lent.
Ce n'est probablement pas la meilleure façon, mais cela semble fonctionner. En supposant que je comprends bien et que vous essayiez de trouver combien de tuiles touchent votre tuile de départ?
Faites-moi savoir si c'est ce que vous essayez de faire.
Names default to here(1);
dt = New Table( "Example",
Add Rows( 20 ),
New Column( "Number",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values(
[9465371, 9465371, 9465371, 9465371, 9465371, 9465371, 9465371, 9465371,
9465371, 9465371, 9998887, 9998887, 9998887, 9998887, 9998887, 9998887,
9998887, 9998887, 9998887, 9998887]
)
),
New Column( "X-Coordinate",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values(
[2, 2, 1, 1, 0, 0, -1, -1, -2, -2, 2, 2, 1, 1, 0, 0, -1, -1, -2, -2]
)
),
New Column( "Y-Coordinate",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Selected,
Set Values( [2, 1, 0, -1, 3, 2, 1, 0, 2, 1, 2, 1, 0, -1, 3, 2, 1, 0, 2, 1] )
),
New Column("Adjacent", Numeric, "Continuous")
);
summarize(dt, byn = By(:Number));
for(i=1, i<=nitems(byn), i++,
sel = byn[i];
rows = dt << Get Rows Where(:Number == num(sel));
mat = dt[rows, {"X-Coordinate", "Y-Coordinate"}];
for(k = 1, k<=nrows(rows), k++,
row = rows[k];
// do a check that you're within the limit
adj = sqrt( (mat[k, 1] - mat[0, 1])^2 + (mat[k, 2] - mat[0, 2])^2) <= sqrt(2);
Column(dt, "Adjacent")[row] = nrows(Loc(adj)) - 1;
)
);Je ne suis pas sûr de comprendre l'exigence, mais si vous voulez trouver des points voisins à un point donné, vous pouvez également utiliser «KDTable ()». Par exemple:
Names Default To Here( 1 );
n = 100; // Size of square
// Make a table of x and y locations
dtx = AsTable((1::n)`, << Invisible);
dty = AsTable((1::n)`, << Invisible);
dt = dty << Join( With( dtx ), Cartesian Join );
Close(dtx, NoSave);
Close(dty, NoSave);
Column(dt, 1) << setName("x");
Column(dt, 2) << setName("y");
dt << deleteProperty("Source");
dt << setName("xy Locations");
// Put thes locations into a matrix
mat = dt << getAsMatrix;
tbl = KDTable( mat );
// Pick a point in the interior, so we don't need to decide on any boundary conditions
myX = RandomInteger(2, n-1);
myY = RandomInteger(2, n-1);
myRow = Loc(mat[0, 1] == myX & mat[0, 2] == myY);
myRow = myRow[1];
// Find the 8 nearest neighbours to the chosen point
{rows, dist} = tbl << K nearest rows( 8, myRow );
Show( myRow, rows );
// Check it worked
myXvals = Column(dt, "x")[myRow];
myYvals = Column(dt, "y")[myRow];
dt << NewColumn("Distance", Numeric, Continuous, Formula(sqrt((:x - myXvals)^2 +(:y - myYvals)^2)));
dt << selectRows(VConcat(myRow, rows`));
gb = dt << Graph Builder(
Size( 529, 453 ),
Show Control Panel( 0 ),
Variables( X( :x ), Y( :y ), Color( :Distance ) ),
Elements( Points( X, Y, Legend( 5 ) ) )
);