Nit Convex Polygon benchmark code
authorBlackMinou <romain.chanoir@viacesi.fr>
Fri, 22 May 2015 09:27:31 +0000 (11:27 +0200)
committerBlackMinou <romain.chanoir@viacesi.fr>
Wed, 27 May 2015 17:30:09 +0000 (19:30 +0200)
Signed-off-by: BlackMinou <romain.chanoir@viacesi.fr>

benchmarks/polygons/nit/bench_polygon.nit [new file with mode: 0644]

diff --git a/benchmarks/polygons/nit/bench_polygon.nit b/benchmarks/polygons/nit/bench_polygon.nit
new file mode 100644 (file)
index 0000000..695f4aa
--- /dev/null
@@ -0,0 +1,135 @@
+#This file is part of NIT (http://www.nitlanguage.org).
+#
+# Copyright 2015 Romain Chanoir <romain.chanoir@viacesi.fr>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# a bench for the polygons
+module bench_polygon
+
+intrude import geometry::polygon
+import opts
+
+# Bench adding random vertices
+fun bench_add_vertices(n: Int) do
+       var randompoints = generate_points(n + 1)
+       var points = randompoints.clone
+       points.remove_at(points.length -1)
+       var poly = new ConvexPolygon.with_vertices(randompoints)
+       poly.sort_ccw
+       poly.add_vertex(randompoints.last)
+end
+
+# Bench the convex hull algorithm
+fun bench_convex_hull(n: Int) do
+       srand_from(50)
+       var randompoints = new Array[Point[Float]]
+       for i in [0..n] do
+               var point = new Point[Float](300.0.rand, 300.0.rand)
+               randompoints.add(point)
+       end
+       convex_hull(randompoints)
+end
+
+
+# Bench the convexity verificatioon
+fun bench_convexity(n : Int) do
+       var randompoints = generate_points(n)
+       var poly = new ConvexPolygon.with_vertices(randompoints)
+       poly.sort_ccw
+       poly.is_convex
+end
+
+# Bench the point in polygon algorithm
+fun bench_contain(n : Int) do
+       srand_from(50)
+       var randompoints = generate_points(n)
+       var poly = new ConvexPolygon.with_vertices(randompoints)
+       poly.sort_ccw
+       var point = new Point[Float](0.0, 0.0)
+       poly.contain(point)
+end
+
+# Bench the sorting of the vertices
+fun bench_sorting(n : Int) do
+       var randompoints = generate_points(n)
+       randompoints.shuffle
+       var poly = new ConvexPolygon.with_vertices(randompoints)
+       poly.sort_ccw
+
+end
+
+# Bench the intersection test between two polygons
+fun bench_intersection(n : Int) do
+       var r1 = generate_points(n)
+       var r2 = generate_points(n)
+       var poly1 = new ConvexPolygon.with_vertices(r1)
+       var poly2 = new ConvexPolygon.with_vertices(r2)
+       poly1.sort_ccw
+       poly2.sort_ccw
+       poly1.intersects(poly2)
+end
+
+# Get `n` points from a circle
+fun get_points_on_circle(radius: Float, n: Int): Array[Point[Float]] do
+       srand_from(50)
+       var points = new Array[Point[Float]]
+       for i in n.times do
+               var angle =  1000.0.rand * pi * 2.0
+               var point = new Point[Float](angle.cos * radius, angle.sin * radius)
+               points.add(point)
+       end
+       return points
+end
+
+# Helper for `get_points_on_circle`
+fun generate_points(n: Int): Array[Point[Float]] do
+       return get_points_on_circle(100.0, n)
+end
+
+var opts = new OptionContext
+var mode = new OptionEnum(["add_vertex","sort_vertices","intersection","convex_hull","is_convex","contain"], "Mode", -1, "-m")
+var nb_points = new OptionInt("number of points generated for the bench", -1, "--nbpts")
+opts.add_option(mode, nb_points)
+
+opts.parse(args)
+
+if nb_points.value == -1 then
+       opts.usage
+       exit(-1)
+end
+
+var modval = mode.value
+var n = nb_points.value
+if modval == 0 then
+       print "bench_add_vertices"
+       bench_add_vertices(n)
+else if modval == 1 then
+       print "bench_sorting"
+       bench_sorting(n)
+else if modval == 2 then
+       print "bench_intersection"
+       bench_intersection(n)
+else if modval == 3 then
+       print "bench_convex_hull"
+       bench_convex_hull(n)
+else if modval == 4 then
+       print "bench_convexity"
+       bench_convexity(n)
+else if modval == 5 then
+       print "bench_contain"
+       bench_contain(n)
+else
+       opts.usage
+       exit(-1)
+end