Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.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
C 从输入的四个点确定形状的有效算法_C_Algorithm_Geometry - Fatal编程技术网

C 从输入的四个点确定形状的有效算法

C 从输入的四个点确定形状的有效算法,c,algorithm,geometry,C,Algorithm,Geometry,我正在努力解决Uva的问题。从我读过的问题中可以看出,这是一个特殊的几何问题,在这个问题中,我们必须使用一些几何定理来确定我们在二维平面上作为输入形式的四个点的形状。花了几个小时后,我仍然想不出任何有效的算法可以在给定的时间限制内有效地解决问题。我尝试使用距离公式和斜率,但没有多大帮助。请推荐一些好的算法或定理,我可以用来解决这个问题。我的第一个想法是: 确定每边的长度。使用公式sqrt((a-x)^2+(b-y)^2) 确定每个角度 确定以下形状: 如果所有角度都为90 如果所有边相等,则

我正在努力解决Uva的问题。从我读过的问题中可以看出,这是一个特殊的几何问题,在这个问题中,我们必须使用一些几何定理来确定我们在二维平面上作为输入形式的四个点的形状。花了几个小时后,我仍然想不出任何有效的算法可以在给定的时间限制内有效地解决问题。我尝试使用距离公式和斜率,但没有多大帮助。请推荐一些好的算法或定理,我可以用来解决这个问题。

我的第一个想法是:

  • 确定每边的长度。使用公式
    sqrt((a-x)^2+(b-y)^2)
  • 确定每个角度
  • 确定以下形状:
    • 如果所有角度都为90
      • 如果所有边相等,则返回正方形
      • 否则,返回矩形
    • 否则,如果角度1=3和角度2=4相等
      • 如果所有边相等,则返回菱形
      • 否则,返回平行四边形
    • 否则,如果角度1+2==180,或角度3+4==180,则返回梯形
    • 否则,返回普通四边形
  • <>但是考虑下面的逻辑;他们使用矢量数学,简单地计算某物是直角还是两条线平行,而不是计算所有角度

  • 准备一些函数来计算两条线是否平行,以及一个角度是否为直角(使用向量数学)
  • 对点进行排序,使其处于正确的旋转顺序(凹面形状的实际顺序不明确,但这不重要,仍应返回普通四边形)
  • 确定每条线的长度
  • 确定形状,给定长度以及直线是平行还是直角

  • 首先,不同的形状有以下关系:

    Ordinary Quadrilateral --(with one pair of parallel sides)--> Trapezium 
    
    Trapezium --(with additional pair of parallel sides)--> Parallelogram
    
    Parallelogram     
    --(with four equal straight lines)--> Rhombus--(with four 90 degree angles)-->square    
    |--(with four 90 degree angles)--> Rectangle --(with four equal lines)--> square
    
    给定四个点,A,B,C,D,随机取一个(比如A),我们需要计算以下四对点(不是全部)的统计数据(角度和长度),包括

    (1) AB and CD, A1, L1
    (2) AC and BD, A2, L2 
    (3) AB and AC, A3, L3
    (4) AB and AD, A4, L4
    
    然后我想关键在于如何组织分支,这样我们就可以有最小的计算量和代码路径。我的建议如下:

    A3 = getAngle(AB, AC)
    A4 = getAngle(AB, AD)
    if A3 > A4
        we know AD is the diagonal line, then use A, B, C to calculate
    else
        we know AC is the diagonal line, then use A, B, D to calculate
    # following suppose we use A, B, C to do the calculation, we could easily do the A, B, D thing if define new variables
    L3 = LengthEqual(AB, AC)
    A1 = getAngle(AB, AD)
    if A3 == 90 && A1 == 0
          if L3 == True
               Square
          else 
               Rectangle
    else
          A2 = getAngle(AC, BD)
          L2 = LengthEqual(AC, BD)
          if A2 == 0 && A1 == 0
               if L2 == True
                   Rhombus
               else
                   Parallelogram
          else if A2 == 0 || A1 == 0
               Trapezium
          else 
               Ordinary Quadrilateral
    
    通过这种方式,我们可以实现相对较少的计算,从而明智地分支到我们想要的结果。希望这有帮助