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

Pythonで2つの長方形が覆う総面積を求めるプログラム

2次元平面上に置かれた2つの長方形が覆う総面積を求めたい場面を考えてみましょう。各長方形は、左下の頂点右上の頂点の座標によって定義されます。

Pythonで2つの長方形が覆う総面積を求めるプログラム

1つ目の長方形の左下・右上の座標をそれぞれ (A, B)、(C, D)、2つ目の長方形のそれらを (E, F)、(G, H) とします。

解き方のアプローチ

この問題は、以下の手順で解くことができます。

  • まず、それぞれの長方形の幅と高さを求めます。
    • width_1 := |C − A|、height_1 := |D − B|
    • width_2 := |G − E|、height_2 := |H − F|
  • 2つの長方形の面積を合計します。
    area := width_1 × height_1 + width_2 × height_2
  • 重なりの有無を判定します。(G < A) または (E > C) または (F > D) または (H < B) のいずれかが成り立つ場合、2つの長方形は重なっていないため、そのまま area を返します。
  • 重なっている場合は、共通部分(重なり領域)の面積を計算し、合計から差し引きます。
    • p := A と E の最大値
    • q := B と F の最大値
    • r := C と G の最小値
    • s := D と H の最小値
    • width_3 := |r − p|、height_3 := |s − q|
    • return area − (width_3 × height_3)

実装例

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

def solve(A, B, C, D, E, F, G, H):
    width_1 = abs(C-A)
    height_1 = abs(D-B)

    width_2 = abs(G-E)
    height_2 = abs(H-F)

    area = width_1*height_1 + width_2*height_2

    if (G<A) or (E>C) or (F>D) or (H<B):
        return area
    else:
        p = max(A,E)
        q = max(B,F)
        r = min(C,G)
        s = min(D,H)

        width_3 = abs(r-p)
        height_3 = abs(s-q)

        return area - (width_3*height_3)

A = -3
B = 0
C = 3
D = 4
E = 0
F = -1
G = 9
H = 2
print(solve(A, B, C, D, E, F, G, H))

入力

-3, 0, 3, 4, 0, -1, 9, 2

出力

45

コードの解説

この例では、1つ目の長方形は (-3, 0) から (3, 4) に、2つ目の長方形は (0, -1) から (9, 2) に広がっています。

1つ目の長方形の面積は 6 × 4 = 24、2つ目の長方形の面積は 9 × 3 = 27 となるため、単純な合計は 51 です。しかし、2つの長方形は x ∈ [0, 3]、y ∈ [0, 2] の範囲で重なっているため、その共通部分の面積 3 × 2 = 6 を差し引きます。結果として、最終的な答えは 45 となります。

このように、「全体の面積の合計から重なり部分を引く」というシンプルな考え方で、幾何学的な問題を効率よく解くことができます。

  1. 【Python入門】2つの文字列から珍しい単語(ユニークな単語)を見つけるプログラムの作り方

    はじめに この記事では、以下の問題文に対する解決方法を、実際のコード例とともにわかりやすく解説します。 問題文 2つの文字列が与えられたとき、その中から「珍しい単語」(どちらか一方の文字列にしか出現しない単語)をすべて抽出することを目標とします。両方の文字列に共通して含まれる単語は除外します。 解決のアプローチ ここでは辞書(dict)を使った出現回数のカウント方式を採用します。手順は次のとおりです。 空の辞書を用意する 各文字列をsplit()で単語ごとに分割する 各単語の出現回数を辞書に記録する 出現回数がちょうど1回の単語だけを結果として返す 実装例 # 珍しい単語を見つける関

  2. Pythonで数値が2の累乗かどうかを判定するプログラム

    本記事では、与えられた数値が2の累乗(べき乗)であるかどうかを判定する方法について、考え方と実装手順をわかりやすく解説します。 問題の定義 ある整数 n が与えられたとき、その数が2の累乗(1, 2, 4, 8, 16, …)であるかどうかを判定します。 アプローチ 判定には「繰り返し2で割る」というシンプルな方法を使います。考え方は以下の通りです。 入力された数値 n を、1になるまで繰り返し2で割っていきます(n = n // 2)。 割る過程で n % 2 の結果が0以外(奇数)になり、かつ n が1でない場合は、その数は2の累乗ではありません。 最終的に n がちょうど1になれば、そ