Newsgroup: it.comp.lang.pascal
Titolo: Calcolare (in 3D) i vertici di un POLIEDRO

Il punto è questo: mi serve un procedura che mi calcoli ogni vertice in 3D
(quindi x,y,z) di un qualsiasi poliedro regolare convesso, e naturalmente
anche l'ordine con cui congiungerli.
Spero che qualcuno sia interessato alla cosa e sia disposto ad aiutarmi in
un piccolo lavoro di squadra.
Premetto che già ho delle procedure per poterlo visualizzare sullo schermo
una volta calcolati tutti i punti, fa parte del proggetto della libreria
grafica 3D per pascal.
Già ho ultimato una procedura per poter stampare linee 3D rispetto a un
determinato centro, del tipo:
linea3D(a,b:coord3D);
 coord3D è un tipo cosi dichiarato:
   coord = record
                  x,y,z:integer;
   end;
dove a e b sono il punto iniziale e finale del segmento.
Il centro degli assi cartesiani lo posso impostare a mio piacimento in un
qualsiasi punto dello schermo. Quindi il centro del poliedro può combaciare
tranquillamente col centro degli assi (x=0,y=0,z=0);
La procedura dovrebbe fare le seguenti cose
-calolare un vertice
-calorne un altro
-stampare la prima line
-calcolare un'altro vertice
-stampare un'altra linea e cosi via....
La parte + complessa è quella del calcolo dei vertici. Per i poliedri
convessi la relazione tra il numero di vertici v, di facce f e di spigoli s
è data dall'espressione: v + f - s = 2
quindi se per poter calcolare il poliedro è necessario dare da input almeno
due dei tre valori. Inoltre sarà necessario dare la lunghezza di uno spigolo
o del raggio in della sfera dove è inscritto il poliedro.
Altro, almeno per il momento, non so.
Mi sono passate per la mente varie idee, ma nessuna valida.
Ancora non so neache se tutto ciò è fattibile. Voi che ne dite?
Se avete domande o idee scrivete, io sono a disposizione.

o del raggio in della sfera dove è inscritto il poliedro.
Non credo che bastino solo queste informazioni.
Difatti ho paura che il sistema cosi' costituito abbia *infinite*
soluzioni.
Infatti, come si fa a stabilire in che modo sia orientata rispetto
all'origine una singola faccia nello spazio ?

Scusa, ma ti chiedo se per favore mi puoi mandare la libreria per e-mail
visto che sto cercando di fare anch'io qualcosa di simile.
Grazie
Emanuele

all'origine una singola faccia nello spazio ?
Naturalmente si dovrà dare per definizione l'orientamento di una faccia
(della prima). Tutte le altre verrànno calcolate in base a quella.
Poi per farlo ruotare in qualsiasi direzione e di alpha gradi non è un
problema
già ho il codice pronto per farlo.

problema già ho il codice pronto per farlo.
seno e coseno sono precalcolati ?
Andrea Laforgia

seno e coseno sono precalcolati ?
Mi avevano suggerito di precalcolarli ma c'è un problema:
per ruotare un punto nello spazio devo prima conoscere a quanti già si trova
quel punto. Per far ciò mi serve la funzione arctan ( che funziona in
radianti ).
Quindi se li avrei fatti precalcolati avrei dovuto convertirli da radianti a
gradi.
Ora non so se è più convieniente fare il passaggio (da gradi a radianti) o
lasciare le funz sin e cos.
Ti mando il codice cosi puoi vedere:
-per ruotare un punto
x,y,z sono le coordinate 3D
ang è langolo in gradi (si può fare anche in radianti basta fare un a
piccola modifica.
angP è una variabile di appoggio in radianti.
r contiene i vari raggi (le coordinate sono state calcolate a coppie)
la funzione angle(x,y) mi calcola l'angolo e gradtorad serve a convertire.
var
ang,angP,r:array[1..3] of real;
r[1]:=sqrt((y*y)+(z*z));
angP[1]:=angle(y,z)+gradtorad(ang.x);
y:=round( r[1]*cos(angP[1]) );
z:=round( r[1]*sin(angP[1]) );
r[2]:=sqrt((x*x)+(z*z));
angP[2]:=angle(x,z)+gradtorad(ang.y);
x:=round( r[2]*cos(angP[2]) );
z:=round( r[2]*sin(angP[2]) ) ;
r[3]:=sqrt((x*x)+(y*y));
angP[3]:=angle(x,y)+gradtorad(ang.z);
x:=round( r[3]*cos(angP[3]) );
y:=round( r[3]*sin(angP[3]) );
Ti mando anche le funzioni:
function  gradtorad(x:Longint):real;
begin
gradtorad:=PI*x/180;
end;
function  radtograd(x:real):Longint;
begin
radtograd:=round(x*180/PI);
end;
function angle(x,y:Longint):real;
begin
if (x>0) and (y>0) then angle:=arctan(y/x);
if (x<0) and (y<0) then angle:=pi+arctan(y/x);
if (x=0) and (y=0) then angle:=0;
if x=0 then begin
if y>0 then angle:=pi/2;
if y<0 then angle:=3*pi/2;
end;
if y=0 then begin
if x>0 then angle:=0;
if x<0 then angle:=pi;
end;
if (x<0) and (y>0) then angle:=pi/2+arctan((0-1)*x/y);
if (y<0) and (x>0) then angle:=3*pi/2+arctan((0-1)*x/y);
end;



radianti ).
Non e' vero.
La rotazione di un punto non necessita affatto della funzione
arcotangente.
Se si vuole ruotare un punto di coordinate (x, y, z) di t radianti,
basta usare le formule :
(rispetto all'asse Z)
x1 = x * cos(t) - y * sin(t)
y1 = y * cos(t) + x * sin(t)
Andrea Laforgia