gpt4 book ai didi

matlab - 球体表面上的最佳轨迹

转载 作者:太空宇宙 更新时间:2023-11-03 19:20:49 25 4
gpt4 key购买 nike

我试图找到一个点跳过单位球体表面不同点的轨迹的参数方程,使得:

  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

编辑 --> 谁能找到更规则的轨迹,也许可以更快(即跳跃次数最少)且更均匀地覆盖球体?从某种意义上说,规则轨迹应该平滑地改变方向,而不是急剧地改变方向。审美之美是一种奖励。这些点应尽可能均匀地分布在球体表面。

最佳答案

修改代码的开头以引入基础球体的旋转。这给出了不会频繁返回两极的轨迹。可能需要对旋转速度进行一些调整才能看起来“不错”(并且当它仅围绕一个轴而不是所有 3 个轴旋转时它可能看起来更好)。 rot_angle1是绕x轴旋转,rot_angle2rot_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;

关于matlab - 球体表面上的最佳轨迹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19668398/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com