Il 1o Obiettivo

Precedente Home Su

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:

  1. Caricare il file in memoria;
  2. Estrarre dal file caricato la superficie e i vettori che rappresentano le coordinate, in modo da poter essere utilizzate nella funzione surf
  3. Disegnare la superficie di punti;
  4. 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

Leonardo Daga's Warehouseâ, http://leonardodaga.insyde.it
Send any Comments to: leonardo.daga@gmail.com