给定一个由不同半径、处于不同位置的圆组成的集合 $C$,这些圆可能会相互重叠。给定一个半径为 $r$ 的圆,如果 $r$ 足够大,这个圆可以被放置在某个位置,从而将集合 $C$ 中的所有圆都包含在内(即包围它们)。
半径为 $r$ 且能包围 $C$ 中所有成员圆的圆可能存在多个不同的位置。我们定义区域 $U$ 为所有这些位置的包围圆所覆盖区域的并集。换句话说,对于 $U$ 中的每个点,都存在一个半径为 $r$ 的圆,它同时包围了该点以及 $C$ 中的所有成员。你的任务是计算该区域 $U$ 的边界(周长)长度。
图 I.1 展示了圆集合 $C$ 和区域 $U$ 的一个例子。在图中,包含在 $C$ 中的三个圆用实线圆表示,包围圆的一些可能位置用虚线圆表示,而区域 $U$ 则用粗虚线闭合曲线表示。
图 I.1:圆集合的示例
输入格式
输入由多个数据集组成。数据集的数量少于 100。
每个数据集的格式如下:
$$n \quad r$$ $$x_1 \quad y_1 \quad r_1$$ $$x_2 \quad y_2 \quad r_2$$ $$\vdots$$ $$x_n \quad y_n \quad r_n$$
数据集的第一行包含两个正整数 $n$ 和 $r$,由一个空格隔开。$n$ 表示集合 $C$ 中圆的数量,且不超过 100。$r$ 表示包围圆的半径,且不超过 1000。
接下来的 $n$ 行中,每行包含三个由单个空格隔开的整数。$(x_i, y_i)$ 表示集合 $C$ 中第 $i$ 个圆的圆心位置,$r_i$ 表示其半径。
你可以假设 $-500 \le x_i \le 500$,$-500 \le y_i \le 500$,且 $1 \le r_i \le 500$。
输入结束由一行包含两个由单个空格隔开的零表示。
输出格式
对于每个数据集,输出一行,包含一个表示区域 $U$ 边界(周长)长度的小数。
输出的误差不应大于 0.01。你可以认为,当 $r$ 改变 $\epsilon$($|\epsilon| < 0.0000001$)时,区域 $U$ 的边界长度变化不会超过 0.001。
如果 $r$ 太小而无法覆盖 $C$ 中的所有圆,则输出一行,仅包含 0.0。
输出中不应包含其他字符。
样例
输入样例 1
1 10 5 5 7 2 12 5 5 7 8 6 3 3 10 3 11 2 2 1 1 2 16 3 3 15 -5 2 5 9 2 9 5 8 6 3 38 -25 -10 8 30 5 7 -3 35 11 3 39 -25 -10 8 30 5 7 -3 35 11 3 800 -400 400 2 300 300 1 300 302 1 3 800 400 -400 2 300 300 1 307 300 3 8 147 130 80 12 130 -40 12 -110 80 12 -110 -40 12 70 140 12 70 -100 12 -50 140 12 -50 -100 12 3 493 345 154 10 291 111 75 -275 -301 46 4 55 54 0 1 40 30 5 27 36 10 0 48 7 3 30 0 3 3 -3 0 4 400 0 3 3 7 2 3 2 -5 -4 2 -4 3 2 3 10 -5 -4 5 2 3 5 -4 3 5 4 6 4 6 1 5 5 1 1 7 1 0 1 1 3 493 345 154 10 291 111 75 -275 -301 46 5 20 -9 12 5 0 15 5 3 -3 3 12 9 5 -12 9 5 0 0
输出样例 1
81.68140899333463 106.81415022205297 74.11215318612639 108.92086846105597 0.0 254.85616536128433 8576.936716409238 8569.462129048667 929.1977057481128 4181.124698202453 505.09134735536804 0.0 46.82023824234038 65.66979416387915 50.990642291793506 4181.124698202453 158.87951420768937
说明
图 I.2:样例输入中最后一个数据集的示意图