commit 16894c114f8ac7bbaa5ead8aad46e87149498047
parent c364464ff87f6cab19a38ac87457e6d61daabde3
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Wed, 1 Feb 2023 17:18:50 +0100
Relecture des sources Noweb
Dans cette validation est notamment modifié la mise en page des blocs
de code C en supprimant systématiquement les deux espaces en début de
ligne. D'autres ajustements ont également été fait. Entre autres, la
variable "scene" n'est plus abrégée en "scn" et le vecteur de
déformation "chi" est désormais une constante initialisée à {0,0,1}.
Diffstat:
1 file changed, 182 insertions(+), 182 deletions(-)
diff --git a/src/sgs_compute_sensitivity_translation.nw b/src/sgs_compute_sensitivity_translation.nw
@@ -374,10 +374,10 @@ courante du chemin ne sont que des données locales à chaque étape de la
construction du chemin; son poids étant mis à jour si nécessaire à chacune de
ces étapes.
-<<réalisation>>=
+<<fonction de réalisation>>=
static res_T
realisation
- (struct rng* rng,
+ (struct ssp_rng* rng,
const struct sgs_scene* scene,
double* w)
{
@@ -410,9 +410,9 @@ point de départ de notre chemin de sensibilité complété ensuite par un chemi
de dérivée spatiale dont la combinaison est le chemin du problème couplé.
<<échantillonner un chemin du problème couplé>>=
- <<échantillonner une position sur la source de sensibilité>>
- <<échantillonner un chemin de sensibilité>>
- <<échantillonner un chemin de dérivée spatiale>>
+<<échantillonner une position sur la source de sensibilité>>
+<<échantillonner un chemin de sensibilité>>
+<<échantillonner un chemin de dérivée spatiale>>
@
\paragraph{}
@@ -425,11 +425,11 @@ surface supérieure $S_r$ identifié dans le code par la constante
[[SGS_SURFACE_Z_MAX]] (voir figure~\ref{fig:configuration}).
<<échantillonner une position sur la source de sensibilité>>=
- /* Sample the sensitivity emissive surface */
- sgs_geometry_sample_sensibility_source(scene->geom, rng, &frag);
- d3_set(pos_emit_s, frag.position);
- d3_set(normal_s, frag.normal);
- surf_emit_s = frag.surface; /* must be SGS_SURFACE_Z_MAX */
+/* Sample the sensitivity emissive surface */
+sgs_geometry_sample(scene->geom, rng, &frag);
+d3_set(pos_emit_s, frag.position);
+d3_set(normal_s, frag.normal);
+surf_emit_s = frag.surface; /* must be SGS_SURFACE_Z_MAX */
@
\paragraph{}
@@ -448,10 +448,10 @@ rencontré une intersection avec une géométrie, une intersection stockée dans
la variable [[hit0]].
<<échantillonner un chemin de sensibilité>>=
- /* Sample the cosine weighted sampling of the emissive direction */
- ssp_ran_hemisphere_cos(rng, normal_s, dir_emit_s, NULL);
- /* Trace the sampled ray */
- TRACE_RAY(pos_emit_s, dir_emit_s, surf_emit_s, &hit0);
+/* Sample the cosine weighted sampling of the emissive direction */
+ssp_ran_hemisphere_cos(rng, normal_s, dir_emit_s, NULL);
+/* Trace the sampled ray */
+TRACE_RAY(pos_emit_s, dir_emit_s, surf_emit_s, &hit0);
@
\paragraph{}
@@ -471,10 +471,10 @@ chemin dans cette direction jusqu'à l'intersection avec une surface stockée
dans [[hit1]].
<<échantillonner un chemin de dérivée spatiale>>=
- /* Compute the specular direction */
- reflect(dir_spec_s, dir_emit_s, normal_s);
- /* Trace the specular ray */
- TRACE_RAY(pos_emit_s, dir_spec_s, surf_emit_s, &hit1);
+/* Compute the specular direction */
+reflect(dir_spec_s, dir_emit_s, normal_s);
+/* Trace the specular ray */
+TRACE_RAY(pos_emit_s, dir_spec_s, surf_emit_s, &hit1);
@
\subsection{Le poids}
@@ -491,15 +491,15 @@ source radiative, à savoir la paroi de droite.
\paragraph{TODO} parler de l'initialistion à 0 du poids de sensib.
<<échantillonner un chemin de sensibilité>>=
- if(!hit_receiver(&scn, pos_emit_s, dir_emit_s, &hit0)) {
- goto exit;
- }
+if(!hit_receiver(scene, pos_emit_s, dir_emit_s, &hit0)) {
+ goto exit;
+}
@
<<échantillonner un chemin de dérivée spatiale>>=
- if(!hit_source(&scn, pos_emit_s, dir_spec_s, &hit1)) {
- goto exit;
- }
+if(!hit_source(scene, pos_emit_s, dir_spec_s, &hit1)) {
+ goto exit;
+}
@
\paragraph{}
@@ -512,8 +512,8 @@ dont on aura besoin pour le calcul du poids. De même, on initialise la variable
pour évaluer la source de dérivée spatiale.
<<échantillonner un chemin de dérivée spatiale>>=
- d3_normalize(normal_e, hit1.normal);
- d3_minus(dir_spec_e, dir_spec_s);
+d3_normalize(normal_e, hit1.normal);
+d3_minus(dir_spec_e, dir_spec_s);
@
\paragraph{}
@@ -522,12 +522,12 @@ travers la condition à la limite de sensibilité (équation \ref{eq:clsensib})
des sources de chacun de ses couplages.
<<calcul du poids>>=
- <<décomposition du vecteur de déformation $\vec{\chi}$>>
+<<décomposition du vecteur de déformation $\vec{\chi}$>>
- <<calcul de la dérivée surfacique de $\rho$>>
- <<calcul des sources de dérivées spatiales>>
+<<calcul de la dérivée surfacique de $\rho$>>
+<<calcul des sources de dérivées spatiales>>
- <<calculer le poids de sensibilité>>
+<<calculer le poids de sensibilité>>
@
\paragraph{}
@@ -536,7 +536,7 @@ vecteur tangent $\vec{u}$ nécessaire dans l'expression de la source de
sensibilité et de ses dérivée surfaciques (équation \ref{eq:clsensib}).
<<décomposition du vecteur de déformation $\vec{\chi}$>>=
- decomposition(chi, normal_s, dir_emit_s, &proj_chi_s);
+decomposition(chi, normal_s, dir_emit_s, &proj_chi_s);
@
\paragraph{}
@@ -547,14 +547,14 @@ produit scalaire entre le gradient surfacique de $\rho$ et la direction de
dérivation $\vec{u}$ transformée dans ce plan ([[u_2d]]).
<<calcul de la dérivée surfacique de $\rho$>>=
- <<récupérer le gradient surfacique de $\rho$>>
+<<récupérer le gradient surfacique de $\rho$>>
- /* Transform u in XY plane */
- u_2d[0] = proj_chi_s.u[X];
- u_2d[1] = proj_chi_s.u[Y];
+/* Transform u in XY plane */
+u_2d[0] = proj_chi_s.u[X];
+u_2d[1] = proj_chi_s.u[Y];
- /* Surface derivative of rho */
- d_rho = d2_dot(grad_rho_2d, u_2d);
+/* Surface derivative of rho */
+d_rho = d2_dot(grad_rho_2d, u_2d);
@
\paragraph{}
@@ -563,12 +563,12 @@ position d'émission [[pos_emit_s]], et d'interroger les données associées à
position ainsi transformée ([[pos_emit_s_2d]]).
<<récupérer le gradient surfacique de $\rho$>>=
- /* Transform pos_emit_s in XY plane */
- pos_emit_s_2d[0] = pos_emit_s[X];
- pos_emit_s_2d[1] = pos_emit_s[Y];
+/* Transform pos_emit_s in XY plane */
+pos_emit_s_2d[0] = pos_emit_s[X];
+pos_emit_s_2d[1] = pos_emit_s[Y];
- rho = get_rho(scn, pos_emit_s_2d);
- get_grad_rho(scn, pos_emit_s_2d, grad_rho_2d);
+rho = get_rho(scene, pos_emit_s_2d);
+get_grad_rho(scene, pos_emit_s_2d, grad_rho_2d);
@
\paragraph{}
@@ -578,10 +578,10 @@ $\vec{\chi}$ et $\vec{u}$) dont les sources sont données par les équations
\ref{eq:cl_dchiL_droite}.
<<calcul des sources de dérivées spatiales>>=
- <<décomposition du vecteur $\vec{\chi}$>>
- <<décomposition du vecteur $\vec{u}$>>
- <<calcul du gradient surfacique de $Sb$ dans la direction $\vec{u}_e$>>
- <<calcul du gradient surfacique de $Sb$ dans la direction $\vec{u}_{cs}$>>
+<<décomposition du vecteur $\vec{\chi}$>>
+<<décomposition du vecteur $\vec{u}$>>
+<<calcul de la dérivée surfacique de $Sb$ dans la direction $\vec{u}_e$>>
+<<calcul de la dérivée surfacique de $Sb$ dans la direction $\vec{u}_{cs}$>>
@
\paragraph{}
@@ -591,7 +591,7 @@ la source de de la dérivée spatiale dans la direction $\vec{\chi}$ et de sa
dérivée surfaciques (équation \ref{eq:cl_dchiL_droite}).
<<décomposition du vecteur $\vec{\chi}$>>=
- decomposition(chi, normal_e, dir_spec_e, &proj_chi_e);
+decomposition(chi, normal_e, dir_spec_e, &proj_chi_e);
@
\paragraph{}
@@ -601,7 +601,7 @@ dérivée spatiale dans la direction $\vec{u}$ et de sa dérivée surfacique
(equation \ref{eq:cl_duL_droite}).
<<décomposition du vecteur $\vec{u}$>>=
- decomposition(proj_chi_s.u, normal_e, dir_spec_e, &proj_u_e);
+decomposition(proj_chi_s.u, normal_e, dir_spec_e, &proj_u_e);
@
\paragraph{}
@@ -618,25 +618,25 @@ situation les deux dérivées spatiales $\partial_{\vec{\chi}} I$ et
$\partial_{\vec{u}} I$ partagent une même position d'émission ([[pos_emit_e]]).
<<calcul de la dérivée surfacique de $Sb$ dans la direction $\vec{u}_e$>>=
- /* Calculate the shared position on the emitter */
- pos_emit_e[X] = pos_emit_s[X] + dir_spec_s[X]*hit1.distance;
- pos_emit_e[Y] = pos_emit_s[Y] + dir_spec_s[Y]*hit1.distance;
- pos_emit_e[Z] = pos_emit_s[Z] + dir_spec_s[Z]*hit1.distance;
+/* Calculer la position sur l'émetteur */
+pos_emit_e[X] = pos_emit_s[X] + dir_spec_s[X]*hit1.distance;
+pos_emit_e[Y] = pos_emit_s[Y] + dir_spec_s[Y]*hit1.distance;
+pos_emit_e[Z] = pos_emit_s[Z] + dir_spec_s[Z]*hit1.distance;
- /* Transform pos_emit_e in YZ plane */
- pos_emit_e_2d[0] = pos_emit_e[Y];
- pos_emit_e_2d[1] = pos_emit_e[Z];
+/* Transforme pos_emit_e dans le plan YZ */
+pos_emit_e_2d[0] = pos_emit_e[Y];
+pos_emit_e_2d[1] = pos_emit_e[Z];
- /* Récupérer le gradient surfacique de Sb */
- Sb = get_Sb(scn, pos_emit_e_2d);
- get_grad_Sb(scn, pos_emit_e_2d, grad_Sb_2d);
+/* Récupérer le gradient surfacique de Sb */
+Sb = get_Sb(scene, pos_emit_e_2d);
+get_grad_Sb(scene, pos_emit_e_2d, grad_Sb_2d);
- /* Transformer u_e dans le plan YZ */
- u_e_2d[0] = proj_u_e.u[Y];
- u_e_2d[1] = proj_u_e.u[Z];
+/* Transformer u_e dans le plan YZ */
+u_e_2d[0] = proj_u_e.u[Y];
+u_e_2d[1] = proj_u_e.u[Z];
- /* Dérivée surfacique de Sb dans la direction u_e */
- d_u_e_Sb = d2_dot(grad_Sb_2d, u_e_2d);
+/* Dérivée surfacique de Sb dans la direction u_e */
+d_u_e_Sb = d2_dot(grad_Sb_2d, u_e_2d);
@
\paragraph{}
@@ -646,12 +646,12 @@ gradient surfacique de $S_b$ et la direction $\vec{u}_{cs}$ transformée dans le
plan de la paroi de droite ([[u_cs_2d]]).
<<calcul de la dérivée surfacique de $Sb$ dans la direction $\vec{u}_{cs}$>>=
- /* Transformer u_cs dans le plan YZ */
- u_cs_2d[0] = proj_chi_e.u[Y];
- u_cs_2d[1] = proj_chi_e.u[Z];
+/* Transformer u_cs dans le plan YZ */
+u_cs_2d[0] = proj_chi_e.u[Y];
+u_cs_2d[1] = proj_chi_e.u[Z];
- /* Dérivée surfacique de Sb dans la direction u_cs */
- d_u_cs_Sb = d2_dot(grad_Sb_2d, u_cs_2d);
+/* Dérivée surfacique de Sb dans la direction u_cs */
+d_u_cs_Sb = d2_dot(grad_Sb_2d, u_cs_2d);
@
Le poids de sensibilité correspond à la contribution portée par le chemin du
@@ -663,18 +663,18 @@ probabilités de la position sur la surface et de la direction dans l'hémisphè
sortante de la paroi.
<<calculer le poids de sensibilité>>=
- /* Calcul de la contribution du chemin couplé */
- Sb_sensib =
- - proj_chi_s.beta * d_rho * Sb
- - rho * proj_chi_s.beta * proj_u.e.beta * d_u_e_Sb
- + rho * proj_chi_e.beta * d_u_cs_Sb;
-
- /* Poids de sensibilité */
- sensib = Sb_sensib * PI * get_Sr_area(scn);
+/* Calcul de la contribution du chemin couplé */
+Sb_sensib =
+ - proj_chi_s.beta * d_rho * Sb
+ - rho * proj_chi_s.beta * proj_u_e.beta * d_u_e_Sb
+ + rho * proj_chi_e.beta * d_u_cs_Sb;
+
+/* Poids de sensibilité */
+sensib = Sb_sensib * PI * get_Sr_area(scene);
@
<<renvoyer le poids>>=
- w[0] = sensib;
+w[0] = sensib;
@
\subsection{Variables locales et macro}
@@ -692,17 +692,17 @@ utilisé pour éviter une auto-intersection, c'est à dire l'intersection du
rayon avec le triangle dont il est issu.
<<données locales à la fonction de réalisation>>=
- /* Macro utilisée comme sucre syntaxique */
- #define TRACE_RAY(Org, Dir, StartFrom, Hit) { \
- double range[2]; \
- range[0] = 0; \
- range[1] = INF; \
- sgs_geometry_trace_ray(sgs->geom, (Org), (Dir), range, (StartFrom), (Hit));\
- } (void)0
+/* Macro utilisée comme sucre syntaxique */
+#define TRACE_RAY(Org, Dir, StartFrom, Hit) { \
+ double range[2]; \
+ range[0] = 0; \
+ range[1] = INF; \
+ sgs_geometry_trace_ray(scene->geom, (Org), (Dir), range, (StartFrom), (Hit));\
+} (void)0
@
<<nettoyer les données locales de la fonction>>=
- #undef TRACE_RAY
+#undef TRACE_RAY
@
\paragraph{}
@@ -710,52 +710,48 @@ Enfin, nous déclarons ci-après l'ensemble des variables locales nécessaires
la réalisation que nous venons d'écrire:
<<données locales à la fonction de réalisation>>=
- /* Variables de la source de sensibilité */
- double dir_emit_s[3];
- double pos_emit_s[3];
- double normal_s[3];
- double dir_spec_s[3];
- double pos_emit_s_2d[2];
- enum sgs_surface_type surf_emit_s;
- struct sgs_fragment frag; /* Position échantillonnée */
-
- /* Variables de la source radiative */
- double pos_emit_e[3];
- double normal_e[3];
- double dir_spec_e[3];
- double pos_emit_e_2d[2];
-
- /* Propriétés radiatives des surfaces et leur dérivée */
- double rho;
- double d_rho;
- double grad_rho_2d[2];
- double Sb;
- double d_u_e_Sb;
- double d_u_cs_Sb;
- double grad_Sb_2d[2];
-
- /* Vecteurs des déformations et variables de projection */
- double chi[3];
- double u_2d[2];
- double u_e_2d[2];
- double u_cs_2d[2];
- struct projection proj_chi_s;
- struct projection proj_chi_e;
- struct projection proj_u_e;
-
- /* Pour le calcul du poids */
- double Sb_sensib;
- double sensib;
-
- /* Intersections avec la géométrie */
- struct sgs_hit hit0;
- struct sgs_hit hit1;
+/* Variables de la source de sensibilité */
+double dir_emit_s[3];
+double pos_emit_s[3];
+double normal_s[3];
+double dir_spec_s[3];
+double pos_emit_s_2d[2];
+enum sgs_surface_type surf_emit_s;
+struct sgs_fragment frag; /* Position échantillonnée */
+
+/* Variables de la source radiative */
+double pos_emit_e[3];
+double normal_e[3];
+double dir_spec_e[3];
+double pos_emit_e_2d[2];
+
+/* Propriétés radiatives des surfaces et leur dérivée */
+double rho;
+double d_rho;
+double grad_rho_2d[2];
+double Sb;
+double d_u_e_Sb;
+double d_u_cs_Sb;
+double grad_Sb_2d[2];
+
+/* Vecteurs des déformations et variables de projection */
+const double chi[3] = {0, 0, 1};
+double u_2d[2];
+double u_e_2d[2];
+double u_cs_2d[2];
+struct projection proj_chi_s;
+struct projection proj_chi_e;
+struct projection proj_u_e;
+
+/* Pour le calcul du poids */
+double Sb_sensib;
+double sensib;
+
+/* Intersections avec la géométrie */
+struct sgs_hit hit0;
+struct sgs_hit hit1;
@
-\paragraph{Note} Les variables du systèmes sont pi et hauteur et largeur de la
-géométrie. Ce sont des paramètres en entrée du programme (arguments de la ligne
-de commande).
-
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Résultats
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -905,7 +901,7 @@ surface et en utilisant l'ETR pour résoudre $\partial{1,\vec{\omega}}I$:
\partial_{1,\vec{\omega}}I = \mathcal{C} \lbrack I \rbrack
\end{equation}
-<<decomposition>>=
+<<fonctions utilitaires>>=
struct projection {
double alpha;
double beta;
@@ -970,12 +966,16 @@ Le poids ([[weight_flux_part_spec]]), qui correspond à la partie du flux venant
de la réflection sur la paroi spéculaire, est donc calculé au même moment que
celui de la sensibilité.
+<<données locales à la fonction de réalisation>>=
+double weight_flux_part_spec;
+@
+
<<calcul du poids>>=
- weight_flux_part_spec = Sb * rho * PI * get_Sr_area(scn);
+weight_flux_part_spec = Sb * rho * PI * get_Sr_area(scene);
@
<<renvoyer le poids>>=
- w[1] = weight_flux_part_spec;
+w[1] = weight_flux_part_spec;
@
De plus il est également initialisé en même temps que celui de la sensibilité.
@@ -1001,7 +1001,7 @@ sont regroupées dans la fonction qui suit:
<<calculer la sensibilité à la translation>>=
res_T
-compute(struct sgs* sgs)
+compute_sensitivity_translation(struct sgs* sgs)
{
<<variables locales au calcul de sensibilité>>
res_T res = RES_OK;
@@ -1043,7 +1043,7 @@ réalisation ([[run_realisation]]), le type de poids calculés ([[smc_doubleN]],
/* Configurer et créer le système Star-MonteCarlo */
smc_args.logger = &sgs->logger;
smc_args.allocator = sgs->allocator;
-smc_args.nthreads_hint = sgs->nthreads_hint;
+smc_args.nthreads_hint = sgs->nthreads;
smc_args.rng_type = SSP_RNG_MT19937_64;
res = smc_device_create(&smc_args, &smc);
if(res != RES_OK) goto error;
@@ -1070,11 +1070,11 @@ pour afficher l'espérance et l'écart type de ces variables.
res = smc_estimator_get_status(estimator, &status);
if(res != RES_OK) goto error;
-printf("Sensibilité ~ %g +/- %g\n",
+sgs_log(sgs, "Sensibilité ~ %g +/- %g\n",
SMC_DOUBLEN(status.E)[0], /* Espérance */
SMC_DOUBLEN(status.SE)[0]); /* Écart type */
-printf("Luminance ~ %g +/- %g\n",
+sgs_log(sgs, "Luminance ~ %g +/- %g\n",
SMC_DOUBLEN(status.E)[1], /* Espérance */
SMC_DOUBLEN(status.SE)[1]); /* Écart type */
@
@@ -1110,6 +1110,12 @@ la libérant de contraintes fonctionnelles imposées par
<<fonctions utilitaires>>=
static res_T
+realisation
+ (struct ssp_rng* rng,
+ const struct sgs_scene* scene,
+ double* weight);
+
+static res_T
run_realisation
(void* output,
struct ssp_rng* rng,
@@ -1117,12 +1123,12 @@ run_realisation
void* ctx)
{
struct smc_doubleN_context* context = NULL;
- struct sgs* sgs = NULL,
+ struct sgs* sgs = NULL;
ASSERT(ctx && output);
(void)ithread; /* Éviter l'avertissement de compilation "variable inutilisée" */
context = ctx;
- sgs = context->integrand_data
- return realisation(rng, sgs->scene, SMC_DOUBLEN(output));
+ sgs = context->integrand_data;
+ return realisation(rng, &sgs->scene, SMC_DOUBLEN(output));
}
@
@@ -1145,6 +1151,10 @@ l'énumération des fichiers à inclure.
<<calculer la sensibilité à la translation>>
@
+<<constantes du système>>=
+enum {X, Y, Z};
+@
+
<<liste des inclusions>>=
#include "sgs_c.h"
#include "sgs_geometry.h"
@@ -1154,86 +1164,87 @@ l'énumération des fichiers à inclure.
#include <star/ssp.h>
#include <rsys/cstr.h>
+#include <rsys/double2.h>
@
<<fonctions utilitaires>>=
static double
get_rho
- (const struct sgs_scene* scn,
+ (const struct sgs_scene* scene,
const double pos[2])
{
- ASSERT(scn && pos);
+ ASSERT(scene && pos);
return 0.25
- * (1 - cos(2*PI*pos[X]/scn->Sr_sz[X]))
- * (1 - cos(2*PI*pos[Y]/scn->Sr_sz[Y]));
+ * (1 - cos(2*PI*pos[X]/scene->Sr_sz[X]))
+ * (1 - cos(2*PI*pos[Y]/scene->Sr_sz[Y]));
}
-static double
+static void
get_grad_rho
- (const struct sgs_scene* scn,
+ (const struct sgs_scene* scene,
const double pos[2],
double grad[2])
{
- ASSERT(scn && pos && grad);
+ ASSERT(scene && pos && grad);
grad[X] = 0.25
- * (((2*PI)/scn->Sr_sz[X])*sin(2*PI*pos[X]/scn->Sr_sz[X]))
- * (1 - cos(2*PI*pos[Y]/scn->Sr_sz[Y]));
+ * (((2*PI)/scene->Sr_sz[X])*sin(2*PI*pos[X]/scene->Sr_sz[X]))
+ * (1 - cos(2*PI*pos[Y]/scene->Sr_sz[Y]));
grad[Y] = 0.25
- * (((2*PI)/scn->Sr_sz[Y])*sin(2*PI*pos[Y]/scn->Sr_sz[Y]))
- * (1 - cos(2*PI*pos[X]/scn->Sr_sz[X]));
+ * (((2*PI)/scene->Sr_sz[Y])*sin(2*PI*pos[Y]/scene->Sr_sz[Y]))
+ * (1 - cos(2*PI*pos[X]/scene->Sr_sz[X]));
}
@
<<fonctions utilitaires>>=
static double
get_Sb
- (const struct sgs_scene* scn,
+ (const struct sgs_scene* scene,
const double pos[2])
{
ASSERT(position && size);
return
- (1 - cos(2*PI*pos[X]/scn->Se_sz[X]))
- * (1 - cos(2*PI*pos[Y]/scn->Se_sz[Y]));
+ (1 - cos(2*PI*pos[X]/scene->Se_sz[X]))
+ * (1 - cos(2*PI*pos[Y]/scene->Se_sz[Y]));
}
static void
-compute_grad_Sb
- (const struct sgs_scene* scn,
+get_grad_Sb
+ (const struct sgs_scene* scene,
const double pos[2],
double grad[2])
{
- ASSERT(scn && pos && grad);
+ ASSERT(scene && pos && grad);
grad[X] =
- (((2*PI)/scn->Se_sz[X])*sin(2*PI*pos[X]/scn->Se_sz[X]))
- * (1 - cos(2*PI*pos[Y]/scn->Se_sz[Y]));
+ (((2*PI)/scene->Se_sz[X])*sin(2*PI*pos[X]/scene->Se_sz[X]))
+ * (1 - cos(2*PI*pos[Y]/scene->Se_sz[Y]));
grad[Y] =
- (((2*PI)/scn->Se_sz[Y])*sin(2*PI*pos[Y]/scn->Se_sz[Y]))
- * (1 - cos(2*PI*pos[X]/scn->Se_sz[X]));
+ (((2*PI)/scene->Se_sz[Y])*sin(2*PI*pos[Y]/scene->Se_sz[Y]))
+ * (1 - cos(2*PI*pos[X]/scene->Se_sz[X]));
}
@
<<fonctions utilitaires>>=
-static void
-get_Sr_area(const struct sgs_scene* scn)
+static double
+get_Sr_area(const struct sgs_scene* scene)
{
- ASSERT(scn);
- return scn->Sr_sz[X] * scn->Sr_sz[Y];
+ ASSERT(scene);
+ return scene->Sr_sz[X] * scene->Sr_sz[Y];
}
@
<<fonctions utilitaires>>=
static int
hit_receiver
- (struct sgs_scene* scn,
+ (const struct sgs_scene* scene,
const double ray_org[3],
const double ray_dir[3],
const struct sgs_hit* hit)
{
double hit_pos[3];
- ASSERT(scn && ray_org && ray_dir && hit);
+ ASSERT(scene && ray_org && ray_dir && hit);
/* Le rayon n'intersecte pas la surface où le récepteur se trouve */
if(SGS_HIT_NONE(hit) || hit->surface != SGS_SURFACE_Z_MIN) {
@@ -1245,8 +1256,8 @@ hit_receiver
hit_pos[Z] = ray_org[Z] + hit->distance*ray_dir[Z];
/* Le rayon n'intersecte pas le récepteur*/
- if(hit_pos[X] < scn->recv_min[X] || hit_pos[X] > scn->recv_max[X]
- || hit_pos[Y] < scn->recv_min[Y] || hit_pos[Y] > scn->recv_max[Y]) {
+ if(hit_pos[X] < scene->recv_min[X] || hit_pos[X] > scene->recv_max[X]
+ || hit_pos[Y] < scene->recv_min[Y] || hit_pos[Y] > scene->recv_max[Y]) {
return 0;
/* Le rayon intersecte le récepteur*/
@@ -1259,14 +1270,14 @@ hit_receiver
<<fonctions utilitaires>>=
static int
hit_source
- (struct sgs_scene* scn,
+ (const struct sgs_scene* scene,
const double ray_org[3],
const double ray_dir[3],
const struct sgs_hit* hit)
{
- ASSERT(scn && ray_org && ray_dir && hit);
+ ASSERT(scene && ray_org && ray_dir && hit);
/* Éviter l'avertissement de compilation "variable inutilisée" */
- (void)ray_org, (void)ray_dir;
+ (void)scene, (void)ray_org, (void)ray_dir;
if(SGS_HIT_NONE(hit) || hit->surface != SGS_SURFACE_X_MAX) {
return 0;
@@ -1276,17 +1287,6 @@ hit_source
}
@
-\section{A supprimer du noweb}
-
-<<???>>=
-/* TODO move me */
-struct sgs_scene {
- struct sgs_geometry* geom;
- /* TODO décrire le récepteur */
-};
-
-@
-
\bibliographystyle{apalike}
\bibliography{biblio}