Problemino piccolo piccolo
Salve! Sono nuovo da queste parti... e, ovviamente, se sono qui è perché devo risolvere un problema!
Sono un informatico un po' ambizioso: ho intenzione di costruire un'applicazione che permetta di esplorare scenari tridimensionali.
Con le mie scarse conoscenze di geometria analitica "imparate" alla Ragioneria (ebbene sì...) avevo tentato un procedimento un po' complesso per passare dal 3D (spazio "logico") al 2D (sua rappresentazione sullo schermo), procedimento che poi si è rivelato essere totalmente errato quando, successivamente, ho introdotto la possibilità di "ruotare" la direzione dello sguardo.
Allora ho pensato di lasciar perdere quel faticoso procedimento (non ve lo sto nemmeno a spiegare), e di tentare di utilizzare le formule tipiche della geometria nello spazio.
Sono arrivato a capire che quello che noi vediamo non è che una proiezione di tutti i suoi punti su un piano (che gli amici degli istituti d'arte, e non solo, chiamano "quadro prospettico") il quale è parallelo e sta ad una certa distanza da un altro piano: il piano "direttore", come lo chiamo io. Questo piano contiene un punto, (punto di vista) che corrisponde alle coordinate alle quali io mi trovo nello spazio. Perché l'esigenza di far esistere un piano direttore? Questo perché un punto, da solo, non mi permette di capire in quale direzione sto guardando; di conseguenza, la sua presenza mi aiuta a "dirigere" tale direzione. Ecco perché l'ho chiamato "direttore".
Ora, ecco il mio problema.
Anzitutto mi serve sapere come arrivare al procedimento di stabilire l'equazione del piano direttore semplicemente sapendo come questo è inclinato secondo i vari assi (x, y e z - la quota) e che contiene un punto (il punto di vista) le cui coordinate sono note.
In secondo luogo, devo discernere anche il piano prospettico, il quale è parallelo al piano direttore, oltre che distare da esso una certa distanza d (la quale corrisponde alla lunghezza dell'altezza di un triangolo equilatero avente lato = 640. Si tratta di un principio ottico, in quanto il nostro campo visivo è di 60°).
Questo è solo l'inizio del problema... il quadro prospettico, infatti, è solo una parte del piano prospettico, ed è rappresentabile come un quadrato di lato l (l = 640, ovvero la base del suddetto triangolo equilatero) il qui incontro delle sue diagonali coincide con la proiezione del punto di vista sul piano prospettico. Tale proiezione credo sia il "punto di fuga".
Consegue che ogni generico punto P che io proietto (quindi l'intersezione della retta passante per il punto di vista e un generico punto P con il piano prospettico) sul piano prospettico è visibile se appartiene al quadro prospettico.
Vi sarebbero da aggiungere altri particolari (relativi alle definizioni di "davanti" e "dietro", ma non voglio tediarvi...), ma per ora credo che ci sia abbastanza carne sul fuoco. Spero che mi possiate aiutare (credo che si tratti di un problema abbastanza semplice, addirittura banale per un matematico - ma io non sono un matematico!)... in ogni caso vi ringrazio!
Tamer Abdalla
bdltmr@yahoo.it
Sono un informatico un po' ambizioso: ho intenzione di costruire un'applicazione che permetta di esplorare scenari tridimensionali.
Con le mie scarse conoscenze di geometria analitica "imparate" alla Ragioneria (ebbene sì...) avevo tentato un procedimento un po' complesso per passare dal 3D (spazio "logico") al 2D (sua rappresentazione sullo schermo), procedimento che poi si è rivelato essere totalmente errato quando, successivamente, ho introdotto la possibilità di "ruotare" la direzione dello sguardo.
Allora ho pensato di lasciar perdere quel faticoso procedimento (non ve lo sto nemmeno a spiegare), e di tentare di utilizzare le formule tipiche della geometria nello spazio.
Sono arrivato a capire che quello che noi vediamo non è che una proiezione di tutti i suoi punti su un piano (che gli amici degli istituti d'arte, e non solo, chiamano "quadro prospettico") il quale è parallelo e sta ad una certa distanza da un altro piano: il piano "direttore", come lo chiamo io. Questo piano contiene un punto, (punto di vista) che corrisponde alle coordinate alle quali io mi trovo nello spazio. Perché l'esigenza di far esistere un piano direttore? Questo perché un punto, da solo, non mi permette di capire in quale direzione sto guardando; di conseguenza, la sua presenza mi aiuta a "dirigere" tale direzione. Ecco perché l'ho chiamato "direttore".
Ora, ecco il mio problema.
Anzitutto mi serve sapere come arrivare al procedimento di stabilire l'equazione del piano direttore semplicemente sapendo come questo è inclinato secondo i vari assi (x, y e z - la quota) e che contiene un punto (il punto di vista) le cui coordinate sono note.
In secondo luogo, devo discernere anche il piano prospettico, il quale è parallelo al piano direttore, oltre che distare da esso una certa distanza d (la quale corrisponde alla lunghezza dell'altezza di un triangolo equilatero avente lato = 640. Si tratta di un principio ottico, in quanto il nostro campo visivo è di 60°).
Questo è solo l'inizio del problema... il quadro prospettico, infatti, è solo una parte del piano prospettico, ed è rappresentabile come un quadrato di lato l (l = 640, ovvero la base del suddetto triangolo equilatero) il qui incontro delle sue diagonali coincide con la proiezione del punto di vista sul piano prospettico. Tale proiezione credo sia il "punto di fuga".
Consegue che ogni generico punto P che io proietto (quindi l'intersezione della retta passante per il punto di vista e un generico punto P con il piano prospettico) sul piano prospettico è visibile se appartiene al quadro prospettico.
Vi sarebbero da aggiungere altri particolari (relativi alle definizioni di "davanti" e "dietro", ma non voglio tediarvi...), ma per ora credo che ci sia abbastanza carne sul fuoco. Spero che mi possiate aiutare (credo che si tratti di un problema abbastanza semplice, addirittura banale per un matematico - ma io non sono un matematico!)... in ogni caso vi ringrazio!
Tamer Abdalla
bdltmr@yahoo.it
Risposte
Torno sull'argomento per segnalarti il mio
recente articolo:
Algoritmi semplici per assonometria e prospettiva
che puoi scaricare da
http://www.schgor.com/artic/ASPAP.htm
ed in cui vengono trattati semplici metodi per la rappresentazione
sul piano di oggetti tridimensionali.
Se non e' abbastanza chiaro, chiedi pure delucidazioni.
G.Schgör
recente articolo:
Algoritmi semplici per assonometria e prospettiva
che puoi scaricare da
http://www.schgor.com/artic/ASPAP.htm
ed in cui vengono trattati semplici metodi per la rappresentazione
sul piano di oggetti tridimensionali.
Se non e' abbastanza chiaro, chiedi pure delucidazioni.
G.Schgör
Molte grazie per tutti i vostri consigli!
Ad ogni modo, mi rendo perfettamente conto del fatto che all'interno del mio programma esistono funzioni e subroutine che devono eseguire diverse (e differenti) operazioni logico-matematiche. Invero, la parte grafica è minima. La prima volta che ho realizzato una cosa simile fu (ormai è passato un po') una copia del solito "Campo Stellare": avete presente lo screensaver di Windows? Proprio quello.
L'algoritmo era abbastanza semplice: il programma iniziava definendo le coordinate di un centinaio di punti, con
-320 < x < 320 e x <> 0
-240 < z < 240 e z <> 0
y > 320
e poi ciclicamente decrementava il valore di y. Quando questo arrivava ad essere 0 < y < 1 allora venivano definiti nuovi valori x, y, z. Il programma può continuare all'infinito fino alla pressione di un tasto.
Per far calcolare la posizione di una "stella" (quindi un punto 3D) sullo schermo, non ho fatto altro che intersecare la retta passante per il mio punto di vista P(0,0,0) e la stella A(x,y,z) con il piano y = 320 * (3 ^ (1/2)). Va da sé che del punto ottenuto basta utilizzare le due coordinate x e z per ottenere (opportunamente traslato e capovolto) il corrispondente su schermo.
Ecco il programma (non è ottimizzato, me ne rendo conto). Questa versione gira su QBASIC.
DECLARE SUB DisegnaPunto (Colore AS INTEGER)
DIM SHARED X0 AS DOUBLE, Y0 AS DOUBLE, Z0 AS DOUBLE
DIM SHARED X1 AS DOUBLE, Y1 AS DOUBLE, Z1 AS DOUBLE
DIM SHARED X2 AS DOUBLE, Y2 AS DOUBLE, Z2 AS DOUBLE
DIM MioX(0 TO 99) AS DOUBLE
DIM MioY(0 TO 99) AS DOUBLE
DIM MioZ(0 TO 99) AS DOUBLE
SCREEN 12
X1 = 0
Y1 = 0
Z1 = 0
Y0 = 320 * SQR(3)
FOR I = 0 TO 99
DO: MioX(I) = (640 * RND(1)) - 320: LOOP WHILE MioX(I) = 0
DO: MioZ(I) = (480 * RND(1)) - 240: LOOP WHILE MioZ(I) = 0
MioY(I) = 320 + (640 * RND(1))
NEXT I
DO
FOR I = 0 TO 99
'Modificare l'espressione seguente per cambiare la velocità
MioY(I) = MioY(I) - .4
X2 = MioX(I): Z2 = MioZ(I): Y2 = MioY(I)
DisegnaPunto 15
IF MioY(I) < 1 THEN
DO
MioX(I) = (640 * RND(1)) - 320
MioZ(I) = (480 * RND(1)) - 240
LOOP WHILE MioX(I) = 0 OR MioZ(I) = 0
MioY(I) = 640
END IF
NEXT I
FOR I = 0 TO 99
X2 = MioX(I): Z2 = MioZ(I): Y2 = MioY(I)
DisegnaPunto 0
NEXT I
LOOP WHILE INKEY$ = ""
SUB DisegnaPunto (Colore AS INTEGER)
X0 = (Y0 * (X1 - X2) - X1 * Y2 + X2 * Y1) / (Y1 - Y2)
Z0 = (X0 * (Z1 - Z2) + X1 * Z2 - X2 * Z1) / (X1 - X2)
PSET (X0 + 320, 480 - (Z0 + 240)), Colore
END SUB
Grazie ancora per l'attenzione e per i vostri preziosi contributi!
Tamer
Ad ogni modo, mi rendo perfettamente conto del fatto che all'interno del mio programma esistono funzioni e subroutine che devono eseguire diverse (e differenti) operazioni logico-matematiche. Invero, la parte grafica è minima. La prima volta che ho realizzato una cosa simile fu (ormai è passato un po') una copia del solito "Campo Stellare": avete presente lo screensaver di Windows? Proprio quello.
L'algoritmo era abbastanza semplice: il programma iniziava definendo le coordinate di un centinaio di punti, con
-320 < x < 320 e x <> 0
-240 < z < 240 e z <> 0
y > 320
e poi ciclicamente decrementava il valore di y. Quando questo arrivava ad essere 0 < y < 1 allora venivano definiti nuovi valori x, y, z. Il programma può continuare all'infinito fino alla pressione di un tasto.
Per far calcolare la posizione di una "stella" (quindi un punto 3D) sullo schermo, non ho fatto altro che intersecare la retta passante per il mio punto di vista P(0,0,0) e la stella A(x,y,z) con il piano y = 320 * (3 ^ (1/2)). Va da sé che del punto ottenuto basta utilizzare le due coordinate x e z per ottenere (opportunamente traslato e capovolto) il corrispondente su schermo.
Ecco il programma (non è ottimizzato, me ne rendo conto). Questa versione gira su QBASIC.
DECLARE SUB DisegnaPunto (Colore AS INTEGER)
DIM SHARED X0 AS DOUBLE, Y0 AS DOUBLE, Z0 AS DOUBLE
DIM SHARED X1 AS DOUBLE, Y1 AS DOUBLE, Z1 AS DOUBLE
DIM SHARED X2 AS DOUBLE, Y2 AS DOUBLE, Z2 AS DOUBLE
DIM MioX(0 TO 99) AS DOUBLE
DIM MioY(0 TO 99) AS DOUBLE
DIM MioZ(0 TO 99) AS DOUBLE
SCREEN 12
X1 = 0
Y1 = 0
Z1 = 0
Y0 = 320 * SQR(3)
FOR I = 0 TO 99
DO: MioX(I) = (640 * RND(1)) - 320: LOOP WHILE MioX(I) = 0
DO: MioZ(I) = (480 * RND(1)) - 240: LOOP WHILE MioZ(I) = 0
MioY(I) = 320 + (640 * RND(1))
NEXT I
DO
FOR I = 0 TO 99
'Modificare l'espressione seguente per cambiare la velocità
MioY(I) = MioY(I) - .4
X2 = MioX(I): Z2 = MioZ(I): Y2 = MioY(I)
DisegnaPunto 15
IF MioY(I) < 1 THEN
DO
MioX(I) = (640 * RND(1)) - 320
MioZ(I) = (480 * RND(1)) - 240
LOOP WHILE MioX(I) = 0 OR MioZ(I) = 0
MioY(I) = 640
END IF
NEXT I
FOR I = 0 TO 99
X2 = MioX(I): Z2 = MioZ(I): Y2 = MioY(I)
DisegnaPunto 0
NEXT I
LOOP WHILE INKEY$ = ""
SUB DisegnaPunto (Colore AS INTEGER)
X0 = (Y0 * (X1 - X2) - X1 * Y2 + X2 * Y1) / (Y1 - Y2)
Z0 = (X0 * (Z1 - Z2) + X1 * Z2 - X2 * Z1) / (X1 - X2)
PSET (X0 + 320, 480 - (Z0 + 240)), Colore
END SUB
Grazie ancora per l'attenzione e per i vostri preziosi contributi!
Tamer
quote:
Originally posted by g.schgor
Quello che dice david_e e' vero, ma quando uno
si trova a dover scrivere un programma che produce grafica
non sempre ha a disposizione degli strumenti matematici
sofisticati (cioe' programmi che permettono ad es. di "invertire"
una matrice). I linguaggi comuni si basano sulle 4 operazioni
(o al massimo hanno possibilita' di elevazione a potenza, quindi di
svolgere anche radici).
In realta' la maggior parte dei problemi che si presentano, possono
essere risolti ricorrendo a metodi che david_e definisce
COMPLICATI, ma che non sono altro che un approccio elementare alle
relazioni geometriche.
Vorrei fare un esempio: determinare le equazioni che definiscono una
retta passante per 2 punti in uno spazio tridimensionale.
I 2 punti siano definiti da P(x1,y1,z1) e P(x2,y2,z2) e la retta da
R(a,b,c,d), cioe' da 4 parametri definiti considerando le proiezioni
della retta stessa sul piano xy (y=a*x+b) e sul piano zx (z=c*x+d).
Non occorre un genio matematico per ricavare che se la retta deve
passare per i punti dati, deve essere
a=(y2-y1)/(x2-x1)
b=y1-a*x1
c=(z2-z1)/(x2-x1)
d=z1-c*x1
(l'unico inconveniente del metodo e' che i due
punti non possono avere la stessa x).
Ecco allora che se devo rappresentare graficamente
sullo schermo del computer il segmento di retta che
unisce i due punti, posso utilizzare la rappresentazione
assonometrica citata nella mia prima risposta.
Lo stesso si puo' fare per tutti gli altri problemi che hai
posto. Se vuoi, possiamo continuare.
Sinceramente non me ne intendo di grafica. Tuttavia penso che, soprattutto per le rotazioni, l'uso di matrici semplifica di molto il problema dal punto di vista matematico.
In ogni caso sono d'accordo con g.schgor per quanto riguarda la complicazione insita nell'avere un sotto-programma in grado di lavorare con le matrici: e' una complessita' che puo' essere solo in parte ridotta tenendo conto di dover comunque lavorare solo con matrici 3x3... forse si puo' giustificare questo procedimento solo se si vuole fornire la possibilita' di muovere la testa lungo 2 direzioni e camminare nell'ambientazione.
Poi c'e' anche da considerare che per fare questo tipo di programma e' anche necessario avere a disposizione algoritmi efficienti per lavorare con le matrici: potrebbe essere necessario effettuare 30 roto-traslazioni al secondo se si intende far camminare e muovere la visuale e mantenere il tutto fluido...
quote:
Originally posted by Acquario84
Molte grazie!
Ora mi metto a fare una bella ricerca... spero di non metterci una vita.
Indicativamente, su quali tipi di libri (es. matematica per scuole superiori? Quali indirizzi?) o siti posso trovare quello che sto cercando?
Ti cito questo bellissimo testo on-line disponibile gratis in PDF (in inglese):
http://joshua.smcvt.edu/linalg.html/
Qui' troverai molto piu' di quello che ti serve per risolvere i tuoi problemi. Dovresti soltanto recoperare le nozioni di base di vettore e matrice e soprattutto l'importantissimo capitolo sulle matrici di rotazioni. Si tratta di matrici che permettono di "girare" il riferimento cartesiano dando tre angoli.
Un ABC sui cambiamenti lineari di coordinate potrebbe esserti utile se intendi aggiungere la possibilita' di muoversi nello spazio.
In alternativa ti do' il link alle dispense di algebra del mio vecchio prof. sono in italiano e sono fatte molto bene. A te interessa solo la parte di Algebra Linare. Sono poche pagine in Italiano:
http://web.mate.polimi.it/viste/student ... amento=436
Altrimenti puoi procurarti un testo di Algebra lineare in biblioteca. Su tutti i testi c'e' quello che cerchi!
Quello che dice david_e e' vero, ma quando uno
si trova a dover scrivere un programma che produce grafica
non sempre ha a disposizione degli strumenti matematici
sofisticati (cioe' programmi che permettono ad es. di "invertire"
una matrice). I linguaggi comuni si basano sulle 4 operazioni
(o al massimo hanno possibilita' di elevazione a potenza, quindi di
svolgere anche radici).
In realta' la maggior parte dei problemi che si presentano, possono
essere risolti ricorrendo a metodi che david_e definisce
COMPLICATI, ma che non sono altro che un approccio elementare alle
relazioni geometriche.
Vorrei fare un esempio: determinare le equazioni che definiscono una
retta passante per 2 punti in uno spazio tridimensionale.
I 2 punti siano definiti da P(x1,y1,z1) e P(x2,y2,z2) e la retta da
R(a,b,c,d), cioe' da 4 parametri definiti considerando le proiezioni
della retta stessa sul piano xy (y=a*x+b) e sul piano zx (z=c*x+d).
Non occorre un genio matematico per ricavare che se la retta deve
passare per i punti dati, deve essere
a=(y2-y1)/(x2-x1)
b=y1-a*x1
c=(z2-z1)/(x2-x1)
d=z1-c*x1
(l'unico inconveniente del metodo e' che i due
punti non possono avere la stessa x).
Ecco allora che se devo rappresentare graficamente
sullo schermo del computer il segmento di retta che
unisce i due punti, posso utilizzare la rappresentazione
assonometrica citata nella mia prima risposta.
Lo stesso si puo' fare per tutti gli altri problemi che hai
posto. Se vuoi, possiamo continuare.
si trova a dover scrivere un programma che produce grafica
non sempre ha a disposizione degli strumenti matematici
sofisticati (cioe' programmi che permettono ad es. di "invertire"
una matrice). I linguaggi comuni si basano sulle 4 operazioni
(o al massimo hanno possibilita' di elevazione a potenza, quindi di
svolgere anche radici).
In realta' la maggior parte dei problemi che si presentano, possono
essere risolti ricorrendo a metodi che david_e definisce
COMPLICATI, ma che non sono altro che un approccio elementare alle
relazioni geometriche.
Vorrei fare un esempio: determinare le equazioni che definiscono una
retta passante per 2 punti in uno spazio tridimensionale.
I 2 punti siano definiti da P(x1,y1,z1) e P(x2,y2,z2) e la retta da
R(a,b,c,d), cioe' da 4 parametri definiti considerando le proiezioni
della retta stessa sul piano xy (y=a*x+b) e sul piano zx (z=c*x+d).
Non occorre un genio matematico per ricavare che se la retta deve
passare per i punti dati, deve essere
a=(y2-y1)/(x2-x1)
b=y1-a*x1
c=(z2-z1)/(x2-x1)
d=z1-c*x1
(l'unico inconveniente del metodo e' che i due
punti non possono avere la stessa x).
Ecco allora che se devo rappresentare graficamente
sullo schermo del computer il segmento di retta che
unisce i due punti, posso utilizzare la rappresentazione
assonometrica citata nella mia prima risposta.
Lo stesso si puo' fare per tutti gli altri problemi che hai
posto. Se vuoi, possiamo continuare.
Molte grazie!
Ora mi metto a fare una bella ricerca... spero di non metterci una vita.
Indicativamente, su quali tipi di libri (es. matematica per scuole superiori? Quali indirizzi?) o siti posso trovare quello che sto cercando?
Ora mi metto a fare una bella ricerca... spero di non metterci una vita.
Indicativamente, su quali tipi di libri (es. matematica per scuole superiori? Quali indirizzi?) o siti posso trovare quello che sto cercando?
Beh sono cose che si trovano su qualunque testo di algebra lineare nella parte di geometria (rette, piani etc...).
Ti potrei dare anche io una risposta, ma dubito che una risposta concisa e breve possa aiutart. In pratica dovrei ricopiare un intero capitolo del libro!!! La cosa oltre a non essere legale è anche una bella r... quindi me la risparmio! [:D]
Comunque ecco la risposta concisa.
Dato un punto P e un VERSORE n esiste un unico piano passante per P e avente n come versole NORMALE (perpendicolare). L'equazione è (se memoria non mi inganna:
< x - P , n > = 0
Dove x è un VETTORE (generico) di R^3 e con < . , . > indico il PRODOTTO SCALARE.
Combinando questa equazione con quella della retta PARALLELA al VERSORE v e passante per il punto Q:
x = t v + Q
dove x è un vettore e t è un parametro REALE si ottine tutto quello che cerchi.
Se i concetti usati non sono a te noti ti invito a rivederli su qualche libro perchè via Forum non è possibile fare un corso intero di algebra lineare [:D]. Anche perchè se non hai i prerequisiti di algebra lineare (matrici, vettori e prodotti scalari) il tuo compito è difficilmente risolvibile: esistono modi COMPLICATI per scrivere piani e rette nello spazio che non facciano intervenire matrici o vettori riga o colonna, ma non credo che nessuno usi più quei metodi dai tempi in cui sono state inventate le matrici e la rappresentazione dei vettori come colonne-righe.
Ti potrei dare anche io una risposta, ma dubito che una risposta concisa e breve possa aiutart. In pratica dovrei ricopiare un intero capitolo del libro!!! La cosa oltre a non essere legale è anche una bella r... quindi me la risparmio! [:D]
Comunque ecco la risposta concisa.
Dato un punto P e un VERSORE n esiste un unico piano passante per P e avente n come versole NORMALE (perpendicolare). L'equazione è (se memoria non mi inganna:
< x - P , n > = 0
Dove x è un VETTORE (generico) di R^3 e con < . , . > indico il PRODOTTO SCALARE.
Combinando questa equazione con quella della retta PARALLELA al VERSORE v e passante per il punto Q:
x = t v + Q
dove x è un vettore e t è un parametro REALE si ottine tutto quello che cerchi.
Se i concetti usati non sono a te noti ti invito a rivederli su qualche libro perchè via Forum non è possibile fare un corso intero di algebra lineare [:D]. Anche perchè se non hai i prerequisiti di algebra lineare (matrici, vettori e prodotti scalari) il tuo compito è difficilmente risolvibile: esistono modi COMPLICATI per scrivere piani e rette nello spazio che non facciano intervenire matrici o vettori riga o colonna, ma non credo che nessuno usi più quei metodi dai tempi in cui sono state inventate le matrici e la rappresentazione dei vettori come colonne-righe.
Molte grazie per le vostre risposte... comprendo però che forse non avete ben capito quello che vi sto chiedendo. Può succedere.
Allora, l'algoritmo e le questioni relative alla programmazione mi sono noti. Ho già in mente oggetti e metodi. L'interfaccia è pronta, certe parti di codice sono già state scritte.
Quello di cui ho bisogno è un supporto di tipo "logico". Come ho già spiegato, io non sono un matematico. Tutto quello che mi serve, dunque, è sapere:
1) il procedimento matematico per stabilire l'equazione (in forma esplicita) di un piano nello spazio conoscendone l'inclinazione secondo l'asse x, y e z (ad esempio, il piano ha compiuto una rotazione di 30° gradi attorno all'asse x - quella "destra/sinistra" rispetto allo schermo -, una rotazione di 25° attorno all'asse z - quella "alto/basso" - e, infine, una rotazione di -10° attorno all'asse y - "dentro/fuori") e sapendo che passa per un punto dalle coordinate note;
2) come si ricava l'equazione in forma esplicita di una retta nello spazio sapendo che è perpendicolare ad un piano la cui equazione è nota;
3) come si ricava l'equazione in forma esplicita di una retta nello spazio sapendo che è passante per due punti noti;
4) intersecare una retta con un piano.
Credo che per un matematico risolvere questi quattro punti sia una cosa piuttosto banale. Mi rendo conto che se andassi a cercare la risposta sui libri (che non credo di avere) la troverei anche io, ma ho veramente troppo poco tempo per poterlo fare... e in ogni caso non saprei bene cosa e dove cercare.
Sono spiacente per la confusione che si è venuta a creare e per il temperamento un po' "forte" di questo mio post; ci tengo a sottolineare che non è mia intenzione apparire scortese. Sono anzi molto grato per l'attenzione che mi avete prestato fino a d'ora e mi scuso, anzi, se non sono riuscito ad essere più chiaro fin dall'inizio.
Spero che mi vogliate e mi possiate aiutare...
Tamer Abdalla
bdltmr@yahoo.it
Allora, l'algoritmo e le questioni relative alla programmazione mi sono noti. Ho già in mente oggetti e metodi. L'interfaccia è pronta, certe parti di codice sono già state scritte.
Quello di cui ho bisogno è un supporto di tipo "logico". Come ho già spiegato, io non sono un matematico. Tutto quello che mi serve, dunque, è sapere:
1) il procedimento matematico per stabilire l'equazione (in forma esplicita) di un piano nello spazio conoscendone l'inclinazione secondo l'asse x, y e z (ad esempio, il piano ha compiuto una rotazione di 30° gradi attorno all'asse x - quella "destra/sinistra" rispetto allo schermo -, una rotazione di 25° attorno all'asse z - quella "alto/basso" - e, infine, una rotazione di -10° attorno all'asse y - "dentro/fuori") e sapendo che passa per un punto dalle coordinate note;
2) come si ricava l'equazione in forma esplicita di una retta nello spazio sapendo che è perpendicolare ad un piano la cui equazione è nota;
3) come si ricava l'equazione in forma esplicita di una retta nello spazio sapendo che è passante per due punti noti;
4) intersecare una retta con un piano.
Credo che per un matematico risolvere questi quattro punti sia una cosa piuttosto banale. Mi rendo conto che se andassi a cercare la risposta sui libri (che non credo di avere) la troverei anche io, ma ho veramente troppo poco tempo per poterlo fare... e in ogni caso non saprei bene cosa e dove cercare.
Sono spiacente per la confusione che si è venuta a creare e per il temperamento un po' "forte" di questo mio post; ci tengo a sottolineare che non è mia intenzione apparire scortese. Sono anzi molto grato per l'attenzione che mi avete prestato fino a d'ora e mi scuso, anzi, se non sono riuscito ad essere più chiaro fin dall'inizio.
Spero che mi vogliate e mi possiate aiutare...
Tamer Abdalla
bdltmr@yahoo.it
Guarda Acqario84 che non e' come dici.
Quando sei in grado di disegnre un punto nello spazio,
il fatto di rappresentare scene fisse o dinamiche
dipende solo dalla programmazione.
Puoi quindi fare un programma per disegnare ad es.
una curva matematica nello spazio (funzione di diversi
parametri variabili)oppure una figura in movimento.
Per darti un piccolo esempio ti rimando alla soluzione
di una gara di matematica di questo Sito, in cui
vengono mostrate le traettorie di uno speciale "biliardo
tridimensionale", che fa appunto uso del VisualBasic col
metodo che ti ho illustrato:
https://www.matematicamente.it/giochi/bi ... d_sol5.exe
Ho fatto anche esempi di applicazione della prospettiva,
in cui si presenta ad es. un cubo visto da diverse angolazioni.
Devo pero' ammettere che non ho ancora capito cosa vuoi rappresentare
graficamente tu. Se vuoi fammelo sapere e forse ti posso aiutare.
Quando sei in grado di disegnre un punto nello spazio,
il fatto di rappresentare scene fisse o dinamiche
dipende solo dalla programmazione.
Puoi quindi fare un programma per disegnare ad es.
una curva matematica nello spazio (funzione di diversi
parametri variabili)oppure una figura in movimento.
Per darti un piccolo esempio ti rimando alla soluzione
di una gara di matematica di questo Sito, in cui
vengono mostrate le traettorie di uno speciale "biliardo
tridimensionale", che fa appunto uso del VisualBasic col
metodo che ti ho illustrato:
https://www.matematicamente.it/giochi/bi ... d_sol5.exe
Ho fatto anche esempi di applicazione della prospettiva,
in cui si presenta ad es. un cubo visto da diverse angolazioni.
Devo pero' ammettere che non ho ancora capito cosa vuoi rappresentare
graficamente tu. Se vuoi fammelo sapere e forse ti posso aiutare.
Ciao, secondo me in un buon manuale di algebra da università, sotto il capitolo spazi affini e spazi o geometria proiettiva dovresti trovare tutto quello che cerchi, comprese formule matriciali atte allo scopo.
Ciao g.schgor!
Ti ringrazio moltissimo per la soluzione che mi hai offerto, ma, purtroppo, capisco che non è quella che sto cercando... ho già provato una cosa simile a quella che tu mi suggerisci, ma va bene per rappresentare una scena tridimensionale "fissa", per così dire, in quanto non permette di impostare alcun parametro circa la posizione dell'osservatore nello spazio, né la direzione nella quale sta guardando...
Grazie comunque!
Tamer Abdalla
bdltmr@yahoo.it
P.S.: il linguaggio di programmazione... starei sviluppando in VB.NET, ma questo è alquanto irrilevante. Non chiedo codici, solo qualche formula matematica (vedi il mio post precedente)!
Ti ringrazio moltissimo per la soluzione che mi hai offerto, ma, purtroppo, capisco che non è quella che sto cercando... ho già provato una cosa simile a quella che tu mi suggerisci, ma va bene per rappresentare una scena tridimensionale "fissa", per così dire, in quanto non permette di impostare alcun parametro circa la posizione dell'osservatore nello spazio, né la direzione nella quale sta guardando...
Grazie comunque!
Tamer Abdalla
bdltmr@yahoo.it
P.S.: il linguaggio di programmazione... starei sviluppando in VB.NET, ma questo è alquanto irrilevante. Non chiedo codici, solo qualche formula matematica (vedi il mio post precedente)!
Il tuo problema si puo' risolvere semplicemente
stabilendo una terna di assi ortogonali (x,y,z)
e disegnando poi i singoli punti rispetto a questa terna,
che dovra' essere "proiettata" sul piano dello schermo.
Supponiamo di assumere la convenzione che l'asse x sia
quello orizzontale (da sinistra a destra dello schermo) e
l'asse z quello verticale (dal basso in alto dello schermo,
l'asse y risultera' inclinato di un angolo (fi) rispetto
alla verticale (dal centro degli altri 2 e rivolto verso
il basso a sinistra).
Ora, qualsiasi punto dello spazio (di coordinate x1,y1,z1
rispetto agli assi precedenti) puo' essere rappresentato
sullo schermo dalla coppia di coordinate (x1-y1*sen(fi), z1-y1*cos(fi)).
Tutto qui! (ma per scrivere il programma che esegue il
disegno occorre sapere che linguaggio intendi usare.
Se sei d'accordo posso inviarti programmi in VisualBasic
adatti allo scopo).
stabilendo una terna di assi ortogonali (x,y,z)
e disegnando poi i singoli punti rispetto a questa terna,
che dovra' essere "proiettata" sul piano dello schermo.
Supponiamo di assumere la convenzione che l'asse x sia
quello orizzontale (da sinistra a destra dello schermo) e
l'asse z quello verticale (dal basso in alto dello schermo,
l'asse y risultera' inclinato di un angolo (fi) rispetto
alla verticale (dal centro degli altri 2 e rivolto verso
il basso a sinistra).
Ora, qualsiasi punto dello spazio (di coordinate x1,y1,z1
rispetto agli assi precedenti) puo' essere rappresentato
sullo schermo dalla coppia di coordinate (x1-y1*sen(fi), z1-y1*cos(fi)).
Tutto qui! (ma per scrivere il programma che esegue il
disegno occorre sapere che linguaggio intendi usare.
Se sei d'accordo posso inviarti programmi in VisualBasic
adatti allo scopo).