이 다각형의 면적은 얼마입니까?


19

다각형의 면적을 계산합니다.

신발 끈 알고리즘 비디오에서 영감을 얻었습니다 .

직무

당신의 임무는 다각형의 면적을 계산하는 프로그램이나 함수를 만드는 것입니다. 프로그램 또는 기능은 메타의 기본 정의에 따라 정의됩니다.

입력

다각형의 각 꼭짓점의 X 및 Y 좌표를받습니다. 입력을 튜플 목록 ( [[x1, y1], [x2, y2], etc]), 행렬 또는 플랫 목록 ( [x1, y1, x2, y2, etc]) 으로 취할 수 있습니다 . xy좌표를 포함하는 두 목록 도 허용됩니다. 정점은 시계 반대 방향으로 번호가 매겨지고 첫 번째 정점은 마지막 정점과 동일하므로 다각형을 닫습니다.

원하는 경우 마지막 정점없이 입력을받을 수 있습니다 (따라서 각 좌표를 한 번만 받으십시오).

다각형의 가장자리가 교차하지 않는다고 가정 할 수 있습니다. 모든 정점에 정수 좌표가 있다고 가정 할 수도 있습니다.

산출

다각형의 면적. 모든 표준 출력 방법이 허용됩니다. 언어에서 부동 나누기를 허용하지 않고 솔루션이 정수가 아닌 경우 분수를 반환 할 수 있습니다. 분수를 반드시 단순화 할 필요는 없으므로 반환 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 나는 이것의 속임수를 만들었다. 그것은 실제로 그것의 속임수 목표의 속임수가 아니며, 여기에서와 같은 방법을 반복적으로 적용하려면 점을 교차하는 정점을 찾아야하고 결과 서브셋을 시계 반대 방향으로 정렬해야합니다.
Jonathan Allan

답변:


13

젤리 ,  8  6 바이트

Emigna 덕분에 -1 바이트 (이중화 , ÆḊ왼쪽 깊이는 2)
-1 바이트는 Emigna 덕분에 다시 (반 H,,는 부동 소수점 필요 없음 ÷2)

ṡ2ÆḊSH

예제에 따라 시계 반대 방향으로 한 쌍의 좌표 목록을 가져 와서 한 번 반복하는 모나드 링크.

온라인으로 사용해보십시오!

어떻게?

비디오에 설명 된대로 신발 끈 알고리즘을 적용합니다 (다른 날에도 시청했습니다!).

ṡ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

두 번째 테스트 사례는 나를 위해`-0.5`를 반환합니다. : o
JAD

오, 내가 확인해야 할 것입니다 ...
Jonathan Allan

로하기 때문이다 [x,y]좌표들이 시계 반대 방향으로보다 시계 방향으로 오히려 주어진다. 의 입력 [[1,1],[0,1],[1,0],[1,1]]은를 반환합니다 0.5.
Jonathan Allan

1
Woops, 나는 그것을 편집 할 것이다 : D
JAD

1
또한 H대신÷2
Emigna



16

자바 스크립트 (ES6), 69 67 47 바이트

정점이 반 시계 방향으로 정렬되도록 보장하고 플랫 목록을 입력으로 가져 와서 20 바이트를 절약 할 것을 제안하는 경우 @Rick 덕분에 절대 값이 필요하지 않습니다.

마지막 정점을 포함하여 평평한 정점 목록으로 입력을받습니다.

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

온라인으로 사용해보십시오!

어떻게?

아르 자형이자형=|(엑스0와이1와이0엑스1)+(엑스1와이2와이1엑스2)++(엑스1와이0와이1엑스0)2|


매우 인상적! 작동 원리를 설명해 주시겠습니까?
Rugnir

두 번째 테스트 사례의 정점은 실수로 잘못 주문되었습니다. 복근은 필요하지 않습니다.
Rick

플랫 바이트 목록으로 전환하여 7 바이트를 절약 할 수도 있습니다.a=>(g=([x,y,...a])=>1-a?0:x*a[1]-y*a[0]+g(a))(a)/2
Rick

@Rick이 옳습니다. 복근은 필요하지 않습니다. 그것없이 공식은 부호있는 영역을 계산하는데, 정점이 반 시계 방향으로 주어지기 때문에 양수입니다.

@Rick 감사합니다! 업데이트 ... 약 10 개월 후 : /
Arnauld

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 바이트
Giuseppe

@ 주세페 니스. 나는 또한 제거 할 것이다 +;)
JAD

6

파이썬 3 , 72 71 바이트

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

의견에 허용 된 두 가지 목록을 취합니다.

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

온라인으로 사용해보십시오!

이것은 기본적으로 신발 끈 공식 의 구현입니다 . 당신이 실제로 그렇게 구현할 골프에 대한 더하기 점수를 얻을 수 있습니까? :디

-1, 뒤에 공백이 필요 없습니다 x,y:.



두 가지 목록을 취하는 것도 질문의 본문에 언급되어 있습니다 :)
JAD

@JarkoDubbeldam 어, 방금 지역을 출력해야한다는 것을 알았습니다. 이 솔루션은 현재 영역을 반환합니다. 이것도 허용됩니까, 아니면 인쇄됩니까?
P. Siehr

값을 반환하는 함수는 출력으로 계산됩니다 :)
JAD

파이썬을 사용하면 함수의 이름을 지정할 필요조차 없으므로 시작하는 lambda x,y:것이 좋습니다.
JAD

@JarkoDubbeldam 언어마다 규칙이 있습니까?
P. Siehr


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로 분해합니다.
  • -/ .* -각각의 결정 요인
  • +/ -요약 해
  • -: -2로 나누기

입력을 단일 목록으로 가져 오면 먼저 테이블로 변환하여 20 바이트를 제공해야합니다.

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

1
"입력이 2 개의 요소리스트 (즉, 테이블)
JAD

3

MS-SQL, 66 바이트

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

MS SQL 2008 이상은 여기서 OGC (Open Geospatial Consortium) 표준 공간 데이터 / 기능을 지원합니다.

입력 데이터 필드에 저장된 P 기존 테이블의 g , 우리의 입력 기준에 따라 .

입력은 다음 형식으로 정렬 된 쌍이있는 텍스트 필드입니다. (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.