椭圆系统


9

介绍

给定平面中的五个点,您的任务是计算通过这些点的椭圆的面积。

您可以假设可以使用给定的输入值构造一个完全不变的椭圆。

规则

输入是10任何方便形式的整数,与点的xy坐标相对应。例如,您可以将输入作为10整数列表[x1, y1, x2, y2, ..., x5, y5][[x1, y1], [x2, y2], ..., [x5, y5]],等等。您也可以处理十进制数字,但只需要整数。

输出是椭圆面积的表示。这可以是一些符号表达式,也可以8是精度至少为十进制的十进制值。

这是代码高尔夫球,因此最短的答案以字节为单位。

输入和输出示例

输入:

[-2、3、2、5、5、3、4、0、1,-3

输出:

62.15326783788685

通过这些点的椭圆的描述:

此示例的椭圆

更多示例:

f(60, -92, -31, -10, 78, -19, -27, -35, 91, -37) = 9882.59540465108
f(-9, -4, 7, 7, 10, 1, -7, -10, 0, 7) = 269.5966648188643
f(-3, 2, 0, -5, 4, 0, -4, 1, -1, 2) = 98.54937293879908

这是否是受此SPOJ问题启发的?http://www.spoj.com/problems/ELLIPSE/
xnor

不是。我在该站点上不活跃。
伊桑·沃德

输出可能是符号表达式是什么意思?
xnor

@xnor也许是(未评估的)椭圆积分?
Mego

2
最好的工作工具就是:数学绘图程序!去图:P。
魔术章鱼缸

Answers:


7

Mathematica,87 80 78字节

Area@ImplicitRegion[+##Sign@#&@@Det[{1,##,1##,#^2,#2^2}&@@@{x|y,##}]>0,{x,y}]&

接受5个输入:[{x1, y1}, ... , {x5, y5}]

返回精确/符号值。

怎么样?

f(x, y)表示矢量(1, x, y, xy, x^2, y^2)一些x, y

然后,行向量矩阵的行列式[f(x, y), f(x1, y1), f(x2, y2), ..., f(x5, y5)]为零,如果(x, y)我们要寻找的是椭圆上的一点。即行列式给出椭圆的表达式。

由于表达式的符号可能会颠倒,因此我们取常量项,然后将整个表达式乘以常量的符号。这样,我们可以将表达式设置为大于0的值来查找区域。


+1。我喜欢您如何解决的问题Sign
Vitaliy Kaurov '17

5

MATLAB130个124 114字节

输入为takean作为两个列向量,一个用于x坐标,一个用于y坐标。此方法使用最小二乘回归,如果所有点都精确地位于椭圆上,则提供精确的椭圆,然后应用此处提供的公式(感谢@orlp)来计算面积。

function A=f(x,y);p=null([x.^2,2*x.*y,y.^2,2*x,2*y,0*x+1]);A=pi*det(p([1,2,4;2,3,5;4:6]))/abs(p(1)*p(3)-p(2)^2)^1.5

通过添加以下几行,您甚至可以绘制曲线:

X=x;Y=y;
[x,y] = meshgrid(linspace(-7,7,50));
W = [x(:).^2,2*x(:).*y(:),y(:).^2,2*x(:),2*y(:),0*x(:)+1];
Z=x;Z(:) = W*p;
clf;plot(X,Y,'o');hold on;contour(x,y,Z,[0,0]);

在线尝试!


3

Mathematica 84字节

我发现这是一个有趣的问题。每个椭圆都是单位圆的仿射变换,可以将其参数化为{x,y} = {Cos(t),Sin(t)},因此圆上的点可以通过{xE,yE映射到椭圆} = A {x,y} + B,其中A是常数矩阵,B是向量。插入点会产生10个标量方程和11个标量未知数,但是我们可以决定参数化从t = 0开始,因此系统是可解的。矩阵A的行列式的绝对值是椭圆的面积与单位圆的比值,因此我们乘以Pi。摆脱麦克斯摆脱了负面的解决方案。

Max[π(a d-b c)/.Solve@MapThread[#2=={e,f}+{a,b}Cos@#+{c,d}Sin@#&,{{0,u,v,w,x},#}]]&

用法:

%@{{-2, 3}, {2, 5}, {5, 3}, {4, 0}, {1, -3}}

产量:

(1001 π)/(16 Sqrt[10])

2

Mathematica,144个字节

x_±y_:=x^2a+b*x*y+y^2c+d*x+e*y+f;n=∞;Integrate[UnitStep[x±y/.FindInstance[And@@(#±#2==0&@@@#),{a,b,c,d,e,f},Reals,2][[1]]],{x,-n,n},{y,-n,n}]& 


适用于所有测试用例

输入示例[{{-3, 2}, {0, -5}, {4, 0}, {-4, 1}, {-1, 2}}]

结果

9882.59540465108163146329
269.596664818864334050934
98.5493729387989852754258


在默认的Windows编码中,距离JungHwan Min的-10个字节为 ±1个字节[CP-1252]


嗯...为什么我的输入示例无穷大?
numbermaniac

@numbermaniac我不知道。我说对了。您是否在使用此输入[{{-3, 2}, {0, -5}, {4, 0}, {-4, 1}, {-1, 2}}]
J42161217

是的,我-这很奇怪。
numbermaniac

我得到(3575880 π)/(2351 Sqrt[2351])的答案是可以接受的
J42161217

1
很奇怪,甚至ClearAll无法解决。哦,好吧,不用担心它哈哈。只要它对您有效。您正在使用哪个版本的Mathematica?
numbermaniac

2

Desmos,101位元组

u
v
f(a,b,c,h,k,x,y)=(((x-h)cosc+(y-k)sinc)/a)^2+(((x-h)sinc-(y-k)cosc)/b)^2
f(m,n,o,p,q,u,v)~1
mn\pi

Online Desmos不喜欢多行粘贴,因此您必须一次输入一行,或者

在线尝试!

输入使用两个列表uv。输出显示在最后一行。

说明:

  • 前两行命名输入变量。
  • 第三行定义的方程为任何椭圆,具有半径ab,旋转角c和偏移(h,k)

    • 美化,它看起来像这样: 在此处输入图片说明
  • 第四行计算f列表上的回归,uv找到半径mn,旋转角度o和偏移量(p,q)

  • 最后一行使用公式计算椭圆的面积 A = pi*r1*r2

您也可以在线尝试(不同的链接)以获得稍微扩展的交互式视觉版本。您可以在五个点上移动并实时查看椭圆和面积:

在此处输入图片说明

或者,这是使用该公式的更长一点的解决方案(与@flawr的答案相同):

Desmos,106个字节

u
v
f(A,B,C,D,E,F,x,y)=Axx+2Bxy+Cyy+2Dx+2Ey+F
f(G,H,I,J,K,L,u,v)~0
\pi(GIL+2HJK-JJK-GKK-HHL)/(GI-HH)^{1.5}

在线尝试!


您可能不需要在pi最后一行之前使用反斜杠:如果输入mnpi,则pi符号仍会出现。另外,您的意思是“ 输出显示在最后一行”而不是输入吗?
numbermaniac

1
@numbermaniac我放在反斜杠中,因为当我将其复制粘贴时mnpi,即使我键入它时也会说出来,它也无法识别。是的,我的意思是输出,而不是输入,谢谢。
Scott Milner
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.