确定多边形是否凸出


21

编写程序以确定输入多边形是否为凸面。用包含N个(顶点数)的一条线指定多边形,然后使用包含每个顶点的xy坐标的N条线指定多边形。顶点将从任意顶点开始顺时针列出。

例子1

输入

4
0 0
0 1
1 1
1 0

输出

convex

例子2

输入

4
0 0
2 1
1 0
2 -1

输出

concave

例子3

输入

8
0 0
0 1
0 2
1 2
2 2
2 1
2 0
1 0

输出

convex

xy是整数N <1000| x |,| y | <1000。您可以假设输入多边形很简单(没有一条边交叉,每个顶点只有2条边接触)。最短的程序获胜。


“简单”不包括“连续边不是共线的”吗?另外,还有几个测试用例:(0,0)(0,2)(2,2)(2,0)(1,1);和(1,1)(0,0)(0,2)(2,2)(2,0)-测试发现凹形顶点需要从头到尾进行缠绕的情况。
彼得·泰勒

这个问题正在老化,但是...考虑添加一个具有两个对齐段的凹面示例,例如对示例2的修改:(0,0),(2,1),(4,2),(1,0)( 2,-1)。之所以提出这一点,是因为我对示例3进行了摸索,却没有意识到。
杰西·米利坎

Answers:


4

J,105

echo>('concave';'convex'){~1=#=(o.1)([:>-.~)(o.2)|3([:-/12 o.-@-/@}.,-/@}:)\(,2&{.)j./"1}.0&".;._2(1!:1)3

通过以上所有三个测试。

编辑:(111-> 115)通过消除pi的角度来处理共线点。在其他地方获得了几个字符。

编辑:(115-> 105)减少愚蠢程度。

对J受损者的解释:

  • (1!:1)3将STDIN读取为EOF。(我认为。)
  • 0&".;._2 是解析此类输入的好习惯。
  • j./"1}. 断开输入的第一行(N 0)并将对转换为复数。
  • (,2&{.) 将前两点添加到列表的末尾。
  • 3(f)\ 将f应用于长度为3的滑动窗口(角度为3点)
  • [:-/12 o.-@-/@}.,-/@}: 是一个动词,它将每三个点转换为-pi和pi之间的角度。
    • -@-/@}.,-/@}:产生(p1-p2),(p3-p2)。(回想一下,它们是复杂的。)
    • 12 o. 给出每个复合体的角度。
    • [:-/(...) 给出两个角度的差。
  • (o.1)([:>-.~)(o.2)| mod 2 pi,消除pi(直段)的角度,并与pi比较(大于,小于,无所谓,除非这些点被认为沿一个方向缠绕)。
  • 1=#= 如果所有比较结果均为1或0(使用自我分类。这似乎很愚蠢。)
  • echo>('concave';'convex'){~ 打印凸。

3

Python-149个字符

p=[map(int,raw_input().split())for i in[0]*input()]*2
print'ccoonncvaevxe'[all((a-c)*(d-f)<=(b-d)*(c-e)for(a,b),(c,d),(e,f)in zip(p,p[1:],p[2:]))::2]

我认为您需要<=,请参阅我刚刚添加的示例3。
基思·兰德尔

1
该死的,
那片

2

红宝石1.9,147 133 130 124 123

gets
puts ($<.map{|s|s.split.map &:to_i}*2).each_cons(3).any?{|(a,b),(c,d),(e,f)|(e-c)*(d-b)<(d-f)*(a-c)}?:concave: :convex

1

标量:297个字符

object C{class D(val x:Int,val y:Int)
def k(a:D,b:D,c:D)=(b.y-a.y)*(c.x-b.x)>=(c.y-b.y)*(b.x-a.x) 
def main(a:Array[String]){val s=new java.util.Scanner(System.in)
def n=s.nextInt
val d=for(x<-1 to n)yield{new D(n,n)}print((true/:(d:+d.head).sliding(3,1).toList)((b,t)=>b&&k(t(0),t(1),t(2))))}}

1
您可以使用def main(a:...代替刮除三个字符def main(args:...
加雷斯

是的,我注意到了自己,但是299到149并没有使我进入其他人的区域。也许如果我发现其他改进-啊,有一个改进:n是一个函数名(下一个)和一个变量名。
用户未知,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.