# 2次元点群PointGroup pg
andrewScan(pg):
Stack st
orderedIndex ← pg.points をx を基準に、同じ場合はyを基準にソートしたインデックスの列
st.push(orderedIndex[0])
st.push(orderedIndex[1])
for i ← 2 to pg.N-1:
head = orderedIndex[i]
while st.size() ≥ 2:
top2 ← stの頂点の下の値
top1 ← stの頂点の値
if pg.points[top2] とpg.points[top1]がなす直線に対して
pg.points[head]が左側にある(反時計回り):
st.pop()
else:
break
st.push(head)