このポリゴンの面積は?


19

多角形の面積を計算します。

この靴ひもアルゴリズムのビデオに触発されました

仕事

あなたの仕事は、ポリゴンの面積を計算するプログラムまたは関数を作成することです。プログラムまたは関数は、メタのデフォルト定義に従って定義されます。

入力

ポリゴンの各頂点のXおよびY座標を受け取ります。入力は、タプルのリスト([[x1, y1], [x2, y2], etc])、マトリックス、またはフラットリスト([x1, y1, x2, y2, etc])として取得できます。それぞれを含む2つのリストxy座標も許可されます。頂点には反時計回りの番号が付けられ、最初の頂点は指定された最後の頂点と同じであるため、ポリゴンを閉じます。

必要に応じて、最後の頂点なしで入力を取得できます(各座標を1回だけ受信します)。

ポリゴンのエッジが交差しないと仮定できます。すべての頂点に整数座標があると仮定することもできます。

出力

ポリゴンの面積。すべての標準出力方法が許可されています。ご使用の言語で浮動小数点除算が許可されておらず、解が整数でない場合、分数を返すことができます。分数を必ずしも単純化する必要はないため、返品2/4は許可されます。

受賞基準

最短のコードが勝ちます!

テストケース

[[4,4],[0,1],[-2,5],[-6,0],[-1,-4],[5,-2],[4,4]]
55

ここに画像の説明を入力してください

[[1,1],[0,1],[1,0],[1,1]]
0.5
1/2

ここに画像の説明を入力してください


入力は[x1, x2, x3], [y1, y2, y3]許可されていますか?
Programmer5000

@ programmer5000とMartin Ender、はい、編集します:)
JAD

私は同意し、再開に投票しました。
Programmer5000

1
@flawrこれをだましました。それは実際にはその重複ターゲットの重複ではありません。ここで同じ方法を再帰的に適用するには、交差ポイントである頂点を見つける必要があり、結果のサブセットを反時計回りに順序付ける必要があります-それははるかに複雑に見えます。
ジョナサンアラン

回答:


13

ゼリー 8  6 バイト

Emignaのおかげで-1バイト(冗長ÆḊ左に2の深さがあり
ます)再びEmignaのおかげで-1バイト、再び(半分、、Hが必要ない浮動小数点です÷2

ṡ2ÆḊSH

例(1回の繰り返しで)に従って反時計回りに座標のペアのリストを取得し、領域を返すモナドリンク。

オンラインでお試しください!

どうやって?

ビデオで説明したように、靴ひもアルゴリズムを適用します(先日も偶然見ました!)

ṡ2ÆḊSH - Link: list of [x,y] coordinate pairs anticlockwise & wrapped, p
ṡ2     - all overlapping slices of length 2
  ÆḊ   - determinant (vectorises)
    S  - sum
     H - halve

2番目のテストケースは、私にとって `-0.5`を返します:o
JAD

ああ、私はそれをチェックアウトする必要があります...
ジョナサン・アラン

これは、[x,y]座標として反時計回りではなく時計回りに与えられるためです。の入力は[[1,1],[0,1],[1,0],[1,1]]を返します0.5
ジョナサンアラン

1
おっと、私はそれを編集します:D
JAD

1
また、H代わりに÷2
エミグナ



16

JavaScript(ES6)、69 67 47バイト

@Rickに感謝します。頂点が反時計回りにソートされることが保証されている場合、絶対値は必要ないことに注意してください。

入力を、最後の頂点を含む頂点のフラットリストとして取得します。

f=([x,y,...a])=>1/a[0]?x*a[1]/2-y*a[0]/2+f(a):0

オンラインでお試しください!

どうやって?

n

area=|(x0y1y0x1)+(x1y2y1x2)++(xn1y0yn1x0)2|


非常に印象的!仕組みを説明していただけますか
ルグニル

2番目のテストケースの頂点は、誤って誤って順序付けされました。腹筋は必要ありません。
リック

フラットリストへの7バイトスイッチングを保存することもできますa=>(g=([x,y,...a])=>1-a?0:x*a[1]-y*a[0]+g(a))(a)/2
リック

@Rickは正しい-absは必要ありません。これがない場合、式は符号付き面積を計算します。これは、頂点が反時計回りの順序で与えられるため正です。
アンス

@Rickありがとう!更新...約10か月後:/
アーナルド

7

R、54 52バイト

pryr::f({for(i in 2:nrow(x))F=F+det(x[i-1:0,]);F/2})

関数に評価する:

function (x) 
{
    for (i in 2:nrow(x)) F = F + det(x[i - 1:0, ])
    F/2
}

事前定義されたを使用しますF = FALSE = 0。リンクされたビデオに靴ひもアルゴリズムを実装します:)

