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

时间:2015-06-24 05:09:46

标签: c algorithm geometry

我正在努力解决Uva上的Determine the shape问题。从我在阅读问题后得到的结果来看,这是一个Ad Hoc几何问题,我们必须使用一些几何定理来确定我们在2D平面上作为输入形式的四个点的形状。花了好几个小时后,我仍然想不出任何有效的算法可以在给定的时间内有效地解决问题。我尝试使用距离公式和斜率但没有太大的帮助。请提出一些好的算法或定理我可以用来解决这个问题。

2 个答案:

答案 0 :(得分:0)

我的第一个想法如下:

  1. 确定每一侧的长度。使用公式sqrt((a - x)^2 + (b - y)^2)
  2. 确定每个角度。
  3. 确定哪种形状:
    • 如果所有角度都是90°
      • 如果所有方面都相同,请返回SQUARE
      • 否则,请返回RECTANGLE
    • 否则,如果角度1 = 3且角度2 = 4相等
      • 如果所有方面都相同,请返回RHOMBUS
      • 否则,返回Parallelogram
    • 否则,如果角度1 + 2 == 180,或角度3 + 4 == 180,则返回TRAPEZIUM
    • 否则,请返回ORDINARY QUADRILATERAL
  4. 但请考虑here之后的逻辑;他们使用了矢量数学,只是计算某些东西是直角还是两条线是平行的,而不是计算所有角度。

    1. 准备一些函数来计算两条线是否平行,以及角度是否是直角(使用矢量数学)。
    2. 对点进行排序,使它们按正确的旋转顺序排列(凹形的实际顺序不明确,但它不重要,仍应返回ORDINARY QUAD)。
    3. 确定每一行的长度。
    4. 确定形状,给定长度以及线条是平行还是角度正确。

答案 1 :(得分:0)

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

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

通过这种方式,我们可以实现相对较少的计算,从而明智地分支到我们想要的结果。希望这会有所帮助。