代码之家  ›  专栏  ›  技术社区  ›  kettlepot

用给定的点集识别图的类型

  •  2
  • kettlepot  · 技术社区  · 15 年前

    我正在尝试设计一个程序,在给定一组点(x,y)的情况下绘制图形,它也应该只借助点来识别曲线(直线、双曲线、抛物线)。 有什么算法可以做到吗?

    2 回复  |  直到 11 年前
        1
  •  1
  •   Rawling isekaijin    13 年前

    如果曲线可以是直线或圆锥曲线(双曲线、抛物线、椭圆、圆),则需要5个点。

    如果这五个点是共线,你就有一条直线。(还是退化的圆锥曲线?但是,如果您希望看到直线,这应该表示一条直线。)

    如果四个共线,你会得到一个退化二次曲线,由穿过四个共线点的线和穿过第五个点的任何一条不平行于第一条线的线给出。

    如果三个是共线的,就有一个退化二次曲线,由穿过三个共线点的线和穿过另外两个点的线给出。(除非这两条线是平行的,在这种情况下,这不是圆锥曲线。)

    如果没有三个点共线,就有一个唯一的非退化二次曲线。

    要找到这个二次曲线的方程(ax^2+bxy+cy^2+dx+ey+f=0),请看 this page ,特别是 DETAILS 第节。输入五个x和y值,用x和y计算矩阵的行列式,这将给出二次曲线的公式。然后看 here 为了计算出基于a、b和c的圆锥曲线的类型。

    如果你有5个以上的点,选择5个点(最好没有三个共线),找到圆锥曲线,然后检查剩余的点是否在圆锥曲线上。

        2
  •  1
  •   Svisstack    15 年前

    你可以通过观察函数极值来做,但这可能不是这个问题的最佳解(我的意思是抛物线函数中的一个问题 y=sqrt(x*x-1) ) 对于直线,可以通过2个随机点计算y=ax+b,并检查其他点是否等于此条件(如果是)。这是一条直线,如果没有,你可以检查另外两个例外或从中什么都没有。也许其他人能为接下来的2个案例找到解决方案?