Sto provando a scrivere un programma in modo uniforme (o il più vicino possibile) per distribuire punti sulla superficie di una sfera. Sto cercando di ottenere questo mettendo N punti casualmente su una sfera unitaria, e quindi eseguendo più passaggi in cui i punti si respingono a vicenda.Mutare un oggetto all'interno di loop nidificati
Il problema è nel loop sull'array dei punti. Il codice sottostante scorre su ogni punto, quindi il ciclo all'interno di esso, di nuovo scorre su ogni punto e calcola la forza repulsiva tra ogni coppia di punti.
for point in points.iter_mut() {
point.movement = Quaternion::identity();
for neighbour in &points {
if neighbour.id == point.id {
continue;
}
let angle = point.pos.angle(&neighbour.pos);
let axis = point.pos.cross(&neighbour.pos);
let force = -(1.0/(angle*angle)) * update_amt;
point.movement = point.movement * Quaternion::angle_axis(angle, axis);
}
}
sto ottenendo l'errore:
src/main.rs:71:27: 71:33 error: cannot borrow `points` as immutable because it is also borrowed as mutable
src/main.rs:71 for neighbour in &points {
e la spiegazione
the mutable borrow prevents subsequent moves, borrows, or modification of `points` until the borrow ends
Sono abbastanza nuovo per Rust, proveniente da un C++ fondo, e ho non ho idea di come far funzionare questo tipo di pattern in Rust.
Qualsiasi soluzione a questo sarebbe molto apprezzata, dato che ora sono assolutamente bloccato per le idee. Grazie.
Edit:
Ho elaborato una soluzione, che ho descritto in una risposta di seguito. Ancora non so se è il modo migliore per risolvere il problema, quindi sono ancora aperto a suggerimenti.
'points.iter_mut()' potrebbe essere scritto 'e mut points'. –
Certamente l'idea fondamentale che si desidera raggiungere non può essere eseguita in un codice Rust sicuro; le cose in lettura e in scrittura dovranno essere separate in qualche modo per renderle espresse in un codice sicuro. –