MATLAB极坐标系下两条曲线围成区域着色问题求助
MATLAB极坐标曲线及围成区域着色实现方案
核心思路
先确定两条极坐标曲线的交点,分区间处理不同区域的内外关系,通过直角坐标转换完成区域填充(MATLAB的fill函数在直角坐标系下更易精准控制填充范围)。
完整代码
% 生成高精度θ采样点,保证曲线平滑 theta = linspace(0, 2*pi, 1000); r1 = 3*sin(theta); r2 = 1 + sin(theta); % 计算两条曲线的交点θ值:π/6 和 5π/6 theta_intersect1 = pi/6; theta_intersect2 = 5*pi/6; % -------------------------- 分区间处理填充区域 -------------------------- % 区间1:0 → π/6,r2在r1外侧,填充r1到r2之间的区域 theta_1 = linspace(0, theta_intersect1, 200); r1_1 = 3*sin(theta_1); r2_1 = 1 + sin(theta_1); % 极坐标转直角坐标 x1_1 = r1_1 .* cos(theta_1); y1_1 = r1_1 .* sin(theta_1); x2_1 = r2_1 .* cos(theta_1); y2_1 = r2_1 .* sin(theta_1); % 区间2:π/6 → 5π/6,r1在r2外侧,填充r2到r1之间的区域 theta_2 = linspace(theta_intersect1, theta_intersect2, 200); r1_2 = 3*sin(theta_2); r2_2 = 1 + sin(theta_2); x1_2 = r1_2 .* cos(theta_2); y1_2 = r1_2 .* sin(theta_2); x2_2 = r2_2 .* cos(theta_2); y2_2 = r2_2 .* sin(theta_2); % 区间3:5π/6 → 2π,r2在r1外侧,填充r1到r2之间的区域 theta_3 = linspace(theta_intersect2, 2*pi, 200); r1_3 = 3*sin(theta_3); r2_3 = 1 + sin(theta_3); x1_3 = r1_3 .* cos(theta_3); y1_3 = r1_3 .* sin(theta_3); x2_3 = r2_3 .* cos(theta_3); y2_3 = r2_3 .* sin(theta_3); % -------------------------- 绘制图形 -------------------------- polarplot(theta, r1, 'k', 'LineWidth', 1.5); hold on; polarplot(theta, r2, 'b', 'LineWidth', 1.5); % 填充三个区间的重叠区域,设置透明度方便观察 fill([x1_1, fliplr(x2_1)], [y1_1, fliplr(y2_1)], 'r', 'FaceAlpha', 0.3); fill([x2_2, fliplr(x1_2)], [y2_2, fliplr(y1_2)], 'r', 'FaceAlpha', 0.3); fill([x1_3, fliplr(x2_3)], [y1_3, fliplr(y2_3)], 'r', 'FaceAlpha', 0.3); % 配置图表元素 legend('r=3sinθ', 'r=1+sinθ', '围成区域', 'Location', 'northoutside'); title('极坐标曲线及围成区域着色'); hold off;
关键说明
- 交点计算:解方程
3sinθ = 1+sinθ得sinθ=0.5,对应θ=π/6和5π/6,这是两条曲线的主要交点。 - 直角坐标转换:极坐标转直角坐标公式为
x=r*cosθ、y=r*sinθ,负r值会自动对应到θ+π方向的点,无需额外处理。 - 区域填充逻辑:
- 0到π/6、5π/6到2π区间:
r2始终大于r1,填充r1到r2的环形区域。 - π/6到5π/6区间:
r1大于r2,填充r2到r1的环形区域。
- 0到π/6、5π/6到2π区间:
- 平滑性保障:使用
linspace生成足够多的采样点(如1000个),避免曲线出现锯齿。
内容的提问来源于stack exchange,提问作者confused coder
相关产品推荐
相关产品推荐

