Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 用圆上的一组点计算四边形的数目_Algorithm_Geometry_Graph Algorithm - Fatal编程技术网

Algorithm 用圆上的一组点计算四边形的数目

Algorithm 用圆上的一组点计算四边形的数目,algorithm,geometry,graph-algorithm,Algorithm,Geometry,Graph Algorithm,设x^2+y^2=r^2是一个r为实的圆 首先,我得到圆上的所有整数点(例如,(1,2),(-1,2),(1,-2),(-1,-2),(2,1),(-2,1),(2,-1),(-2,-1),r=sqrt{5}) 如何得到这些点上可能存在的四边形数 我知道的唯一方法是使用蛮力测试所有可能的4个循环,并移除交叉边的循环,但对于大r来说,它变得太大了。即使对于r=sqrt(5),使用python也需要大约10秒钟。改变方法,从一个简单的问题开始: 给定位于圆上的一组点: 如果尺寸为3,可以有多少个四

设x^2+y^2=r^2是一个r为实的圆

首先,我得到圆上的所有整数点(例如,(1,2),(-1,2),(1,-2),(-1,-2),(2,1),(-2,1),(2,-1),(-2,-1),r=sqrt{5})

如何得到这些点上可能存在的四边形数


我知道的唯一方法是使用蛮力测试所有可能的4个循环,并移除交叉边的循环,但对于大r来说,它变得太大了。即使对于r=sqrt(5),使用python也需要大约10秒钟。

改变方法,从一个简单的问题开始:

给定位于圆上的一组点:

  • 如果尺寸为3,可以有多少个四边形

    • 容易:0
  • 如果尺寸为4,可以有多少个四边形

    • 因为这些点位于同一个圆上,所以永远不会有3个点位于同一条直线上。所以答案是1
现在变得有点难了

  • 如果尺寸为5,可以有多少个四边形

    • 对于4个点,我们只有一个四边形:(p1,p2,p3,p4)。现在我可以用p5替换它们中的每一个。总数是5
  • 如果尺寸为n,可以有多少个四边形

    • 您可以有尽可能多的四边形作为可能的组合数,而无需重复大小为4的子集中的一组n项,即n/(4!*(n-4)!)
你不需要知道什么坐标有这些点,只需要知道它们有多少。
记住:给定3个不在同一条直线上的点,你只能有一个圆。无论你从一个圆中得到三个点,它们永远不会在同一条直线上。这意味着,无论你如何从一个圆中获得4个点,你都可以使用它们来构建一个四边形

改变方法,从一个简单的问题开始:

给定位于圆上的一组点:

  • 如果尺寸为3,可以有多少个四边形

    • 容易:0
  • 如果尺寸为4,可以有多少个四边形

    • 因为这些点位于同一个圆上,所以永远不会有3个点位于同一条直线上。所以答案是1
现在变得有点难了

  • 如果尺寸为5,可以有多少个四边形

    • 对于4个点,我们只有一个四边形:(p1,p2,p3,p4)。现在我可以用p5替换它们中的每一个。总数是5
  • 如果尺寸为n,可以有多少个四边形

    • 您可以有尽可能多的四边形作为可能的组合数,而无需重复大小为4的子集中的一组n项,即n/(4!*(n-4)!)
你不需要知道什么坐标有这些点,只需要知道它们有多少。
记住:给定3个不在同一条直线上的点,你只能有一个圆。无论你从一个圆中得到三个点,它们永远不会在同一条直线上。这意味着,无论从一个圆中获得4个点,您都可以使用它们来构建一个四边形

请注意,圆上的任何4个点都可以形成一个四边形(例如,按顺时针顺序选择它们)。你只需要找到所有的积分值 pythogorean三元组,其中m^n+n^2=r^2

T = 0
for m = 1 ... r
    for n = 1 ... r
        if m*m + n*n = r*r
            T++
N = 4*T  // (+/-m, +/-n) points on circle
result = N > 0 ? (N choose 4) : 0   // all quads

为了提高效率,您可以去掉上面的内环(n^2=地板(r^2-m^2))

请注意,圆上的任意4个点形成一个四边形(例如,按顺时针顺序选择它们)。你只需要找到所有的积分值 pythogorean三元组,其中m^n+n^2=r^2

T = 0
for m = 1 ... r
    for n = 1 ... r
        if m*m + n*n = r*r
            T++
N = 4*T  // (+/-m, +/-n) points on circle
result = N > 0 ? (N choose 4) : 0   // all quads

为了提高效率,你可以去掉上面的内环(n^2=地板(r^2-m^2))

10秒后你得到了什么答案?@user3386109 38个四边形,有210个候选空间。圆上的任何4个(不同)点都可以连接成一个四边形右侧(例如,按顺时针顺序选择4个点)?那么答案不就是n选择4=n*(n-1)*(n-2)*(n-3)/24吗?等等——r需要是毕达哥拉斯三元组(a,b,r)中的最大数。。。(+/-a,+/-b)会给你四分。。。嗯……10秒后你得到了什么答案?@user3386109 38个四边形,有210个候选点。圆上的任何4个(不同)点都可以连接成一个四边形(例如,按顺时针顺序选择4个点)?那么答案不就是n选择4=n*(n-1)*(n-2)*(n-3)/24吗?等等——r需要是毕达哥拉斯三元组(a,b,r)中的最大数。。。(+/-a,+/-b)会给你四分。。。六羟甲基三聚氰胺六甲醚。。。