9

次のように、単位球の表面上のさまざまな点を飛び越える点の軌跡のパラメトリック方程式を見つけようとしています。

  1. 各ジャンプは小さく (pi/4 < d < pi/2)、狭い間隔 ([1.33, 1.34] など) にあります。
  2. ポイントは、球のほとんどの領域をできるだけ迅速かつ均一に訪れます
  3. ポイントは可能な限り異なる「方向ベクトル」に沿って移動します

これは私が試したものです

N = 3600;    % number of points
t = (1:N) * pi / 180;    % parameter
theta_sph = sqrt(2) * t * pi;    % first angle
phi_sph = sqrt(3) * t * pi;    % second angle
rho_sph = 1;    % radius
% Coordinates of a point on the surface of a sphere
x_sph = rho_sph * sin(phi_sph) .* cos(theta_sph);
y_sph = rho_sph * sin(phi_sph) .* sin(theta_sph);
z_sph = rho_sph * cos(phi_sph);

% Check length of jumps (it is intended that this is valid only for small jumps!!!)
aa = [x_sph(1:(N-1)); y_sph(1:(N-1)); z_sph(1:(N-1))];
bb = [x_sph(2:N); y_sph(2:N); z_sph(2:N)];
cc = cross(aa, bb);
d = rho_sph * atan2(arrayfun(@(n) norm(cc(:, n)), 1:size(cc,2)), dot(aa, bb));
figure
plot(d, '.')
figure
plot(diff(d), '.')

% Check trajectory on the surface of the sphere
figure
hh = 1;
h_plot3 = plot3(x_sph(hh), y_sph(hh), z_sph(hh), '-');
hold on
axis square
% axis off
set(gca, 'XLim', [-1 1])
set(gca, 'YLim', [-1 1])
set(gca, 'ZLim', [-1 1])
for hh = 1:N
  h_point3 = plot3(x_sph(hh), y_sph(hh), z_sph(hh), ...
      'o', 'MarkerFaceColor', 'r', 'MarkerEdgeColor', 'r');
  drawnow
  delete(h_point3)
  set(h_plot3, 'XData', x_sph(1:hh))
  set(h_plot3, 'YData', y_sph(1:hh))
  set(h_plot3, 'ZData', z_sph(1:hh))
end

編集 -->誰かがより規則的な軌道を見つけることができますか? 鋭くではなくスムーズに方向転換するという意味での規則的な軌道。審美的な美しさはおまけです。ポイントは、球の表面にできるだけ均一に配置する必要があります。

4

5 に答える 5

2

コードの先頭を変更して、下にある球の回転を導入します。これにより、極に頻繁に戻らない軌道が得られます。「見栄えがする」ようにするには、回転速度の調整が必要になる場合があります (3 つすべてではなく、1 つの軸だけを中心に回転している場合の方が見栄えがよくなります)。rot_angle1は x 軸を中心とした回転、rot_angle2およびrot_angle3は y 軸と z 軸を中心とした回転です。多分これはあなたに少なくともアイデアを与えるでしょう!

N = 3600;    % number of points
t = (1:N) * pi / 180;    % parameter
theta_sph = sqrt(2) * t * pi;    % first angle
phi_sph = sqrt(3) * t * pi;    % second angle
rho_sph = 1;    % radius
rot_angle1 = sqrt(2) * t * pi;
rot_angle2 = sqrt(2.5) * t * pi;
rot_angle3 = sqrt(3) * t * pi;
% Coordinates of a point on the surface of a sphere
x_sph0 = rho_sph * sin(phi_sph) .* cos(theta_sph);
y_sph0 = rho_sph * sin(phi_sph) .* sin(theta_sph);
z_sph0 = rho_sph * cos(phi_sph);

x_sph1 = x_sph0;
y_sph1 = y_sph0.*cos(rot_angle1)-z_sph0.*sin(rot_angle1);
z_sph1 = y_sph0.*sin(rot_angle1)+z_sph0.*cos(rot_angle1);

x_sph2 = x_sph1.*cos(rot_angle2)+z_sph1.*sin(rot_angle2);
y_sph2 = y_sph1;
z_sph2 = -x_sph1.*sin(rot_angle2)+z_sph1.*cos(rot_angle2);

x_sph = x_sph2.*cos(rot_angle3)-y_sph2.*sin(rot_angle3);
y_sph = x_sph2.*sin(rot_angle3)+y_sph2.*cos(rot_angle3);
z_sph = z_sph2;
于 2013-11-01T02:16:45.430 に答える
1

私は便利な matlab のコピーを持っていませんが、あなたの曲線に加えた変更を投稿します。

球面角度には n-finity+1 の異なる定義があるため、明確にする必要があります。私はあなたの定義から逆に、以下を使用しますが、切り替えようとすると間違いを犯すことになります。

  • \phi- z 軸からの角度
  • \theta- xy 平面での投影角度。

パラメータ化

を 0 から pi (包括的) までのNt個の等間隔のポイントの離散セットとします。

\phi(t) = t
\theta = 2 * c * t

かなり単純明快で、球の周りのらせんは と で線形\phiですthetacは、 の完全な回転数を表す定数です\theta。整数である必要はありません。

隣接点

あなたの例でatan2(norm(cross....)は、問題のないベクトル間の角度を計算しますが、問題についての洞察は得られません。問題は球の表面にあります。この事実を使用してください。だから私はこの式を使って点間の距離を考えます

これで、隣接するポイントが見つかります。これらは、これが発生したt +- dtときに発生しtheta +- 2piます。

最初のケースt +- dtでは、計算は簡単cos(gamma) = 1 - 2 c^2 sin^2(t) dt^2です。依存関係は、sin^2(t)極がより密集している理由です。理想的には、このケースを満たすために一定で最小限の and suchtheta(t)phi(t)選択する必要があります。dtheta^2 * sin^2(phi)

2 番目のケースはもう少し難しく、ポイントを「ずらす」ことについての私のコメントが表示されます。dtheta2pi を均等に分割しないような N を選択した場合、 thetaI で球体を完全に回転させた後、前の点の真下に到達することはできません。この場合、ポイント間の距離を比較するには、delta tso that を使用しc delta t = 1ます。次に、 と がdelta phi = delta tありdelta theta = 2 c delta t - 2piます。cの選択に応じて、delta phi小角近似を使用するのに十分小さい場合とそうでない場合があります。

最終的な注意事項

c=0が球を下る直線であることは明らかです。増やすcことで、「スパイラルの密度」が高まり、より多くのカバレッジが得られます。ただし、隣接するポイント間の距離も大きくなります。上記の 2 つの距離式がほぼ等しくなるようcに、 を選択する必要があります。N

EDITは、きれいにするためにいくつかのものをmathbinに移動しました

于 2013-11-01T05:23:23.940 に答える
0
clear all
close all

u = pi/2:(-pi/36):-pi/2;
v = 0:pi/36:2*pi;

nv = length(v);
nu = length(u);

f = myfigure(1);
ax = myaxes(f,1,1);

hold on

for aa = 1:nv
    tv = v(aa);
    for bb = 1:nu
        tu = u(bb);
        x = sin(tu)*cos(tv);
        y = cos(tu)*cos(tv);
        z = sin(tv);
        plot3(x,y,z,'*')
    end
end

編集: myfigure と myaxes は、図と軸を作成するための関数です

于 2013-11-06T07:20:15.673 に答える