在过去的几天里,我试图解决这个问题。我甚至有解决方案,但我无法弄明白。有人能帮助我吗?
问题在于:
您在飞机上获得两个矩形。 两个矩形的中心位于坐标原点 (意思是矩形对称的中心)。 第一个矩形的边与坐标轴平行: 与Ox轴平行的边长等于w, 与Oy轴平行的边长等于h。 可以通过旋转第一个矩形来获得第二个矩形 相对于坐标原点的角度α。
实施例: http://i.imgur.com/qi1WQVq.png
您的任务是找到属于两者的区域 给定矩形。该区域在图片中以阴影显示。
输入 第一行包含三个整数w,h,α(1≤w,h≤106;0≤α≤180)。角度α以度为单位。
输出 在一行中打印一个实数 - 该区域的区域属于给定的矩形。
如果相对或绝对误差不超过10 - 6,则认为答案是正确的。
样品测试
输入 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";
答案 0 :(得分:0)
alpha
当w*sin(alpha) < h*(1+cos(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
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))
因此(LHS上的矩阵是旋转!)
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
(这可以进一步简化)
alpha
当alpha
更大(但仍为alpha<pi/2
)时,交点是平行四边形(实际上是菱形),其2个高度为h
和4个边h/sin(alpha)
,因此,该区域为h*h/sin(alpha)
(是的,它不依赖于w
!)
alpha
使用对称将alpha降低为[0;pi/2]
并使用上述两种情况之一。
答案 1 :(得分:0)
您可以尝试将两个矩形描述为四个线性不等式系统的解。 它们交集中的点集是两组线性不等式的解集。
您需要该组解决方案的区域。您可以找到八个不等式中至少有两个不一致的所有点。过滤掉那些不满足所有不等式的东西。然后使用格雷厄姆的扫描来获取他们的凸包,并使用测量员的公式计算该区域。
此方法用于查找任意两个凸多边形的交点。稍微修改后,它将(以傅里叶 - 莫兹金消除的形式和用于计算体积计算的交点和行列式的双重描述方法)推广到任何维度的凸多面体。