function fig_geo_q4_mincover() %FIG_GEO_Q4_MINCOVER 问题四:31 点最小命中集与前向半盘覆盖语义。 S = fig_style(); D = load_data(S, 'geo_q4'); H = geom_helpers(); fig = figure('Color', 'w', 'Visible', 'off'); t = tiledlayout(fig, 1, 2, 'TileSpacing', 'compact', 'Padding', 'compact'); % 左:Ω 内的 31 个覆盖点 ax1 = nexttile(t); hold(ax1, 'on'); hw = H.circle(ax1, [0 0], D.omega_r, pick_color(S, 'primary'), 1.2, '-'); hp = plot(ax1, D.points(:, 1), D.points(:, 2), 'o', 'MarkerSize', 5, ... 'MarkerFaceColor', pick_color(S, 'accent'), 'MarkerEdgeColor', 'none'); hold(ax1, 'off'); axis(ax1, 'equal'); xlim(ax1, [-D.half, D.half]); ylim(ax1, [-D.half, D.half]); xlabel(ax1, 'x / m'); ylabel(ax1, 'y / m'); legend(ax1, [hw, hp], D.legend, 'Location', 'southoutside', ... 'Orientation', 'horizontal'); % 右:前向半盘(朝向未知,±90°) ax2 = nexttile(t); hold(ax2, 'on'); H.poly(ax2, D.half_disk, pick_color(S, 'accent'), 0.30, 'none', 0.5); H.circle(ax2, [0 0.5], 0.85, pick_color(S, 'muted'), 0.9, '-'); plot(ax2, [0 0], [0.5 - 0.85, 0.5 + 0.85], '--', ... 'Color', pick_color(S, 'accent'), 'LineWidth', 1.0); H.arrow(ax2, [0 0.5], [0.85 0.5], pick_color(S, 'accent')); text(ax2, 0.425, 0.30, D.radius_label, 'HorizontalAlignment', 'center', ... 'Interpreter', 'none'); text(ax2, 0.0, 1.55, D.heading_label, 'HorizontalAlignment', 'center', ... 'Interpreter', 'none'); hold(ax2, 'off'); axis(ax2, 'equal'); xlim(ax2, [-1.15 1.35]); ylim(ax2, [-0.55 1.75]); axis(ax2, 'off'); fig_save(fig, S, 'geo-q4-minimum-cover-31-points.png'); end