

Fissiamoci un primo obiettivo da realizzare.
Descrizione del problema
Abbiamo a disposizione un file di dati formattati ASCII,
li cui contenuto rappresenta una superficie di punti. Dobbiamo eseguire le
seguenti operazioni:
- Caricare il file in memoria;
- Estrarre dal file caricato la superficie e i vettori
che rappresentano le coordinate, in modo da poter essere utilizzate nella
funzione surf;
- Disegnare la superficie di punti;
- Costruire una funzione il cui input sono la superficie
S e un altro punto qualsiasi P. Scopo della funzione è
determinare il punto P0 della superficie S più vicino al
punto P dato come argomento della funzione.
Informazioni necessarie alla soluzione
Vedere le seguenti pagine per le informazioni necessarie:
Caricamento dei File
Disegno dei grafici
La rappresentazione delle variabili
Il file da caricare
Il file da caricare è nella classica forma X,Y,Z. I punti sono equispaziati
sulla X e sulla Y, ma i punti contenuti nel file contengono ugualmente le tre
coordinate. Il file di test è scaricabile al seguente link: S.txt
A meno di non utilizzare funzioni specifiche (contenute magari nel Mapping
Toolbox) la matrice S non può essere utilizzata direttamente, ma deve
essere separata la matrice delle quote Z da i vettori X e Y
che definiscono la posizione di ogni singolo punto.
Supponendo di sapere che i punti siano equispaziati sulla X e sulla Y e che
la distanza tra due punti nelle due direzioni sia pari a 0.4.
Per costruire i vettori X e Y basta quindi sapere il minimo e il massimo
valore contenuto nella prima e seconda riga della matrice superficie:
X = min(S(:,1)):0.4:max(S(:,1));
Y = min(S(:,2)):0.4:max(S(:,2));
E' evidente a questo punto che la matrice Z sia delle dimensioni nxm, dove n
e m saranno rispettivamente la lunghezza del vettore X e la lunghezza del
vettore Y.
Non è però certo che la matrice S contenga tutti e solo i punti della
matrice nxm, cioè che ad ogni coppia X,Y corrisponda un valore Z. Sarà quindi
necessario esplorare ogni riga della matrice S e individuare il valore Z a quale
elemento della matrice nxm appartiene.
Un modo per costruire la matrice Z a partire dalla matrice S può essere
quello di esplorare riga per riga e determinare la posizione [i,j] nella matrice
(con i=1..n, j = 1..m) in base alla distanza della coordinata X,Y dal punto a
coordinate X,Y più piccole, cioè, X(1) e Y(1):
% Per ogni terna X,Y,Z della matrice S
for k=1:size(S,1)
% Estrazione coordinate del punto
P
Px = S(k,1);
Py = S(k,2);
Pz = S(k,3);
% Estrazione posizione i nella
matrice Z. Si usa la funzione round per evitare che problemi
% di approssimazione possano rendere il risultato differente
da un intero
i = round((Px - X(1))/0.4);
j = round((Py - Y(1))/0.4);
% Le coordinate sono state
determinate. Ora si può assegnare il valore Z(i,j)
Z(i,j) = Pz;
end
A questo punto, l'istruzione
surf(X, Y, Z)
consentirà di generare la superficie caricata in memoria:

La soluzione
La soluzione completa del problema può essere richiesta per e-mail
al sottoscritto
Pagina aggiornata il 30/05/06