Math 平面上的两个矩形
在过去的几天里,我试图解决这个问题。我甚至有解决办法,但我想不出来。有人能帮我吗 问题是: 平面上有两个矩形。 两个矩形的中心都位于坐标原点 (表示矩形对称的中心)。 第一个矩形的边与坐标轴平行: 平行于Ox轴的边的长度等于w, 平行于Oy轴的边的长度等于h。 通过旋转第一个矩形可以获得第二个矩形 相对于坐标原点的角度α 例如: 您的任务是找到属于这两个区域的区域 给定矩形。这一区域在图中用阴影表示 输入 第一行包含三个整数w, H α (1 ≤ W H ≤ 106; 0 ≤ α ≤ 180). 角度α以度为单位 输出 在单行中打印一个实数——属于两个给定矩形的区域面积 如果相对或绝对误差不超过10,则认为答案正确 - 六, 样本测试 输入 1 1 45 输出 0.828427125 输入 6 4 30 输出 19.668384925 以下是一个可能的实现:Math 平面上的两个矩形,math,trigonometry,puzzle,Math,Trigonometry,Puzzle,在过去的几天里,我试图解决这个问题。我甚至有解决办法,但我想不出来。有人能帮我吗 问题是: 平面上有两个矩形。 两个矩形的中心都位于坐标原点 (表示矩形对称的中心)。 第一个矩形的边与坐标轴平行: 平行于Ox轴的边的长度等于w, 平行于Oy轴的边的长度等于h。 通过旋转第一个矩形可以获得第二个矩形 相对于坐标原点的角度α 例如: 您的任务是找到属于这两个区域的区域 给定矩形。这一区域在图中用阴影表示 输入 第一行包含三个整数w, H α (1 ≤ W H ≤ 106; 0 ≤ α ≤ 180)
<?php
list($w, $h, $alphaInt) = explode(' ', '34989 23482 180');
if ($alphaInt == 0 || $alphaInt == 180) {
$res = $h * $w;
}
else if ($alphaInt == 90) {
$res = $h * $h;
}
else {
if ($alphaInt > 90) $alphaInt = 180 - $alphaInt;
$alpha = $alphaInt / 180.0 * M_PI;
//echo '$alpha:' . $alpha . "\n";
$cos = cos($alpha);
$sin = sin($alpha);
//echo '$cos: ' . $cos . "\n";
//echo '$sin: ' . $sin . "\n";
$c = $w / 2 * $cos + $h / 2 * $sin - $w / 2;
//echo '$c: ' . $c . "\n";
$r1 = $c / $cos;
$r2 = $c / $sin;
//echo '$r1: ' . $r1 . "\n";
//echo '$r2: ' . $r2 . "\n";
$c = $w / 2 * $sin + $h / 2 * $cos - $h / 2;
//echo '$c: ' . $c . "\n";
$r3 = $c / $cos;
$r4 = $c / $sin;
//echo '$r3: ' . $r3 . "\n";
//echo '$r4: ' . $r4 . "\n";
if ($r1 < 0 || $r2 < 0 || $r3 < 0 || $r4 < 0) {
$res = $h * $h / $sin; //$res = $w * $w / $cos;
}
else {
$res = $h * $w - $r1 * $r2 - $r3 * $r4;
}
}
echo '$res: ' . $res . "\n";
Smallalpha
当w*sin(alpha)
时(即,在新矩形的顶点第一次与旧矩形的顶点相交之前),相交区域是原始矩形的面积(w*h
)减去4个三角形(2对相同的三角形)。让大三角形有斜边a
,小三角形有斜边b
,则面积为
A = w * h - a*a*cos(alpha)*sin(alpha) - b*b*cos(alpha)*sin(alpha)
原始矩形的边满足一个方程组:
a + a * cos(alpha) + b * sin(alpha) = w
a * sin(alpha) + b + b * cos(alpha) = h
使用
因此(LHS上的矩阵是旋转的!)
及
(这可以进一步简化一点)
更大的alpha
当alpha
更大(但仍然alpha时,您可以尝试将两个矩形描述为四线性系统的解决方案。
相交点集是两组线性不等式的解集
你需要这组解的面积。你可以找到八个不等式中至少有两个是紧的所有点。过滤掉那些不满足所有不等式的点。然后使用格雷厄姆扫描获取它们的凸包,并使用测量员公式计算面积
该方法适用于求任意两个凸多边形的交点。稍加修改,它推广了(以傅里叶-莫茨金消去法和计算交点和体积计算行列式的双重描述方法的形式)任何维度的凸多面体。具体来说,你有什么问题吗?有一点我不明白,$r1=($w/2*$cos+$h/2*$sin-$w/2)/$cos;
我不太确定我们只需要计算4个三角形的面积(实际上是2个);如果旋转前右上角顶点v1的倾角为θu 1,旋转后右下角顶点v2的倾角θu 2在θu 1<θu 2<180-θu 1的范围内,则我们需要一个梯形的面积(可以通过从v2中垂直放置,然后从其他两个三角形中减去一个三角形的面积来计算)@ HexedAgain:我认为这个公式适用于足够小的<代码> Alpha < /代码>。非常感谢。但是PHP中的解决方案适用于所有alpha值,而不仅仅是针对小值i修改了考虑所有情况的答案。
a * cos(alpha/2) + b * sin(alpha/2) = w/(2*cos(alpha/2))
a * sin(alpha/2) + b * cos(alpha/2) = h/(2*cos(alpha/2))
a^2 + b^2 = (w^2 + h^2) / (2*cos(alpha/2))^2
A = h * w - (w^2 + h^2) * cos(alpha)* sin(alpha) / (2*cos(alpha/2))^2