Intersezione di una linea con una specifica superficie di rivoluzione
Come parte di un progetto artistico, sto cercando di scrivere un programma per il raytrace delle uova, come definito dal modello descritto in questo articolo . Durante la stesura di questo programma, sto cercando di calcolare l'intersezione tra una linea nello spazio 3d e la superficie ottenuta ruotando l'equazione da quel foglio, che è.
$ r = T \times (1 + z)^\frac{1}{1 + \lambda} \times (1-z)^\frac{\lambda}{1+\lambda} $
Dove $r$ è il raggio dell'uovo in altezza $z$ e $T$ e $\lambda$ sono parametri del modello.
Usando questo e la seguente equazione per una linea nello spazio 3d, che passa per un punto $(x_0, y_0, z_0)$ nella direzione $(x_d, y_d, z_d)$:
$ \frac{x - x_0}{x_d} = \frac{y - y_0}{y_d} = \frac{z - z_0}{z_d} $
e la seguente equazione per $r$ in termini di $x$ e $y$
$ r^2 = x^2 + y^2 $
Sono stato in grado di sostituire il file $x$ e $y$ coordinate in termini di $z$, per ottenere la seguente uguaglianza che penso dovrebbe valere all'incrocio.
$ \sqrt{(y_0 + y_d \frac{z - z_0}{z_d})^2 + (x_0 + x_d * \frac{z - z_0}{z_d})^2} = T \times (1 + z)^\frac{1}{1 + \lambda} \times (1-z)^\frac{\lambda}{1+\lambda}) $
Qui è dove sono bloccato. Se riesco a risolverlo, posso trovare le coordinate z di qualsiasi intersezione e da lì le coordinate complete, e questo dovrebbe essere sufficiente per rendere l'uovo.
Risposte
La funzione $$ r = T\cdot (1+z)^{1/(1+\lambda)} (1-z)^{\lambda/(1+\lambda)} $$sembra essere più complicato del necessario. Un'altra forma di equazione dell'uovo a due parametri è una curva algebrica di terzo grado totale,$x^2 + a_0y^2 + a_1xy^2 = 1$, dove $$ a_0 = \frac{1 + x_{\textrm{max}}^2}{y_{\textrm{max}}^2} $$ e $$ a_1 = \frac{-2x_{\textrm{max}}}{y_{\textrm{max}}^2}. $$ Il $x_{\textrm{max}}$ parametro è il $x$ valore in cui l'uovo ha il suo massimo e minimo $y$ valore e il $y_{\textrm{max}}$ parametro è questo massimo $y$valore. Questa equazione risulta da una semplice trasformazione di un'equazione ellittica (vedi "Dalla forma ovale a quella a uovo" ).
Ecco un esempio di questa curva algebrica per $x_{\textrm{max}}=-0.4$ e $y_{\textrm{max}} = 0.7$:

L'equazione della superficie di rivoluzione quando questa curva algebrica viene ruotata attorno a $x$ l'asse è $$ y^2 + z^2 = \frac{1-x^2}{a_0 + a_1x}. $$ Supponiamo di definire l'equazione della linea come $(x,y,z) = \vec{P} + t\vec{v}$, dove $\vec{P}$ è un punto sulla linea e $\vec{v}$è la direzione della linea. Quindi l'intersezione della retta e la superficie di rivoluzione è un'equazione cubica nella variabile$t$(che può essere risolto abbastanza facilmente). Questo è decisamente più facile da risolvere rispetto all'equazione per l'intersezione di una retta con l'equazione originale dell'uovo. In questo caso, dovresti usare un risolutore di equazioni non lineari.
Ecco un confronto tra la curva dell'uovo algebrica e la curva dell'uovo esponente frazionario per $x_{\textrm{max}}=-0.2$ e $y_{\textrm{max}}=0.7$ (un $\lambda$ il valore di 1.5 dà un $x_{\textrm{max}}$ di -0,2):


