특정 회전 표면이있는 선의 교차점
아트 프로젝트의 일환 으로이 백서에 설명 된 모델에 정의 된대로 계란을 레이트 레이싱하는 프로그램을 작성하려고합니다 . 이 프로그램을 작성하는 과정에서 3 차원 공간의 선과 그 논문의 방정식을 회전시켜 얻은 표면 사이의 교차점을 계산하려고합니다.
$ 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 좌표를 찾을 수 있고 그로부터 전체 좌표를 찾을 수 있습니다. 이것은 계란을 렌더링하기에 충분할 것입니다.
답변
함수 $$ 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$ (ㅏ $\lambda$ 값 1.5는 $x_{\textrm{max}}$ -0.2의) :


위의 분수 지수 곡선은 극각으로 매개 변수화됩니다. $\theta$ 가까운 지점의 더 나은 간격을 얻으려면 $x=-1$ 과 $x=1$곡선의 모양이 끝에서 더 잘 나타나도록합니다. 분수 지수 계란의 오른쪽 끝이 너무 날카 롭고 (실제로 곡률이 무한함) 왼쪽 끝이 너무 평평하다는 것을 알 수 있습니다. "The Auk"의 논문은 generatrix 곡선 끝 부분의 적합도를 고려하지 않았습니다. 이 논문은 모계의 내경을 몇 개만 계산하고이 수치를 실제 계란의 너비 측정치와 비교했습니다. 다음은 끝 부분의 모양을 보여주는 실제 닭고기 달걀 이미지입니다.

주어진 $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$우리는 두 가지 솔루션을 가지고 있으며 더 낮은 값을 솔루션으로 선택합니다. 결정$\mu_m,\mu^*$ Newton과 같은 반복 절차를 사용하여 $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$ 반복적 인 절차도 사용할 수 있습니다.