-ジュゼッペのおかげで2バイト


i+-1:0行インデックスとして-1バイト
ジュゼッペ

@ジュゼッペニース。私+も同様に削除します;)
JAD

6

Pythonの372の 71バイト

from numpy import*
g=lambda x,y:(dot(x[:-1],y[1:])-dot(x[1:],y[:-1]))/2

コメントで許可されているように、2つのリストを取ります

x = [x0,x1,x2, ...]
y = [y0,y1,y2, ...] 

オンラインでお試しください!

これは基本的にはshoelace-formulaの単なる実装です。実際にそのように実装するゴルフのプラスポイントを獲得できますか?:D

-1の後ろにスペースは必要ありませんx,y:



2つのリストを取得することも、今の質問の本文で言及されています:)
JAD

@JarkoDubbeldamええと、たった今見たところ、エリアを出力しなければならない。このソリューションは現在、エリアを返すだけです。それも許可されますか、それとも印刷しますか?
P. Siehr

値を返す関数は出力としてカウントされます:)
JAD

pythonを使用すると、関数に名前を付ける必要さえないので、最初から始めるだけで十分だと思いますlambda x,y:
-JAD

@JarkoDubbeldam各言語のルールはどこにありますか?
P.ジーアール


4

JS(ES6)、98 95 94 93 88 86 82 81 77 73バイト

(X,Y)=>{for(i in X){a+=(X[i]+X[i-1])*(Y[i]-Y[i-1]);if(!+i)a=0}return a/2}

のような入力を受け取り[x1, x2, x3], [y1, y2, y3]、繰り返される座標ペアをスキップします。

@JarkoDubbeldamのおかげで-3バイト

@JarkoDubbeldamのおかげで-4バイト

@ZacharyTのおかげで-1バイト

@ZacharyTのおかげで-4バイト

@Rickのおかげで-4バイト


3

J、12バイト

入力が2つの要素リストのリスト(つまり、テーブル)であると仮定します

-:+/-/ .*2[\
  • 2[\ -靴ひもXに分解します。つまり、4エルムの正方形が重なります
  • -/ .* -それぞれの決定要因
  • +/ -合計する
  • -: -2で割る

入力を単一のリストとして取得する場合、最初にテーブルに変換して、20バイトを与える必要があります。

-:+/-/ .*2[\ _2&(,\)

1
「入力が2つの要素リスト(つまり、テーブル)であると仮定します」これは許可されています:)
JAD

3

MS-SQL、66バイト

SELECT geometry::STPolyFromText('POLYGON('+p+')',0).STArea()FROM g

MS SQL 2008以降は、Open Geospatial Consortium(OGC)標準の空間データ/関数をサポートしています。これをここで利用しています。

入力データは、フィールドに格納されたp既存のテーブルのグラム私達の入力規格ごと

入力は、次の形式の順序付けられたペアを持つテキストフィールドです。 (4 4,0 1,-2 5,-6 0,-1 -4,5 -2,4 4)

ただおもしろいのですが、入力テーブルに(テキストデータだけでなく)Open Geospatial Consortium標準のジオメトリオブジェクトを保持できるようにした場合、それはほとんど簡単になります。

--Create and populate input table, not counted in byte total
CREATE TABLE g (p geometry)
INSERT g VALUES (geometry::STPolyFromText('POLYGON((5 5, 10 5, 10 10, 5 5))', 0))

--23 bytes!
SELECT p.STArea()FROM g


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.