# 刷 xhs 看到的题

Authors: Fanyi Pu, GPT-6 Astra

Published: 2026-10-09

Canonical: <https://pufanyi.com/blog/math/rope-and-walls>

长度为 s 的绳子，借助夹角为 θ 的两面墙，最多围出多大面积？从无限射线的扇形解出发，推导有限墙长下的圆弧、端点约束与数值求解。

刷 xhs 刷到学弟的一个题，就写了一下。[xhs 连接](https://www.xiaohongshu.com/discovery/item/6ac82a8e00000000140012dc?source=webshare\&xhsshare=pc_web\&xsec_token=AB4IxCB2dQACsLbJ-TC6lb9dLCEci8nt48kY6Hjujv5-E=\&xsec_source=pc_share)

给你一根长度为 $s$ 的绳子，以及两面夹角为 $\theta$ 的墙。借助墙作为边界，最多能围出多大面积？如果两面墙不再无限长，而是长度分别为 $x,y$ 的线段，答案又会怎样变化？

## 题目

两面墙在墙角 $O$ 相交，夹角满足 $0<\theta<\pi$，角度用**弧度**表示。绳长 $s>0$ 固定，绳子柔软、不可伸长，可以弯曲，也可以自由选择形状。

将绳子的两个端点分别系在两面墙上的 $A,B$，让绳子与墙段 $OA,OB$ 组成一个简单闭合边界。系绳点可以沿墙移动，绳子不能自交；墙段不消耗绳长。

分别考虑三种情况：

1. **无限墙**：两面墙是从 $O$ 出发的无限长射线，围出的区域必须位于夹角内部。
2. **有限墙，允许穿墙**：两面墙是长度分别为 $x,y>0$ 的线段。系绳点不能超过墙端，但绳子可以穿过未参与围边的墙段。
3. **有限墙，不能穿墙**：墙长和端点范围与第二种情况相同，绳子不能穿过真实墙段，但可以绕过墙端。墙的延长线不构成障碍。

两种有限墙模型都允许区域伸到原来夹角之外，并始终要求绳子与 $OA,OB$ 组成不自交的闭合边界。

**求能够围出的最大面积，以及达到这个面积时的绳子形状和系绳点位置。**

允许 $A$ 或 $B$ 取到 $O$，即其中一段被利用的墙长为零。未作为外边界的墙段可以留在区域内部。如果额外要求两面墙都必须利用正长度，那么后面某些退化情形只能给出上确界，而不能取到最大值。

墙提供两条边，绳子补上弯曲的一边

墙提供两条边，绳子补上弯曲的一边

从墙角 O 沿第一面墙走到 A，再沿绳子走到 B，最后沿第二面墙回到 O。阴影就是要最大化的面积；B 后面那一小段墙没有参与围边。 本图绳长 2.000，圆弧角 149.4 度。所围面积 1.353354。

A

B

O

[View diagram in the original article](https://pufanyi.com/blog/math/rope-and-walls)

绳长 2 · 面积 1.353354

从墙角 O 沿第一面墙走到 A，再沿绳子走到 B，最后沿第二面墙回到 O。阴影就是要最大化的面积；B 后面那一小段墙没有参与围边。

先用交互图观察绳子的形状。图中固定墙长 $x=1,y=2$，夹角初始为 $\theta=\pi/3$，可用「墙夹角」滑块在 $5^\circ$ 到 $175^\circ$ 之间调整：拖动 A、B，或者调整对应滑块，改变 $OA,OB$；再拖动绳长滑块，观察圆弧怎样从接近直线变成大圆弧。图中的墙不会随端点移动而伸长。

拖动图中的 A、B 改变端点位置，用滑块调整墙夹角和绳长，观察圆弧变化。调整滑块时视图自动缩放，直接拖动端点时比例保持固定。

可调整夹角、端点与绳长的圆弧

墙夹角可调，初始为六十度。第一面墙长一，第二面墙长二。A 沿水平墙移动，B 沿斜墙移动；棕色曲线表示绳子，虚线表示弦。

O

A

B

[View diagram in the original article](https://pufanyi.com/blog/math/rope-and-walls)

弦长 1.480 · 面积 1.353 · 圆弧角 149.4°

小圆弧：绳子尚未达到半圆。这是当前端点的圆弧，端点位置并未自动优化。

初始状态：夹角六十度，两面墙长分别为一、二，使用墙长一、1.7，绳长二。拖动端点只改变使用的墙长，调整夹角会旋转第二面墙，实际墙长保持不变；增大绳长会让圆弧逐渐鼓起。虚线不是绳子。若图形碰到剩余墙段，会单独标明不可行。

先按“扇形”，观察两端垂直墙面的形状；再按“大圆弧”，看绳子绕过墙端。保持端点不动，逐渐减小绳长，直到弧线拉直；继续减小，绳子就连接不了两个端点了。图中显示的是**当前端点对应的圆弧**；要寻找最大面积，还需要比较不同端点位置。

## 无限墙

先考虑两面无限长的墙。固定端点可以先确定绳子的形状，再让端点沿墙移动，找出面积最大的构造。

### 为什么绳子应该是一段圆弧？

先固定 $A,B$。它们与 $O$ 组成的三角形已经固定，我们能改变的只是绳子与弦 $AB$ 之间的面积。这就是[固定端点的 Dido 问题](https://www.homepages.ucl.ac.uk/~ucahmto/latex_html/chapter2_latex2html/node9.html)：在端点与曲线长度固定时，怎样使弓形面积最大？

先看绳子“弯得多急”。想象沿绳子走，脚下的切线方向就是前进方向。走过同样长的一小段，方向转得越多，曲率就越大。若这段弧长为 $\Delta\ell$，切线转过的角度为 $\Delta\varphi$，那么局部曲率的大小约为 $|\Delta\varphi|/\Delta\ell$，让弧长趋于零，这个比值的极限就是该点的[曲率大小](https://ocw.mit.edu/ans7870/18/18.013a/textbook/chapter15/section03.html)。圆上有 $\Delta\ell=R\Delta\varphi$，所以半径为 $R$ 的圆处处有 $\kappa=1/R$：小圆弯得急，大圆弯得缓，直线的曲率为零。

缓弯：走一段，方向转得少

缓弯：走一段，方向转得少

圆弧半径为 2，弧长均为 1.8，切线方向转过 0.9 弧度。T 沿绳子指向前进方向，n 指向区域外侧，C 在内侧。

C

R

T

n

[View diagram in the original article](https://pufanyi.com/blog/math/rope-and-walls)

$R=2,\quad \kappa=0.5,\quad \Delta\varphi=0.9$

急弯：走一样远，方向转得多

急弯：走一样远，方向转得多

圆弧半径为 1，弧长均为 1.8，切线方向转过 1.8 弧度。T 沿绳子指向前进方向，n 指向区域外侧，C 在内侧。

C

R

T

n

[View diagram in the original article](https://pufanyi.com/blog/math/rope-and-walls)

$R=1,\quad \kappa=1,\quad \Delta\varphi=1.8$

两图比例相同，棕色弧的长度也相同。沿弧从右向左走，蓝色箭头 T 随之转向；右图的方向变化更大，所以曲率更大。n 垂直绳子、朝向外侧，圆心 C 位于反方向。这里用两段圆弧说明局部弯曲程度，并未假设整根绳子已经是圆。

现在试着把一小段绳子沿外法线推出距离 $u$。它扫过的窄带增加了面积；对于图中向外鼓起的弧段，这也需要更多绳长。为了判断这样的推挤能否改善形状，需要分别计算面积和长度的变化。

这种微小形变称为变分。先考虑绳长大于端点距离、两端固定的情形，在光滑曲线中寻找使面积取极值的候选形状。驻点条件给出候选后，还需要证明它达到全局最大值。

沿围出区域的边界逆时针走，绳子这一段从 $A$ 走到 $B$。用原曲线的弧长 $\ell$ 作参数，记绳子为 $\gamma(\ell)$，单位切向量为 $T$，外法向量为 $n$。曲率 $\kappa$ 的符号约定为：向外鼓起的圆弧取正值。于是

$$
\gamma'=T,\qquad T'=-\kappa n,\qquad n'=\kappa T.
$$

现在只推挤绳子的内部：把位置 $\ell$ 沿外法线移动 $\varepsilon f(\ell)$，其中 $f$ 在端点附近为零。正的 $f$ 表示向外推，负的 $f$ 表示向内收。扰动后的曲线是

$$
\gamma_\varepsilon(\ell)
=\gamma(\ell)+\varepsilon f(\ell)n(\ell).
$$

只挪动内部，两个端点不动

只挪动内部，两个端点不动

同一条曲线的左侧沿外法线向外推，绿色窄带表示增加的面积；右侧沿外法线的反方向向内收，棕色窄带表示失去的面积。扰动在两端附近为零。虚线表示扰动后的曲线。

A

B

向外推

向内收

区域内部

[View diagram in the original article](https://pufanyi.com/blog/math/rope-and-walls)

$\gamma_\varepsilon=\gamma+\varepsilon f n$

实线是原绳子，虚线是移动后的绳子，箭头沿原曲线的法线。向外推时 f 为正，向内收时 f 为负；移动距离为了看清而放大。两块窄带分别增加、减少面积，这幅图只示意允许的动作，尚未要求两处长度变化抵消。

这里 $\ell$ 只是原曲线的弧长参数；扰动之后，不再要求 $\gamma_\varepsilon$ 仍以单位速度走过。下面用 $\mathcal A$ 表示面积、$L$ 表示绳子的实际长度，$\delta$ 表示对 $\varepsilon$ 求导后取 $\varepsilon=0$。

**面积怎样变？** 一小段长度为 $\mathrm d\ell$ 的绳子向外移动 $\varepsilon f$，一阶增加的是一条宽为 $\varepsilon f$ 的窄带。因此

$$
\delta\mathcal A=\int_0^s f(\ell)\,\mathrm d\ell.
$$

**长度怎样变？** 先看一小段圆弧：向外平移 $u$ 后，半径从 $R$ 变成 $R+u$，两端半径之间的角度 $\Delta\varphi$ 不变。原弧长是 $\Delta\ell=R\Delta\varphi$，新弧长是 $(R+u)\Delta\varphi$，所以多用的绳长为

$$
\Delta L=u\Delta\varphi=\frac{u}{R}\Delta\ell=\kappa u\Delta\ell.
$$

缓弯向外推：较少的长度成本

缓弯向外推：较少的长度成本

原圆弧半径 2、弧长 1.8，沿外法线推出 0.2。保持两条半径的方向不变，新弧长增加 0.18；绿色表示扫过的窄带。

C

R

u

[View diagram in the original article](https://pufanyi.com/blog/math/rope-and-walls)

$\Delta L=0.18,\quad \Delta\mathcal A\approx 0.36$

急弯向外推：两倍的长度成本

急弯向外推：两倍的长度成本

原圆弧半径 1、弧长 1.8，沿外法线推出 0.2。保持两条半径的方向不变，新弧长增加 0.36；绿色表示扫过的窄带。

C

R

u

[View diagram in the original article](https://pufanyi.com/blog/math/rope-and-walls)

$\Delta L=0.36,\quad \Delta\mathcal A\approx 0.36$

沿用上面的两段弧：原弧长都为 1.8，向外移动距离都为 0.2。虚线新弧与原弧夹着绿色窄带；它们的面积增量在一阶相同，右图的长度增量却是左图的两倍。这里截取的是内部小段，截面的端点可以移动；完整扰动会在两旁平滑地降为零。面积只比较一阶项，有限宽度下还有二阶差异。

对于一般光滑曲线，推挤幅度 $f$ 可以沿绳子变化。对扰动曲线求导，利用 $n'=\kappa T$，得到

$$
\gamma_\varepsilon'
=(1+\varepsilon\kappa f)T+\varepsilon f'n.
$$

因为 $T,n$ 正交且都是单位向量，扰动后的长度就是

$$
L[\gamma_\varepsilon]
=\int_0^s\sqrt{(1+\varepsilon\kappa f)^2+\varepsilon^2(f')^2}\,\mathrm d\ell.
$$

对 $\varepsilon$ 求导后取零，便得到

$$
\delta L=\int_0^s\kappa(\ell)f(\ell)\,\mathrm d\ell.
$$

这正好解释了前面的直觉：同样向外移动一小段距离，面积收益的一阶系数是 $1$，长度成本的一阶系数却是局部曲率 $\kappa$。

这也给出一个具体的改进方向。假设两小段都向外鼓起，急弯处的曲率是缓弯处的两倍：在急弯处向内收，省下一点绳长；再把它用在缓弯处向外推。一阶近似下，得到的面积是失去面积的两倍，总面积便增加了。只要还能这样调配，原来的形状就不是最优。要得到所有局部扰动都必须满足的驻点条件，还需要把固定绳长的约束纳入计算。

但任意的 $f$ 未必保持绳长，所以不能直接要求 $\delta\mathcal A=0$。对约束 $L=s$ 引入拉格朗日乘子，考虑

$$
\mathcal J[\gamma]
=\mathcal A[\gamma]-\lambda\bigl(L[\gamma]-s\bigr).
$$

这里只约束**总长度这一个数**，所以 $\lambda$ 是一个常数，不是沿绳子变化的函数。最优曲线必须使

$$
0=\delta\mathcal J
=\int_0^s\bigl(1-\lambda\kappa(\ell)\bigr)f(\ell)\,\mathrm d\ell
$$

对任意这样的局部推挤 $f$ 都成立。若某处 $1-\lambda\kappa$ 不为零，就能在那一小段选择同号的 $f$，让积分不为零。因此

$$
\boxed{\kappa(\ell)=\frac1\lambda=\text{常数}.}
$$

**为什么恒定曲率就意味着圆？** 考察绳子上每一点沿法线偏移 $-\lambda$ 后的位置：

$$
C(\ell)=\gamma(\ell)-\lambda n(\ell).
$$

那么

$$
C'(\ell)=T-\lambda\kappa T=0.
$$

所以 $C$ 是一个固定点，并且

$$
|\gamma(\ell)-C|=|\lambda|
$$

处处成立。绳子上的每一点到同一个点的距离相同，绳形自然就是一段圆弧。对于向外鼓起的最优分支，$\kappa>0$，于是 $\lambda=R$。

面积变分的窄带解释，怎样写成积分证明？

取墙角 $O$ 为坐标原点。两条直墙段对有向面积积分的贡献为零，因此由 Green 公式，

$$
\mathcal A[\gamma]
=\frac12\int_0^s\gamma\times\gamma'\,\mathrm d\ell,
$$

其中二维叉积定义为 $(u_1,u_2)\times(v_1,v_2)=u_1v_2-u_2v_1$。令一般的扰动向量为 $V$，对上式求变分并分部积分：

$$
\begin{aligned}
\delta\mathcal A
&=\frac12\int_0^s(V\times T+\gamma\times V')\,\mathrm d\ell\\
&=\int_0^s V\times T\,\mathrm d\ell
+\frac12[\gamma\times V]_A^B.
\end{aligned}
$$

固定端点时，边界项为零。又因为逆时针边界的外法线是 $T$ 顺时针旋转九十度的结果，$V\times T=V\cdot n$。代入 $V=fn$，就得到 $\delta\mathcal A=\int f\,\mathrm d\ell$。

即使端点沿墙滑动，边界项仍然为零：在每个端点处，位置向量 $\gamma$ 与允许的位移 $V$ 都沿着同一面墙，叉积为零。这一点会在下面推导端点条件时用到。

变分到这里给出了**必要条件**。全局最优性还要另证：把候选圆弧补成一个整圆，再把同一段补弧接到任何其他等长曲线上。拼接后的总长度始终等于这个圆的周长；如果其他曲线贡献的有向面积更大，拼接后的有向面积就会超过圆，违反等周不等式。因此，选定端点后，这段向外鼓起的圆弧确实达到全局最大值。这里使用的有向面积版本也允许拼接曲线发生自交。

圆弧不一定是小于半圆的劣弧。端点很近而绳子很长时，最优形状会接近一整个圆，只留下很短的一条弦。

绳子略长于弦

绳子略长于弦

固定同一对端点，弦长均为一，三图比例相同。这里只改变绳长：圆弧从不足半圆变成超过半圆。虚线是弦，不是绳子；第三图的较大面积来自更多绳长，不能拿它当作等绳长比较。 本图绳长 1.100，圆弧角 85.8 度。各图端点和弦长完全相同。

A

B

[View diagram in the original article](https://pufanyi.com/blog/math/rope-and-walls)

绳长 1.100 · 圆弧角 85.8°

恰好围成半圆

恰好围成半圆

固定同一对端点，弦长均为一，三图比例相同。这里只改变绳长：圆弧从不足半圆变成超过半圆。虚线是弦，不是绳子；第三图的较大面积来自更多绳长，不能拿它当作等绳长比较。 本图绳长 1.571，圆弧角 180.0 度。各图端点和弦长完全相同。

A

B

[View diagram in the original article](https://pufanyi.com/blog/math/rope-and-walls)

绳长 1.571 · 圆弧角 180.0°

继续加长，变成大圆弧

继续加长，变成大圆弧

固定同一对端点，弦长均为一，三图比例相同。这里只改变绳长：圆弧从不足半圆变成超过半圆。虚线是弦，不是绳子；第三图的较大面积来自更多绳长，不能拿它当作等绳长比较。 本图绳长 3.000，圆弧角 261.1 度。各图端点和弦长完全相同。

A

B

[View diagram in the original article](https://pufanyi.com/blog/math/rope-and-walls)

绳长 3.000 · 圆弧角 261.1°

固定同一对端点，弦长均为一，三图比例相同。这里只改变绳长：圆弧从不足半圆变成超过半圆。虚线是弦，不是绳子；第三图的较大面积来自更多绳长，不能拿它当作等绳长比较。

### 圆心为什么恰好是墙角？

固定端点的结论还不够，因为端点也能沿墙滑动。设最优圆弧的半径为 $R$。如果绳子在系绳点处与墙不垂直，沿墙移动端点，就会一阶改变绳长；端点扫过的面积却只有二阶大小。把省下来的绳长放到圆弧上向外扩张，就能增加面积。因此，自由滑动的端点处，绳子必须与墙垂直。

圆的切线与半径垂直，所以对应的半径必须沿着墙。两面墙上的端点都自由，圆心就必须同时在两条墙线上，只能是交点 $O$。

变分中的边界项，直接给出“端点垂直墙面”

现在允许端点移动，令 $V$ 为曲线的扰动向量，$f=V\cdot n$ 为它的外法向分量。对长度求变分并分部积分，不能再丢掉端点项：

$$
\delta L
=\int_0^s T\cdot V'\,\mathrm d\ell
=[T\cdot V]_A^B+\int_0^s\kappa f\,\mathrm d\ell.
$$

前面已经证明，端点沿墙移动时，面积变分仍为 $\delta\mathcal A=\int f\,\mathrm d\ell$。因此

$$
\delta\mathcal J
=\int_0^s(1-\lambda\kappa)f\,\mathrm d\ell
-\lambda T(B)\cdot V(B)+\lambda T(A)\cdot V(A).
$$

绳子内部已经满足 $1-\lambda\kappa=0$，剩下的恰好是两个边界项。记两条墙从 $O$ 向外的单位方向为 $e_1,e_2$，端点允许的位移为

$$
V(A)=\delta a\,e_1,\qquad V(B)=\delta b\,e_2.
$$

若端点处于墙段内部，$\delta a,\delta b$ 可以独立地取正值或负值。为了使 $\delta\mathcal J=0$ 对所有这些移动成立，必须有

$$
\boxed{T(A)\cdot e_1=0,\qquad T(B)\cdot e_2=0.}
$$

也就是说，**绳子的切线垂直墙面**。于是圆心位于两条墙线上，只能是 $O$。

有限墙也遵循同一个推导，只是端点碰到墙端后，位移只能向墙内取值。此时变分条件变成单边不等式，不再要求相应的点积为零，所以固定在墙端的绳子不必垂直墙面。这正是后面圆心能够离开 $O$ 的原因。

两个直角，把圆心钉在墙角

两个直角，把圆心钉在墙角

蓝色短线表示绳子在端点的切线，小方框标出直角。端点可自由滑动时，切线必须垂直墙面，于是半径沿墙，两个半径的交点就是 O。图中的墙继续延伸，端点并未被墙端限制。 本图绳长 1.047，圆弧角 60.0 度。所围面积 0.523599。

A

B

O

[View diagram in the original article](https://pufanyi.com/blog/math/rope-and-walls)

绳长 1.047 · 面积 0.523599

蓝色短线表示绳子在端点的切线，小方框标出直角。端点可自由滑动时，切线必须垂直墙面，于是半径沿墙，两个半径的交点就是 O。图中的墙继续延伸，端点并未被墙端限制。

图中的两个直角分别确定一条半径的方向：两条半径沿墙面相交于 $O$，绳子的中间部分则沿圆弧向外鼓起。

于是最优区域是半径为 $R$、圆心角为 $\theta$ 的扇形。绳子只负责弧边，因此

$$
s=R\theta,
\qquad
A=\frac12R^2\theta.
$$

消去半径，得到

$$
\boxed{R=\frac{s}{\theta},\qquad A_{\max}=\frac{s^2}{2\theta}.}
$$

例如两面墙互相垂直，$\theta=\pi/2$，应围成四分之一圆，面积为 $s^2/\pi$。只借助一面无限长的直墙时，最优形状是半圆，面积为 $s^2/(2\pi)$；直角墙角把这个面积翻了一倍。

怎样排除其他全局最大值？

记 $OA=a,OB=b$。绳子必须能连接两端，所以

$$
a^2+b^2-2ab\cos\theta\le s^2.
$$

对固定的 $0<\theta<\pi$，这使可行的 $a,b$ 有界。因此，可以先在允许所有平面圆弧的更大集合中求最大值，再检查获胜者是否位于夹角内。

两个端点都不在 $O$、且弦长严格小于绳长时，端点都是自由的，上面的垂直条件迫使圆心为 $O$。若一个端点到达 $O$，退化为单墙问题，其最大面积不超过 $s^2/(2\pi)$，严格小于扇形的 $s^2/(2\theta)$。两个端点都在 $O$ 的圆也更小。

弦长恰好等于绳长时，绳子拉成直线，也不可能是最大值：把两端稍微向 $O$ 缩进，使弦短一点，再把余下的长度用于向外鼓起，新增的弓形面积会超过三角形面积的一阶损失。

因此，更大集合中的最大值就是这个扇形，而它也确实位于两面墙之间。这个证明同时给出了上界与可行构造，适用于任意 $0<\theta<\pi$。

## 有限墙，允许穿墙

墙变成有限长以后，端点只能在墙段上移动。先允许绳子穿过未参与围边的墙段，只研究墙长对端点位置的限制。

### 固定端点，算出面积

令两面墙的长度分别为 $x,y$，并记

$$
0\le a=OA\le x,\qquad 0\le b=OB\le y.
$$

有限墙限制了**端点的位置**。圆心可以离开 $O$，因此半径与被利用的墙长可以不同。

为了一次处理小圆弧、半圆和大圆弧，我们用绳子对应的圆心角 $\alpha$ 描述它。注意，$\alpha$ 与墙的夹角 $\theta$ 是两个不同的量。

由余弦定理，两个端点的距离为

$$
d=AB=\sqrt{a^2+b^2-2ab\cos\theta}.
$$

设圆弧半径为 $R$。弧长和弦长分别满足

$$
s=R\alpha,\qquad d=2R\sin\frac{\alpha}{2}.
$$

消去 $R$，就得到决定圆弧的方程：

$$
\boxed{\frac{d}{s}=\frac{2\sin(\alpha/2)}{\alpha},\qquad 0<\alpha<2\pi.}
$$

右侧从 $1$ 严格递减到 $0$。因此，只要 $0<d<s$，就存在唯一的 $\alpha$，直接二分即可。这里必须搜索整个 $(0,2\pi)$；只搜索 $(0,\pi]$ 会漏掉长绳子的答案。

为什么这个方程只有一个解？

令 $u=\alpha/2$，右侧就是 $\sin u/u$。其导数的符号取决于 $u\cos u-\sin u$。又因为

$$
\frac{\mathrm d}{\mathrm du}(\sin u-u\cos u)=u\sin u>0,
\qquad 0<u<\pi,
$$

且括号中的量在 $u=0$ 处趋于零，所以导数严格为负。

小圆弧：三角形加小弓形

小圆弧：三角形加小弓形

沿虚线 AB 切开，绿色部分是墙角三角形，棕色部分是圆弓形。超过半圆时，弓形依然完整位于弦背离 O 的一侧；改变的是圆弧角和圆心位置，面积拆分方法没有改变。两图比较拆分方式，绳长与端点并不相同。 本图绳长 1.300，圆弧角 140.0 度。所围面积 0.687841。

A

B

O

[View diagram in the original article](https://pufanyi.com/blog/math/rope-and-walls)

绳长 1.3 · 面积 0.687841

大圆弧：仍然是两部分相加

大圆弧：仍然是两部分相加

沿虚线 AB 切开，绿色部分是墙角三角形，棕色部分是圆弓形。超过半圆时，弓形依然完整位于弦背离 O 的一侧；改变的是圆弧角和圆心位置，面积拆分方法没有改变。两图比较拆分方式，绳长与端点并不相同。 本图绳长 4.000，圆弧角 234.9 度。所围面积 3.206944。

A

B

O

[View diagram in the original article](https://pufanyi.com/blog/math/rope-and-walls)

绳长 4 · 面积 3.206944

墙角三角形 弦外圆弓形 绳子

沿虚线 AB 切开，绿色部分是墙角三角形，棕色部分是圆弓形。超过半圆时，弓形依然完整位于弦背离 O 的一侧；改变的是圆弧角和圆心位置，面积拆分方法没有改变。两图比较拆分方式，绳长与端点并不相同。

接下来，沿图中的虚线切开，把所围区域拆成绿色的三角形 $OAB$ 与棕色的圆弓形。先算不依赖绳子弯曲方式的三角形：

$$
A_{\triangle OAB}=\frac12ab\sin\theta.
$$

圆弓形的面积是扇形面积减去相应的**有向**三角形面积，即

$$
A_{\text{segment}}=\frac12R^2(\alpha-\sin\alpha).
$$

当 $\alpha>\pi$ 时，$\sin\alpha<0$，这个式子自动给出大弓形的面积，不需要另外拼一个公式。

允许穿墙时，固定 $a,b$ 的最优面积是

$$
\boxed{
F_s(a,b)=\frac12ab\sin\theta
+\frac{s^2}{2\alpha^2}(\alpha-\sin\alpha),
}
$$

其中 $\alpha$ 由上面的弦长方程确定。圆弧选在弦 $AB$ 背离 $O$ 的一侧，使两部分面积相加。由于剩余墙段不构成障碍，这个面积可以直接实现。

三个边界情况也很自然：$d>s$ 时绳子够不到；$d=s$ 时弓形面积为零；$d=0$ 时取极限 $s^2/(4\pi)$，也就是整圆面积。

### 再让端点移动

允许穿墙时，最大面积可以写成

$$
\boxed{
A_{\max}(s,x,y,\theta)
=\max_{\substack{0\le a\le x,\;0\le b\le y\\
 a^2+b^2-2ab\cos\theta\le s^2}}
F_s(a,b).
}
$$

这个表达式已经把“在所有曲线里找最优形状”化成了两个实数的优化。不过，还可以进一步降到一维。

如果两个端点都严格位于各自墙段内部，垂直条件仍然成立，圆心必须为 $O$，所以唯一的内部候选仍然是

$$
a=b=\frac{s}{\theta}.
$$

它只有在

$$
\boxed{s\le\theta\min(x,y)}
$$

时才可行。一旦这个条件成立，有限墙能够实现无限墙的最优扇形，上界也就取到了，直接返回 $s^2/(2\theta)$。

如果扇形放不下，最大值必在端点矩形的边界上。于是只需比较四个一维问题：

$$
\max_{0\le b\le y}F_s(x,b),\quad
\max_{0\le a\le x}F_s(a,y),\quad
\max_{0\le b\le y}F_s(0,b),\quad
\max_{0\le a\le x}F_s(a,0),
$$

每项都只保留 $d\le s$ 的可行部分。最后两项对应一个系绳点到达墙角的单墙情形，也属于题目允许的构造。

每个一维问题都要求找**全局**最大值。由于可能存在多个驻点，整个区间未必单峰，直接三分搜索可能漏掉最优解。可靠的做法是找齐可行区间的端点与驻点，再比较面积。

用面积的导数确定端点驻点

取坐标 $O=(0,0)$、$A=(a,0)$、$B=(b\cos\theta,b\sin\theta)$。令

$$
h=R\cos\frac{\alpha}{2}.
$$

这里 $h$ 是圆心到弦中点的有向距离，大圆弧时它可以为负。圆心 $C=(c_1,c_2)$ 为

$$
\begin{aligned}
c_1&=\frac{a+b\cos\theta}{2}-h\frac{b\sin\theta}{d},\\
c_2&=\frac{b\sin\theta}{2}+h\frac{b\cos\theta-a}{d}.
\end{aligned}
$$

把固定绳长的弓形面积记为 $G_s(d)$。对弦长方程和面积公式求导，可以得到

$$
G_s'(d)=-h.
$$

因此

$$
\begin{aligned}
\frac{\partial F_s}{\partial a}
&=\frac{b\sin\theta}{2}-h\frac{a-b\cos\theta}{d}=c_2,\\
\frac{\partial F_s}{\partial b}
&=\frac{a\sin\theta}{2}-h\frac{b-a\cos\theta}{d}
=c_1\sin\theta-c_2\cos\theta.
\end{aligned}
$$

这给出了不依赖图形直觉的端点条件：$a$ 自由时，圆心落在第一条墙线上；$b$ 自由时，圆心落在第二条墙线上；两者都自由时，圆心为 $O$。

不扫描整个区间：最多三个圆弧驻点就够了

考虑 $a=x$、$b$ 自由的边界。圆心在第二条墙线上，$B$ 既可能是圆与这条射线的远交点，也可能是近交点。分别用 $\varepsilon=1,-1$ 表示这两种情况。沿墙线与垂直墙线的两个方向分解半径，可以得到

$$
x\sin\theta=\varepsilon R\sin\alpha,
\qquad
b=x\cos\theta+\varepsilon R(1-\cos\alpha).
$$

消去 $R=s/\alpha$，得到

$$
\frac{|\sin\alpha|}{\alpha}=\frac{x\sin\theta}{s},
\qquad
b=x\cos\theta+x\sin\theta\tan\frac{\alpha}{2}.
$$

在 $(0,\pi)$ 内，$\sin\alpha/\alpha$ 严格递减，至多有一个解。在 $(\pi,2\pi)$ 内，$-\sin\alpha/\alpha$ 先增后减，分界点是

$$
\beta\cos\beta-\sin\beta=0,
\qquad
\beta\in(\pi,3\pi/2),
\qquad
\beta\approx4.493409458.
$$

因此，将这三个单调区间分别二分，就找齐了所有驻点。把每个解代回 $b$，仅保留 $0<b<y$ 的候选。另一条边界交换 $x,y$ 即可。

矩形角点还要单独检查。两端均在墙端的 $(x,y)$ 直接代入；落在坐标轴上的候选可以进一步简化：由于 $G_s'(d)=-R\cos(\alpha/2)$，弓形面积在 $\alpha=\pi$ 时最大，对应 $d=2s/\pi$。所以两条坐标轴上的最优端点分别是

$$
\left(0,\min\left(y,\frac{2s}{\pi}\right)\right),
\qquad
\left(\min\left(x,\frac{2s}{\pi}\right),0\right).
$$

当扇形不可行时，两个单墙候选、一个双墙端点候选，以及每条固定墙端边界上至多三个驻点，合计最多九个候选，就覆盖了全局最大值。弦长等于绳长的直线边界不会产生最大值，理由与无限墙时相同。

### 短墙用满之后，圆心怎样移动？

为了看清最初的变化，不妨设 $x\le y$。当 $s$ 刚超过 $\theta x$，原来的扇形会先碰到短墙的墙端。此时令 $a=x$，另一个端点暂时仍可沿长墙滑动。

因为 $B$ 自由，圆心 $C$ 必须在长墙所在的直线上。把 $C$ 在这条有向直线上的坐标记为 $t$，并取从扇形连续延伸出来的圆弧分支。短墙端点 $A$ 到长墙线的垂直距离为 $x\sin\theta$；同一个距离也等于 $R\sin\alpha$，所以

$$
R\sin\alpha=x\sin\theta.
$$

结合 $s=R\alpha$，得到

$$
\boxed{\frac{s}{x}=\frac{\alpha\sin\theta}{\sin\alpha},
\qquad \theta\le\alpha<\pi.}
$$

沿长墙方向投影，还可以得到

$$
t=x\cos\theta-R\cos\alpha,
$$

而 $B$ 在圆心前方一个半径处，因此

$$
\boxed{
b=t+R
=x\cos\theta+x\sin\theta\tan\frac{\alpha}{2}.
}
$$

在起点 $\alpha=\theta$，有 $R=x,t=0,b=x$，正好接上扇形。绳子继续变长，$\alpha$ 与 $b$ 随之增大，圆心离开 $O$。

当这个分支碰到长墙端点时，$b=y$，对应

$$
\alpha_*=2\arctan\frac{y-x\cos\theta}{x\sin\theta},
\qquad
s_*=\frac{x\sin\theta\,\alpha_*}{\sin\alpha_*}.
$$

这个连续分支描述了短墙用满后，另一个端点怎样沿长墙移动。要确定给定绳长下的全局最优形状，仍需将它与其他边界候选比较，其中也包括只利用一面墙的构造。

两端自由

两端自由的绳子与墙示意图

墙角为六十度，墙长分别为一和二，绳长为1。阴影面积为0.477465。粗曲线是绳子，直线是实际墙段，虚线是端点之间的弦。圆心与墙角 O 重合。

O

A

B

[View diagram in the original article](https://pufanyi.com/blog/math/rope-and-walls)

绳长 1 · 面积 0.477465

短墙端点固定

短墙端点固定的绳子与墙示意图

墙角为六十度，墙长分别为一和二，绳长为2。阴影面积为1.386966。粗曲线是绳子，直线是实际墙段，虚线是端点之间的弦。圆心 C 在长墙线上。

O

A

B

C

[View diagram in the original article](https://pufanyi.com/blog/math/rope-and-walls)

绳长 2 · 面积 1.386966

两端固定，大圆弧

两端固定，大圆弧的绳子与墙示意图

墙角为六十度，墙长分别为一和二，绳长为4。阴影面积为3.206944。粗曲线是绳子，直线是实际墙段，虚线是端点之间的弦。圆弧超过半圆，绕过短墙端点。

O

A

B

C

[View diagram in the original article](https://pufanyi.com/blog/math/rope-and-walls)

绳长 4 · 面积 3.206944

同一对有限墙，三种绳长：圆心和端点随约束改变，大圆弧可以伸到墙的延长线之外。

图中取 $\theta=\pi/3,x=1,y=2$，三幅图使用相同的长度比例。实线是实际墙段，粗曲线是绳子，虚线是弦 $AB$，阴影是围出的区域。圆心从墙角 $O$ 移到长墙线上，最后在两个端点都固定时离开两条墙线；第三幅图的绳子已经绕过短墙端点，伸到夹角之外。

### 一个数值例子，以及长绳子的反直觉之处

继续取 $\theta=\pi/3,x=1,y=2$。用统一公式比较端点边界，可以得到下面的数值结果，均四舍五入到六位小数：

| 绳长 $s$ | 使用第一面墙 $a$ | 使用第二面墙 $b$ | 圆弧角 $\alpha$ | 最大面积        |
| ------ | ---------- | ---------- | ------------ | ----------- |
| $1$    | $0.954930$ | $0.954930$ | $1.047198$   | $0.477465$  |
| $2$    | $1$        | $1.925377$ | $2.049649$   | $1.386966$  |
| $4$    | $1$        | $2$        | $4.099298$   | $3.206944$  |
| $10$   | $1$        | $2$        | $5.324652$   | $11.699509$ |
| $30$   | $0$        | $2$        | $5.888082$   | $81.421511$ |

前两行分别是扇形与短墙受限的圆弧。第三行已经有 $\alpha>\pi$，是大圆弧。最后一行却把第一面墙的使用长度变成了零：绳子从 $O$ 出发，绕出一个大弓形，再接到第二面墙的墙端。

两面墙都用满

两面墙都用满

这次两图的绳长、墙长、夹角和绘图比例完全相同：绳长为十，两面墙各长一，夹角三十度。右图的弦更长，围出的面积也更大。第一面墙留在区域内部，绳子从它的墙端外面绕过，没有穿墙。 本图绳长 10.000，圆弧角 342.2 度。所围面积 9.049452。

A

B

O

[View diagram in the original article](https://pufanyi.com/blog/math/rope-and-walls)

绳长 10 · 面积 9.049452

把一个端点移到墙角

把一个端点移到墙角

这次两图的绳长、墙长、夹角和绘图比例完全相同：绳长为十，两面墙各长一，夹角三十度。右图的弦更长，围出的面积也更大。第一面墙留在区域内部，绳子从它的墙端外面绕过，没有穿墙。 本图绳长 10.000，圆弧角 326.9 度。所围面积 9.604790。

B

O / A

[View diagram in the original article](https://pufanyi.com/blog/math/rope-and-walls)

绳长 10 · 面积 9.604790

这次两图的绳长、墙长、夹角和绘图比例完全相同：绳长为十，两面墙各长一，夹角三十度。右图的弦更长，围出的面积也更大。第一面墙留在区域内部，绳子从它的墙端外面绕过，没有穿墙。

为了让差别在图上更明显，上图另取两面等长的墙与三十度夹角。左图两段墙都在外边界上；右图只把其中一段墙作为外边界，另一段墙留在围出的区域内部。图中标出的面积表明：只利用一面墙作为外边界，确实可能围得更大。

为什么不用满两面墙反而更好？因为大圆弧接近整圆时，墙提供的弦长也很重要。两面墙都用满，弦长为

$$
d_{xy}=\sqrt{x^2+y^2-2xy\cos\theta}.
$$

回到表中 $x=1,y=2,\theta=\pi/3$ 的例子，有 $d_{xy}=\sqrt3<2=y$。不用第一面墙，虽然失去了三角形面积，却得到了更长的弦；绳子很长时，后者带来的收益会占上风。

更具体地，固定 $d$，令 $s\to\infty$。此时 $\alpha\to2\pi$，小缺口对应的弧长趋近于弦长 $d$，所以整个圆的周长约为 $s+d$。由此得到

$$
G_s(d)=\frac{s^2}{4\pi}+\frac{sd}{2\pi}+O(1).
$$

三角形面积是有界的，而弦长增加带来的收益有一个与 $s$ 成正比的项。因此，长绳子的首要选择趋向于最大化弦长。矩形 $[0,x]\times[0,y]$ 上，弦长的最大值为

$$
\boxed{d_{\max}=\max\left\{x,y,\sqrt{x^2+y^2-2xy\cos\theta}\right\}.}
$$

这解释了为什么锐角墙可能最终只利用一面墙，也说明“既然墙免费，就一定应该全部用满”并不成立。这里说的是长绳极限下的趋势；有限 $s$ 的切换点仍应比较完整面积，而不能只比较弦长。

## 有限墙，不能穿墙

现在让有限墙具有阻挡作用。端点范围仍是 $0\le a\le x$、$0\le b\le y$，但绳子只能从墙端外面绕过，不能穿过真实墙段。

**固定端点时，$F_s(a,b)$ 可能只是面积上界。** 如果对应的最优圆弧穿过了剩余墙段，就不能直接采用它。交互图中标为“无障碍面积上界”的情况正属于这一类；允许穿墙时，那段圆弧可以使用，真实墙下则需要避开障碍。

如何检查一段圆弧是否穿墙？

取 $O=(0,0)$、$A=(a,0)$、$B=(b\cos\theta,b\sin\theta)$，圆心记为 $C=(c_1,c_2)$，半径为 $R$。

圆弧可以通过

$$
C+R\bigl(\cos(t_0+t),\sin(t_0+t)\bigr),
\quad 0\le t\le\alpha,
$$

画出，其中 $t_0$ 是向量 $A-C$ 的极角。实际构造时，要检查整段圆弧而不只是端点：允许越过延长线，不等于允许穿过真实墙段。与第一条墙线的另一交点的坐标是 $2c_1-a$；与第二条墙线的另一交点到 $O$ 的有向距离是 $2(c_1\cos\theta+c_2\sin\theta)-b$。同时检查交点是否落在实际墙段与所选圆弧上即可。

**端点可以自由选择时，障碍却不会降低全局最大面积。** 不允许穿墙的构造也都属于允许穿墙的模型，因此前面算出的最大值是一个上界。只要这个上界存在不穿墙的构造，就能证明两种模型的答案相同。

为了判断允许穿墙时的最大值能否实现，逐类检查最优候选：扇形没有问题；两个端点都在墙端时，没有需要绕开的剩余墙段；一个端点在 $O$ 时，可以把单墙圆弓形放到另一面墙的外侧。

只剩下一端在墙端、另一端自由的情形。不妨设 $a=x$、$0<b<y$。驻点条件使圆心在第二条墙线上。若圆弧穿过这面墙的剩余部分，那么 $B$ 必须是圆与该射线的近交点，远交点到 $O$ 的距离为 $q=b+2R\le y$。因为圆心也在射线上，从 $O$ 看圆上各点的距离最小为 $b$、最大为 $q$。另一端 $A$ 不在这条直线上，所以

$$
b<x<q\le y.
$$

现在把整个构造关于墙角平分线反射，交换两端使用的墙长，得到 $(a',b')=(b,x)$。面积完全相同，却有 $0<a'<x$、$0<b'<y$：两个端点都变成了内部点。若原构造是全局最大值，反射后的构造也必须是内部驻点，圆心就应当为 $O$；但它的圆心显然不是 $O$，矛盾。

因此，穿过剩余墙段的圆弧不可能赢得全局比较。其余最优候选都有不穿墙的构造，所以允许穿墙时的全局最大值，在真实有限墙下也能达到。

于是，在本文的端点约束与 $0<\theta<\pi$ 的条件下，

$$
\boxed{
A_{\max}^{\text{不能穿墙}}(s,x,y,\theta)
=A_{\max}^{\text{允许穿墙}}(s,x,y,\theta).
}
$$

因此，两种有限墙模型可以使用相同的扇形判定和至多九个候选来求最大面积。区别在于：给定一组端点时，真实墙要求额外检查圆弧的可行性；让端点参与全局优化后，总能选到不穿墙的最优构造。

## 可直接运行的求解代码

两种有限墙模型的最大面积都可以用以下程序计算。给定绳长 $s$、墙长 $x,y$ 和夹角 $\theta$，计算分为两步：先判断最优扇形是否放得下；若放不下，就比较两个单墙候选、一个双墙端点候选，以及两条固定墙端边界上的至多六个驻点。

以下 Julia 程序用 [Roots.jl](https://juliamath.github.io/Roots.jl/stable/roots/) 的 `find_zero(f, (lo, hi), Bisection())` 在各个单调区间内求根。函数 `max_area(s, x, y, θ)` 返回 `(area, a, b, α)`，分别表示最大面积、两段被利用的墙长和圆弧角；角度均以弧度为单位。

先在 Julia REPL 中安装一次依赖：

```julia
import Pkg
Pkg.add("Roots")
```

程序使用 `Float64` 进行数值计算。Julia 内置的 [`sinc(z)`](https://docs.julialang.org/en/v1/base/math/#Base.Math.sinc) 定义为 $\sin(\pi z)/(\pi z)$，因此代码中的 `q(t) = sinc(t / π)` 才对应本文的 $\sin t/t$，并且自动处理 $t=0$ 的极限。

```julia
using Roots

q(t) = sinc(t / π)

function area_for_endpoints(s, θ, a, b)
    s, θ, a, b = Float64.((s, θ, a, b))
    all(isfinite, (s, θ, a, b)) && s > 0 && 0 < θ < Float64(π) && a >= 0 && b >= 0 ||
        throw(ArgumentError("Require finite s > 0, 0 < θ < π, and a, b >= 0"))

    d = hypot(a - b * cos(θ), b * sin(θ))
    triangle = a * b * sin(θ) / 2
    d > s && return nothing
    d == 0 && return (area = s^2 / (4π), α = 2π)
    d == s && return (area = triangle, α = 0.0)

    α = find_zero(t -> q(t / 2) - d / s, (0.0, 2π), Bisection())
    # Avoid cancellation in α - sin(α) for short arcs.
    factor = if α < 1e-3
        α / 6 - α^3 / 120 + α^5 / 5040
    else
        (α - sin(α)) / α^2
    end
    return (area = triangle + s^2 * factor / 2, α = α)
end

function max_area(s, x, y, θ)
    s, x, y, θ = Float64.((s, x, y, θ))
    all(isfinite, (s, x, y, θ)) && min(s, x, y) > 0 && 0 < θ < Float64(π) ||
        throw(ArgumentError("Require finite s, x, y > 0 and 0 < θ < π"))
    if s / θ <= min(x, y)
        return (area = s^2 / (2θ), a = s / θ, b = s / θ, α = θ)
    end

    candidates = NamedTuple[]
    function add_candidate(a, b)
        result = area_for_endpoints(s, θ, a, b)
        isnothing(result) && return
        push!(candidates, (area = result.area, a = a, b = b, α = result.α))
    end

    add_candidate(0.0, min(y, 2s / π))
    add_candidate(min(x, 2s / π), 0.0)
    add_candidate(x, y)

    β = find_zero(t -> t * cos(t) - sin(t), (Float64(π), 1.5π), Bisection())
    peak = -q(β)
    for (fixed, free, swap) in ((x, y, false), (y, x, true))
        k = fixed * sin(θ) / s
        angles = Float64[]
        if k < 1
            push!(angles, find_zero(t -> q(t) - k, (0.0, Float64(π)), Bisection()))
        end
        if k == peak
            # At the peak the two major-arc roots coincide.
            push!(angles, β)
        elseif k < peak
            f(t) = -q(t) - k
            push!(angles, find_zero(f, (Float64(π), β), Bisection()))
            push!(angles, find_zero(f, (β, 2π), Bisection()))
        end
        for α in angles
            moving = fixed * cos(θ) + fixed * sin(θ) * tan(α / 2)
            if 0 < moving < free
                swap ? add_candidate(moving, fixed) : add_candidate(fixed, moving)
            end
        end
    end
    return argmax(c -> c.area, candidates)
end

result = max_area(4, 1, 2, π / 3)
println(result)
# Approximately: (area = 3.2069441257, a = 1.0, b = 2.0, α = 4.0992982217)
```

`argmax(c -> c.area, candidates)` 返回面积最大的候选，可通过 `result.area`、`result.a`、`result.b` 和 `result.α` 读取各项结果。在分支切换附近，候选面积可能十分接近，浮点舍入会影响端点位置的选择。

检查实现时，至少核对这几个极限：$d=s$ 时弓形面积为零；$d=2s/\pi$ 时圆弧是半圆；$d\to0$ 时面积趋于 $s^2/(4\pi)$；$a=b=s/\theta$ 时总面积回到 $s^2/(2\theta)$。

无限墙的简洁答案来自两个端点都能自由滑动，迫使圆心固定在墙角。有限墙改变了这个端点条件：墙端可以固定住绳子，让圆心移动，也让大圆弧成为可能。保留“先求圆弧，再优化端点”这两个步骤，就能在同一个公式里处理这些变化。