La curva esponente frazionaria sopra è parametrizzata dall'angolo polare $\theta$ per ottenere una migliore spaziatura dei punti vicini $x=-1$ e $x=1$in modo che la forma della curva sia illustrata meglio alle estremità. Puoi vedere che l'estremità destra dell'uovo esponente frazionario è troppo acuta (la curvatura è effettivamente infinita) e l'estremità sinistra è troppo piatta. L'articolo di "The Auk" non considerava la bontà dell'adattamento alle estremità della curva della generatrice. Il documento ha calcolato solo pochi diametri interni della generatrice e ha confrontato questi numeri con le misure di larghezza delle uova reali. Ecco un'immagine di un vero uovo di gallina per mostrare la forma alle estremità:

Dato $f(x)=r$ come una curva per $-1\le x\le 1$ la superficie della rivoluzione intorno al $x$ l'asse è ottenuto come $$S\to F(x,y,z) = f(x)-\sqrt{y^2+z^2}=0$$. Definendo ora una linea come
$$ L\to p = p_0 +\mu \vec v,\ \ \ p = (x,y,z),\ \ \ p_0 =(x_0,y_0,z_0),\ \ \ \vec v = (v_x,v_y,v_z),\ \ \ \mu\in\mathbb{R} $$
l'intersezione $S\cap L$ si ottiene risolvendo per $\mu$
$$ G(\mu) = F(x_0+\mu v_x,y_0+\mu v_y, z_0+\mu v_z) = 0 $$
Qui $G(\mu)$ ci dà l'indizio per trovare il file $\mu^*$ soddisfacente $G(\mu^*)=0$ quando esiste.
Calcolo $\mu_m=\arg\max_{\mu}G(\mu)$ Se $G(\mu_m) < 0$ poi $S,L$non si interseca. quando$G(\mu_m) \gt 0$abbiamo due soluzioni e scegliamo il valore inferiore come soluzione. La determinazione di$\mu_m,\mu^*$ può essere eseguita utilizzando una procedura iterativa come quella di Newton risolvendo $G'(\mu)=0,G(\mu)=0$.
Segue uno script MATHEMATICA con la procedura iterativa necessaria.
Qui è $f(x)$
T = 0.6;
lambda = 0.7;
Plot[T (1 + x)^(1/(1 + lambda)) (1 - x)^(lambda/(1 + lambda)), {x, -1, 1}, PlotRange -> {{-1, 1}, {-1, 1}}, AspectRatio -> 1, PlotStyle -> {Thick, Blue}]

segue la determinazione di $G(\mu)$ e $\mu_m$
G = T (1 + x)^(1/(1 + lambda)) (1 - x)^(lambda/(1 + lambda)) - Sqrt[y^2 + z^2];
p = {x, y, z};
p0 = {1.2, 1, 1};
v = {-1, -1, -2};
L = p0 + mu v;
Gmu = G /. Thread[p -> L];
solmax = Chop[FindMaximum[Gmu, mu]]
e infine la determinazione del punto di intersezione quando $G(\mu_m) \gt 0$.
dGmu = D[Gmu, mu];
deltamu = Gmu/dGmu;
mu0 = 0.5 mu /. solmax[[2]];
For[i = 1, i <= 10, i++,
deltamu0 = deltamu /. {mu -> mu0};
mu1 = mu0 - deltamu0;
If[Abs[deltamu0] < 10^-6, Print[mu1]; Break[]];
mu0 = mu1;
]
pint = L /. {mu -> mu1};
grL = ParametricPlot3D[L, {mu, -2, 2}];
grpti = Graphics3D[{Red, Sphere[pint, 0.02]}];
gr0 = ContourPlot3D[T (1 + x)^(1/(1 + lambda)) (1 - x)^(lambda/(1 + lambda)) == Sqrt[y^2 + z^2], {x, -1, 1}, {y, -1, 1}, {z, -1, 1}, ContourStyle -> {Yellow, Opacity[0.6]}, Mesh -> None, BoundaryStyle -> None]
Show[gr0, grL, grpti]

Si noti che per la determinazione di $\mu_m$ possiamo anche usare una procedura iterativa.