基于给定角度数据的颜色渐变Patch绘制技术问询
基于角度数据绘制动态方向的颜色渐变Patch
问题说明
我正在尝试基于给定的角度数据绘制颜色渐变的patch,当前绘制结果与期望效果存在差距,且数组n属于动态模拟的一部分,每次迭代都会更新,因此渐变的斜率和方向必须随n自动调整。
现有数据与代码
数据定义
n = [263.6909 287.9987 262.1933 199.6890 128.5683 71.1718 34.6535 15.2568 6.2683 2.4868 0.9872 0.4063 0.1793 0.0876 0.0487 0.0315 0.0241 0.0221 0.0243 0.0319 0.0495 0.0895 0.1838 0.4174 1.0159 2.5605 6.4504 15.6740 35.5053 72.6566 130.6707 201.9328]; theta=0:(2*pi/32):(2*pi*(32-1)/32); theta(theta>pi) = theta(theta>pi)-2*pi;
当前绘制代码
figure hold on patch(cos(theta), sin(theta), n, 'EdgeColor', 'none'); quiver(0,0,-4.6492,-0.9099,0.5,'k','linewidth',3); axis equal
需求补充(2024年3月12日编辑)
渐变方向需要垂直于浓度峰值点与对向边缘点的连线(即从$\theta(n_{max})$指向$\theta(n_{max}+\pi)$的垂线方向)。我尝试过两种思路:
- 假设渐变是指数衰减模式,沿垂直方向从$n_{max}$衰减至0
- 为数据拟合高斯分布,同时让theta数组的某个点恰好对应峰值位置
效果对比
当前绘制结果与期望效果的对比图如下:
解决方案
要实现随n动态调整方向的渐变patch,按以下步骤操作:
定位峰值与渐变方向
找到n的峰值对应的角度,计算其垂直方向(即渐变方向):[~, idx_max] = max(n); theta_max = theta(idx_max); grad_dir = theta_max + pi/2; % 顺时针垂直方向,可改为- pi/2取逆时针方向生成渐变权重
计算每个顶点在垂直方向的投影,生成指数衰减权重:x = cos(theta); y = sin(theta); dir_vec = [cos(grad_dir), sin(grad_dir)]; proj = x*dir_vec(1) + y*dir_vec(2); proj_norm = (proj - min(proj)) / (max(proj) - min(proj)); decay_weight = exp(-5*(1-proj_norm)); % 调整系数可控制衰减速率绘制渐变Patch
结合原数据与衰减权重,生成渐变数据后绘制:grad_n = n .* decay_weight; figure; hold on; patch(x, y, grad_n, 'EdgeColor', 'none'); quiver(0,0,-4.6492,-0.9099,0.5,'k','linewidth',3); axis equal; colormap jet; colorbar;
高斯拟合方案
若采用高斯拟合思路,先拟合n的分布,再结合垂直衰减:
gauss_fun = @(p, t) p(1)*exp(-((t-p(2))/p(3)).^2); p0 = [max(n), theta_max, pi/4]; % 初始参数 [p_fit, ~] = lsqcurvefit(gauss_fun, p0, theta, n); fit_n = gauss_fun(p_fit, theta); grad_n_fit = fit_n .* decay_weight; patch(x, y, grad_n_fit, 'EdgeColor', 'none');
内容的提问来源于stack exchange,提问作者jarhead
相关产品推荐
相关产品推荐

