特定の回転面との線の交点

Aug 21 2020

アートプロジェクトの一環として、このペーパーで説明されているモデルで定義されているように、卵をレイトレーシングするプログラムを作成しようとしています。このプログラムを書く一環として、私は3D空間の線と、その紙から方程式を回転させて得られる表面との交点を計算しようとしています。

$ r = T \times (1 + z)^\frac{1}{1 + \lambda} \times (1-z)^\frac{\lambda}{1+\lambda} $

どこ $r$ 高さでの卵の半径です $z$ そして $T$ そして $\lambda$ モデルのパラメータです。

これと、点を通過する3D空間の線の次の方程式を使用します。 $(x_0, y_0, z_0)$ 方向 $(x_d, y_d, z_d)$

$ \frac{x - x_0}{x_d} = \frac{y - y_0}{y_d} = \frac{z - z_0}{z_d} $

および次の方程式 $r$ の面では $x$ そして $y$

$ r^2 = x^2 + y^2 $

私は代用することができました $x$ そして $y$ の観点から調整します $z$、交差点で保持する必要があると思う次の等式を取得します。

$ \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}) $

これは私が立ち往生しているところです。これを解くことができれば、交差点のz座標を見つけることができ、そこから完全な座標を見つけることができます。これは、卵をレンダリングするのに十分なはずです。

回答

2 J.Heller Aug 24 2020 at 09:29

関数 $$ r = T\cdot (1+z)^{1/(1+\lambda)} (1-z)^{\lambda/(1+\lambda)} $$必要以上に複雑なようです。2パラメータの卵方程式の別の形式は、合計次数3の代数曲線です。$x^2 + a_0y^2 + a_1xy^2 = 1$、 どこ $$ a_0 = \frac{1 + x_{\textrm{max}}^2}{y_{\textrm{max}}^2} $$ そして $$ a_1 = \frac{-2x_{\textrm{max}}}{y_{\textrm{max}}^2}. $$ ザ・ $x_{\textrm{max}}$ パラメータは $x$ 卵が最大値と最小値を持つ値 $y$ 値と $y_{\textrm{max}}$ パラメータはこの最大値です $y$値。この方程式は、楕円方程式の単純な変換から得られます(「楕円形から卵形へ」を参照)。

これは、のこの代数曲線の例です。 $x_{\textrm{max}}=-0.4$ そして $y_{\textrm{max}} = 0.7$

この代数曲線が回転するときの回転面の方程式 $x$ 軸は $$ y^2 + z^2 = \frac{1-x^2}{a_0 + a_1x}. $$ 一次方程式を次のように定義するとします。 $(x,y,z) = \vec{P} + t\vec{v}$、 どこ $\vec{P}$ 線上の点であり、 $\vec{v}$線の方向です。次に、直線と回転面の交点は、変数の3次方程式です。$t$(これはかなり簡単に解決できます)。これは、線と元の卵の方程式との交点の方程式よりも確実に解くのが簡単です。その場合、非線形方程式ソルバーを使用する必要があります。


これは、代数的卵曲線と分数指数卵曲線の比較です。 $x_{\textrm{max}}=-0.2$ そして $y_{\textrm{max}}=0.7$ (a $\lambda$ 1.5の値は $x_{\textrm{max}}$ -0.2の):

上記の分数指数曲線は、極角によってパラメータ化されています $\theta$ 近くのポイントの間隔を広げるため $x=-1$ そして $x=1$曲線の形状が両端でよりよく示されるようにします。分数指数の卵の右端が鋭すぎ(曲率が実際には無限大)、左端が平坦すぎることがわかります。「TheAuk」の論文では、母線曲線の両端の適合度については考慮されていませんでした。この論文では、母線のいくつかの内径のみを計算し、これらの数値を実際の卵の幅の測定値と比較しました。これは、端の形を示すための本物の鶏卵の画像です。

1 Cesareo Aug 25 2020 at 23:06

与えられた $f(x)=r$ の曲線として $-1\le x\le 1$ 周りの革命面 $x$ 軸は次のように取得されます $$S\to F(x,y,z) = f(x)-\sqrt{y^2+z^2}=0$$。今行をとして定義する

$$ 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} $$

交差点 $S\cap L$ を解くことによって得られます $\mu$

$$ G(\mu) = F(x_0+\mu v_x,y_0+\mu v_y, z_0+\mu v_z) = 0 $$

ここに $G(\mu)$ を見つけるための手がかりを与えてくれます $\mu^*$ 満足 $G(\mu^*)=0$ それが存在するとき。

計算 $\mu_m=\arg\max_{\mu}G(\mu)$ もし $G(\mu_m) < 0$ その後 $S,L$交差しません。いつ$G(\mu_m) \gt 0$2つのソリューションがあり、ソリューションとして低い値を選択します。の決定$\mu_m,\mu^*$ ニュートンのような反復手順を使用して、解くことにより実行できます。 $G'(\mu)=0,G(\mu)=0$

必要な反復手順でMATHEMATICAスクリプトに従います。

ここは $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}]

の決定に従います $G(\mu)$ そして $\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]]

そして最後に交点の決定 $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]

の決定のために注意してください $\mu_m$ 反復手順も使用できます。