Minkowski Sum

2つの点集合の凸包についてMinkowski和を計算します。

一般形

let result =
  minkowskiSum(
    left,
    right,
  )

引数・型

入力は任意順で構いません。重複点、凸包内部の点、辺上の不要な点を含められます。 両入力を内部で凸包へ正規化してからMinkowski和を求めます。

入力列は変更されません。

前提条件

Tは次をサポートするexact ordered ring型である必要があります。

典型的にはint64を使用します。座標演算と外積がTの範囲に収まる必要があります。

返り値

どちらかの入力が空なら空列を返します。

空でない場合、返り値は次の形式です。

点や線分へ退化する場合にも対応します。

具体例

import atcoder/extra/geometry/geometry
import atcoder/extra/geometry/minkowski_sum

let left =
  @[
    initPoint(0'i64, 0'i64),
    initPoint(1'i64, 0'i64),
    initPoint(1'i64, 1'i64),
    initPoint(0'i64, 1'i64),
  ]

let right =
  @[
    initPoint(-1'i64, -2'i64),
    initPoint(2'i64, -2'i64),
    initPoint(2'i64, 3'i64),
    initPoint(-1'i64, 3'i64),
  ]

doAssert minkowskiSum(
  left,
  right,
) == @[
  initPoint(-1'i64, -2'i64),
  initPoint(3'i64, -2'i64),
  initPoint(3'i64, 4'i64),
  initPoint(-1'i64, 4'i64),
]

関連API

このAPIは任意の点集合を受け取り、両凸包の辺vectorを偏角順にmergeします。

計算量と内部実装

入力点数をn, mとします。

すでに凸多角形であっても、公開APIの一貫した正規形を保証するため内部で正規化します。