C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++で四辺形の最大面積を求める方法


問題文

四辺形の4つの辺 a、b、c、d が与えられたとき、それらの辺から構成できる四辺形の最大面積を求めることを考えます。

アルゴリズム

この問題は、古代インドの数学者ブラーマグプタ(Brahmagupta)による次の公式を利用することで解くことができます。

√(s−a)(s−b)(s−c)(s−d)

ここで、s は半周長(semi-perimeter)と呼ばれる値であり、次のように計算します。

S = (a + b + c + d) / 2

なお、ブラーマグプタの公式は本来、円に内接する四辺形に対して成立するものですが、与えられた4つの辺の長さを持つすべての四辺形の中では、円に内接する四辺形が最大の面積を持つことが知られています。そのため、この公式を使うことで「与えられた辺から作れる最大の面積」を正しく求めることができます。

コード例

それでは、実際のC++コードを見てみましょう。

#include <bits/stdc++.h>
using namespace std;
double getMaxArea(double a, double b, double c, double d) {
   double s = (a + b + c + d) / 2;
   double area = (s - a) * (s - b) * (s - c) * (s - d);
   return sqrt(area);
}
int main() {
   double a = 1, b = 2.5, c = 1.8, d = 2;
   cout << "Maximum area = " << getMaxArea(a, b, c, d) << endl;
   return 0;
}

出力結果

Maximum area = 3.05

この例では、辺の長さがそれぞれ 1、2.5、1.8、2 の四辺形について、半周長 s = 3.65 が求められ、各項 (s−a)、(s−b)、(s−c)、(s−d) を掛け合わせて平方根を取ることで、最大面積が約 3.05 であることが分かります。


  1. C++で解く長方形エリアII ― 座標圧縮と走査線法による被覆面積の計算

    問題概要 軸に平行な長方形のリストが与えられるものとします。各 rectangle[i] = {x1, y1, x2, y2} において、(x1, y1) は i 番目の長方形の左下隅の座標、(x2, y2) は右上隅の座標を表します。 求めたいのは、平面上でこれらすべての長方形が覆っている領域の合計面積です。答えは非常に大きな値になる可能性があるため、109 + 7 で割った余りを返すことになっています。 たとえば、入力が次のような場合を考えてみましょう。 このとき、出力は 6 となります。 解法の方針:座標圧縮+走査線(スイープライン) この問題は、座標圧縮(座標の離散化)と走査線法(

  2. C++で2つの長方形が覆う合計面積を求めるアルゴリズム

    2次元平面上に置かれた2つの軸に平行な長方形について、それらが覆う領域の合計面積を求める問題を考えます。各長方形は、左下の頂点と右上の頂点の座標によって定義されます。下図のように、第1の長方形は左下 (A, B)・右上 (C, D)、第2の長方形は左下 (E, F)・右上 (G, H) として表されます。解き方のアプローチこの問題を解くための手順は以下の通りです。まず、2つの長方形が重なっているかどうかを判定します。C ≤ E、A ≥ G、B ≥ H、D ≤ F のいずれかが成り立つ場合、2つの長方形は重ならないため、それぞれの面積の和 (C − A) × (D − B) + (G − E)