Math 平面上的两个矩形

Math 平面上的两个矩形,math,trigonometry,puzzle,Math,Trigonometry,Puzzle,在过去的几天里,我试图解决这个问题。我甚至有解决办法,但我想不出来。有人能帮我吗 问题是: 平面上有两个矩形。 两个矩形的中心都位于坐标原点 (表示矩形对称的中心)。 第一个矩形的边与坐标轴平行: 平行于Ox轴的边的长度等于w, 平行于Oy轴的边的长度等于h。 通过旋转第一个矩形可以获得第二个矩形 相对于坐标原点的角度α 例如: 您的任务是找到属于这两个区域的区域 给定矩形。这一区域在图中用阴影表示 输入 第一行包含三个整数w, H α (1 ≤ W H ≤ 106; 0 ≤ α ≤ 180)

在过去的几天里,我试图解决这个问题。我甚至有解决办法,但我想不出来。有人能帮我吗

问题是:

平面上有两个矩形。 两个矩形的中心都位于坐标原点 (表示矩形对称的中心)。 第一个矩形的边与坐标轴平行: 平行于Ox轴的边的长度等于w, 平行于Oy轴的边的长度等于h。 通过旋转第一个矩形可以获得第二个矩形 相对于坐标原点的角度α

例如:

您的任务是找到属于这两个区域的区域 给定矩形。这一区域在图中用阴影表示

输入 第一行包含三个整数w, H α (1 ≤ W H ≤ 106; 0 ≤ α ≤ 180). 角度α以度为单位

输出 在单行中打印一个实数——属于两个给定矩形的区域面积

如果相对或绝对误差不超过10,则认为答案正确 - 六,

样本测试

输入 1 1 45 输出 0.828427125

输入 6 4 30 输出 19.668384925

以下是一个可能的实现:

<?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";
Small
alpha
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