두 삼각형의 교차점


19

2 개 차원 평면에 4 점을 감안할 때 A, B, C, D, 교차 삼각형의 영역의 면적을 산출 OAB하고 OCD, O좌표를 갖는 평면의 중심이다 (0, 0).

일정한 시간 복잡성 (산술 연산의 관점에서)으로 실행되는 알고리즘이 권장되지만 강제되지는 않습니다.

규칙

  • 각 점은 두 개의 실수로 표시되며 X 및 Y 좌표를 나타냅니다.
    • 선택적으로 프로그래밍 언어 (또는 프로그래밍 언어의 일부 라이브러리)에 내장 Point유형 또는 이와 동등한 유형이있는 경우 Point객체를 입력으로 사용할 수 있습니다 .
  • 입력은 다음을 포함하지만 이에 국한되지 않는 형식으로 4 포인트로 제공됩니다.
    • 8 개의 좌표 목록.
    • 4 포인트의 목록, 각 포인트는 편리한 형식으로 표현할 수 있습니다.
    • 2 포인트의 두 목록.
    • 기타
  • 포인트의 특정 순서 (반 시계 방향 또는 시계 방향)는 가정 할 수 없습니다.
  • 포인트 O가 입력으로 전달 되었다고 가정 할 수 없습니다 . 다시 말해, 프로그램은 외부 입력을 받아서는 안됩니다.
  • 모든 포인트가 다르다고 가정 할 수는 없습니다. 즉, 삼각형이 변질 될 수 있습니다. 해당 사례도 처리해야합니다 (아래 테스트 사례 참조).
  • 절대 또는 상대 차이는 아래 샘플 테스트 사례 보다 작아야 합니다.10-3

우승 기준

이것은 이며 바이트 단위로 가장 짧은 답변입니다!

샘플 테스트 사례

Ax Ay Bx By Cx Cy Dx Dy area

5 1 1 3 -1 0 0 -1 0
5 1 1 3 -1 0 0 0 0
5 1 1 3 0 0 0 0 0
5 1 1 3 3 4 4 -3 4.50418
5 1 1 3 1 2 2 1 1.5
5 1 1 3 -2 5 4 -2 1.74829
5 1 1 3 -2 5 5 4 2.96154
5 1 1 3 3 5 5 4 1.88462
5 1 1 3 3 5 3 1 3.92308
5 1 1 3 3 5 4 -1 5.26619
5 1 1 3 5 1 4 -1 0
5 1 1 3 5 1 1 3 7
1 3 1 3 5 1 1 3 0
1 3 1 3 1 3 1 3 0
4 8 4 -1 -2 6 -2 -3 0

1.2 3.4 -0.3 4.2 5 7.6 -1.1 2.4 2.6210759326188535
3.1 0.6 0.1 7.2 5.2 0.7 0.9 8 9.018496993987977

누구든지 원하는 경우 첫 번째 테스트 사례 그룹에 대한 출력은 다음과 같습니다.

0
0
0
46375/10296
3/2
1792/1025
77/26
49/26
51/13
23345/4433
0
7
0
0
0

테스트 케이스의 그림 이미지 5 1 1 3 3 4 4 -3(녹색 사각형의 영역이 예상 출력 임) :

[ 영상]


테스트 케이스 중 하나에 8이 아닌 9 개의 입력이 있습니다. 1.2 3.4 -0.3 4.2 5 3 7.6 -1.1 2.4 0
Kelly Lowder

1
@KellyLowder 고정.
user202729 December

답변:


16

Wolfram Language (Mathematica) , 55 바이트

0&@@Area@BooleanRegion[And,Simplex[{0{,}}~Join~#]&/@#]&

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

사소한 대답에서 몇 바이트를 깎았습니다.

%@{{{5, 1}, {1, 3}}, {{3, 4}, {4, -3}}} yields 46375/10296 or 4.504176379

교체 Area와 함께하는 DiscretizeRegion교차로 표시됩니다.

여기에 이미지 설명을 입력하십시오

그건 그렇고, 이것은 삼각형뿐만 아니라 모든 단순과 함께 작동합니다.

JungHwan Min 덕분에 -1 바이트

@ user202729의 제안에 4 바이트가 추가되었지만 축퇴 삼각형의 경우 0을 생성합니다.


1
다각형도 Simplex로 대체 가능
Kelly Lowder

1
하나 더 바이트 : {{0,0}}to {0{,}}(이것은식이 평가되기 때문에 작동합니다 {Times[0, {Null, Null}]})
JungHwan Min

샘플 테스트 케이스에 나열된 이 테스트 케이스에 실패했습니다 .
user202729

이미 TIO에서는 작동하지 않습니다. 그들이 후드 아래에 무엇을 가지고 있는지 확실하지 않습니다.
Kelly Lowder

1
두 줄의 교차로는 작동하지 않는 것을 알았습니다. 그 테스트 사례를 건너 뛰는 것이 나쁘다. 기술적으로 이들은 삼각형이 아닙니다. 우리가 그 기술을 얻으려면 첫 번째 문장뿐만 아니라 게시물의 제목을 변경해야한다고 생각합니다. 우리는 면적이 1 차원 물체에 대해 정의되어 있는지 여부에 대해 매우 난해한 토론을 할 수도 있지만 오히려 그렇지 않습니다.
Kelly Lowder

5

파이썬 2 + PIL, 341 318 313 284 270 바이트

Mr. Xcoder 덕분 에 TIO -23 바이트에 PIL을 즉시 추가 한 Dennis에게 특별한 감사

import PIL.Image as I,PIL.ImageDraw as D
l=[i*1000for i in[0,0]+input()+[0,0]]
z=zip(*[[i-min(t)for i in t]for t in l[::2],l[1::2]])
print sum(map(int.__mul__,*map(lambda i,c:D.Draw(i).polygon(c,1)or i.getdata(),map(I.new,'11',[[max(l)-min(l)]*2]*2),[z[:3],z[3:]])))/1e6

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 시도하십시오

차이를 계산하기 위해 문자 그대로 삼각형을 그리고 두 이미지에 그려지는 픽셀의 양을 확인하십시오.
이 방법은 반올림 오류를 삽입했습니다. 이미지 크기를 늘림으로써 부드럽게됩니다.

설명

#the image/triangles are enlarged to increase the precision
#a pair of zeros are inserted in the start and at the end, this way "l" will have all 6 points to draw the triangles 
l=[i*1000for i in[0,0]+input()+[0,0]]
#split the input in x and y, where x=l[::2] and y=l[1::2]
#get the smallest number on each list, that will be "0" if there is no negative number, to be used as offset.
#this will be used to overcome the fact that PIL won't draw on negative coords
#zip "x" and "y" lists, to create a list containing the points
z=zip(*[[i-min(t)for i in t]for t in x,y])
#create 2 (B&W) blank images
#where the size is the difference between the smallest and the largest coord.
map(I.new,'11',[[max(l)-min(l)]*2]*2)
#draw both triangles and return the pixel list of each image
map(lambda i,c:D.Draw(i).polygon(c,1)or i.getdata(),<result of previous line>,[z[:3],z[3:]])
#count the amount of overlapping pixels by summing the color of each pixel, if the pixel is "1" in both images, then the triangles are overlapping, then the amount of pixels is divided by the initial enlarging factor squared (1e6)
print sum(map(int.__mul__,*<result of previous line>))/1e6
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.