我正在努力解决Uva上的Determine the shape问题。从我在阅读问题后得到的结果来看,这是一个Ad Hoc几何问题,我们必须使用一些几何定理来确定我们在2D平面上作为输入形式的四个点的形状。花了好几个小时后,我仍然想不出任何有效的算法可以在给定的时间内有效地解决问题。我尝试使用距离公式和斜率但没有太大的帮助。请提出一些好的算法或定理我可以用来解决这个问题。
答案 0 :(得分:0)
我的第一个想法如下:
sqrt((a - x)^2 + (b - y)^2)
。但请考虑here之后的逻辑;他们使用了矢量数学,只是计算某些东西是直角还是两条线是平行的,而不是计算所有角度。
答案 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
通过这种方式,我们可以实现相对较少的计算,从而明智地分支到我们想要的结果。希望这会有所帮助。