这是四边形周期性的吗?


18

在数学中,循环四边形是一个顶点都位于同一圆上的四边形。换句话说,每个顶点都位于其他三个顶点的外接圆上。有关更多信息,请参见MathWorld文章

例子

这些四边形是循环的:

循环四边形

该梯形不是周期性的。

梯形

(图片来自维基百科)

目的

给定形成凸四边形的四个顶点的逆时针坐标,确定四边形是否为循环的。

坐标将是整数(但是,请注意,圆心坐标和外接半径不一定是整数。)如上一段所隐含,没有三个点是共线的,也没有两个重合的点。

输入输出

您可以使用任何合理的格式进行输入。特别是[[x1,x2,x3,x4],[y1,y2,y3,y4]][[x1,y1],[x2,y2],[x3,y3],[x4,y4]]和复数无一不精。

使用true和false的任何不同一致值进行输出。

测试用例

真正:

[0,0], [314,0], [314,1], [0,1]
[-5,5], [5,-5], [1337,42], [42,1337]
[104, -233], [109, -232], [112, -231], [123, -224]

假:

[0,0], [314,0], [314,100], [0,99]
[31,41],[59,26],[53,58],[0,314]

Answers:


11

Wolfram语言(Mathematica),23个字节

#∈Circumsphere@{##2}&

在线尝试!

有四个输入:清单{x1,y1}{x2,y2}{x3,y3},和{x4,y4}。检查第一个点是否位于其他三个点的外接圆上。如果中的个点是并发的,也可以用来检查它们是否是并发的,只要它们的后个是仿射无关的(因为如果给它简并的输入,这是可悲的)。ñ+1个[RññCircumsphere

另外,这是一种数学方法:

Wolfram语言(Mathematica)29 28 25 24字节

Det@{#^2+#2^2,##,1^#}^0&

在线尝试!

接受两个列表作为输入:{x1,x2,x3,x4}{y1,y2,y3,y4}Indeterminate当四个点在同一个圆上时返回,1否则返回。

从的四个点中,此解决方案构造以下矩阵:X1个ÿ1个X2ÿ2X3ÿ3X4ÿ4

[X1个2+ÿ1个2X22+ÿ22X32+ÿ32X42+ÿ42X1个X2X3X4ÿ1个ÿ2ÿ3ÿ41个1个1个1个]

当且仅当四行线性相关且行之间的线性相关性与在所有四个点上均满足的圆的方程相同时,此矩阵的行列式为0。

我能想到的最短的检查行列式是否为0的方法是将其提高到0的幂:0^0就是Indeterminate其他任何给定的值1



8

Perl 6,44个字节

{!im ($^b-$^a)*($^d-$^c)/(($d-$a)*($b-$c)):}

在线尝试!

将顶点视为复数。使用以下事实:循环四边形中的对角之和为180°。操作顺序应保证浮点操作对于(足够小的)整数产生准确的结果。

Misha Lavrov TI-Basic解决方案的端口,33字节

{![*](map */*,($_ Z-.rotate)).im}

在线尝试!


42吗 它仍然准确吗?
Jo King

1
@JoKing不,不是
nwellnhof

在这种情况下,结肠会做什么?它绝对不是标签,也不是方法调用。
user202729 '18

@ user202729这具有间接invocant语法的方法调用。
nwellnhof

6

JavaScript(ES6)

测试角度,114字节

[X1个ÿ1个X2ÿ2X3ÿ3X4ÿ4]

a=>(F=i=>(A=Math.atan2)(a[i+3&7]-(y=a[i+1]),a[i+2&7]-a[i])-A(a[i+5&7]-y,a[i+4&7]-a[i]))(0)+F(2)+F(4)+F(6)==Math.PI

在线尝试!


计算行列式,130字节

[x1,x2,x3,x4][y1,y2,y3,y4]

这相当于MishaLavrov的第二答案,带有旋转矩阵。

x=>y=>!(g=a=>a+a?a.reduce((v,[r],i)=>v+(i&1?-r:r)*g(a.map(r=>r.slice(1)).filter(_=>i--)),0):1)(x.map((X,i)=>[1,Y=y[i],X,X*X+Y*Y]))

在线尝试!


6

TI-Basic(83系列),21字节

e^(ΔList(ln(ΔList(augment(Ans,Ans
not(imag(Ans(1)Ans(3

将输入作为的四个复数列表Ans1如果四边形是循环的,0则返回。

ž1个ž2ž3ž4

  • ΔList(augment(Ans,Ansž2-ž1个ž3-ž2ž4-ž3ž1个-ž4
  • e^(ΔList(ln(ž3-ž2ž2-ž1个ž4-ž3ž3-ž2ž1个-ž4ž4-ž3
  • ž3-ž2ž2-ž1个ž1个-ž4ž4-ž3 ž3ž1个;ž2ž4=ž2-ž3ž2-ž1个ž4-ž3ž4-ž1个

我尽力检查了数值误差是否是一个问题,而且似乎没有,但是如果有人对此有好的测试用例,请告诉我。


3

JavaScript(ES6)(101字节)

p=>(h=(a,b)=>Math.hypot(p[a]-p[b],p[a+1]-p[b+1]))&&((h(2,4)*h(0,6)+h(0,2)*h(4,6)-h(0,4)*h(2,6))<1e-8)

将输入作为[x1,y1,x2,y2,x3,y3,x4,y4],输出一个布尔值。

ËF=一种C+bd
ËF一种bCd

在线尝试!


2

果冻,11字节

²Sṭ;L€€ṖÆḊ¬

在线尝试!

使用Misha Lavrov的Mathematica解决方案中的行列式方法。输出1为true,0为false。

怎么运行的

²Sṭ;L€€ṖÆḊ¬  Main link (monad). Input: [[x1,x2,x3,x4], [y1,y2,y3,y4]]
²S           Square each scalar and add row-wise; [x1*x1+y1*y1, ...]
  ṭ          Append to the input
   ;L€€      Add two rows of [1,1,1,1]'s
       Ṗ     Remove an extra row
        ÆḊ¬  Is the determinant zero?

果冻,12字节

Iµ÷×ƭ/÷SµḞ=A

在线尝试!

使用Misha Lavrov的TI-Basic解决方案中的卷积交叉比率方法。输出1为true,0为false。

怎么运行的

Iµ÷×ƭ/÷SµḞ=A  Main link (monad). Input: list of four complex numbers [z1,z2,z3,z4]
I             Increments; [z2-z1, z3-z2, z4-z3]
 µ            Refocus on above for sum function
  ÷×ƭ/÷S      (z2-z1)÷(z3-z2)×(z4-z3)÷(z4-z1)
        µ     Refocus again
         Ḟ=A  (real part) == (norm) within error margin
              i.e. imag part is negligible?

我相信两者都可以打高尔夫球...


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.