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