Abstraction of a Polygon

Introduced properties

fun add_vertex(p: Point[Float]): Bool

geometry :: APolygon :: add_vertex

Add a vertex to self
abstract fun contain(p: Point[Float]): Bool

geometry :: APolygon :: contain

Is p contained in self ?
fun delete_vertex(p: Point[Float])

geometry :: APolygon :: delete_vertex

Remove p from the vertices, keeping at least 3 vertices
abstract fun intersects(other: APolygon): Bool

geometry :: APolygon :: intersects

Does self intersects with other
fun is_convex: Bool

geometry :: APolygon :: is_convex

Is self convex ?
fun points: Array[Point[Float]]

geometry :: APolygon :: points

Vertices of this polygon
protected fun points=(points: Array[Point[Float]])

geometry :: APolygon :: points=

Vertices of this polygon
fun sort_ccw

geometry :: APolygon :: sort_ccw

Sort the vertices in counter clockwise order
fun sort_cw

geometry :: APolygon :: sort_cw

Sort the vertices in clockwise order

Redefined properties

redef type SELF: APolygon

geometry $ APolygon :: SELF

Type of this instance, automatically specialized in every class
redef init init

geometry $ APolygon :: init

All properties

fun !=(other: nullable Object): Bool

core :: Object :: !=

Have self and other different values?
fun ==(other: nullable Object): Bool

core :: Object :: ==

Have self and other the same value?
type CLASS: Class[SELF]

core :: Object :: CLASS

The type of the class of self.
type SELF: Object

core :: Object :: SELF

Type of this instance, automatically specialized in every class
fun add_vertex(p: Point[Float]): Bool

geometry :: APolygon :: add_vertex

Add a vertex to self
protected fun class_factory(name: String): CLASS

core :: Object :: class_factory

Implementation used by get_class to create the specific class.
fun class_name: String

core :: Object :: class_name

The class name of the object.
abstract fun contain(p: Point[Float]): Bool

geometry :: APolygon :: contain

Is p contained in self ?
fun delete_vertex(p: Point[Float])

geometry :: APolygon :: delete_vertex

Remove p from the vertices, keeping at least 3 vertices
fun get_class: CLASS

core :: Object :: get_class

The meta-object representing the dynamic type of self.
fun hash: Int

core :: Object :: hash

The hash code of the object.
init init

core :: Object :: init

fun inspect: String

core :: Object :: inspect

Developer readable representation of self.
protected fun inspect_head: String

core :: Object :: inspect_head

Return "CLASSNAME:#OBJECTID".
abstract fun intersects(other: APolygon): Bool

geometry :: APolygon :: intersects

Does self intersects with other
fun is_convex: Bool

geometry :: APolygon :: is_convex

Is self convex ?
intern fun is_same_instance(other: nullable Object): Bool

core :: Object :: is_same_instance

Return true if self and other are the same instance (i.e. same identity).
fun is_same_serialized(other: nullable Object): Bool

core :: Object :: is_same_serialized

Is self the same as other in a serialization context?
intern fun is_same_type(other: Object): Bool

core :: Object :: is_same_type

Return true if self and other have the same dynamic type.
intern fun object_id: Int

core :: Object :: object_id

An internal hash code for the object based on its identity.
fun output

core :: Object :: output

Display self on stdout (debug only).
intern fun output_class_name

core :: Object :: output_class_name

Display class name on stdout (debug only).
fun points: Array[Point[Float]]

geometry :: APolygon :: points

Vertices of this polygon
protected fun points=(points: Array[Point[Float]])

geometry :: APolygon :: points=

Vertices of this polygon
fun serialization_hash: Int

core :: Object :: serialization_hash

Hash value use for serialization
fun sort_ccw

geometry :: APolygon :: sort_ccw

Sort the vertices in counter clockwise order
fun sort_cw

geometry :: APolygon :: sort_cw

Sort the vertices in clockwise order
intern fun sys: Sys

core :: Object :: sys

Return the global sys object, the only instance of the Sys class.
abstract fun to_jvalue(env: JniEnv): JValue

core :: Object :: to_jvalue

fun to_s: String

core :: Object :: to_s

User readable representation of self.
package_diagram geometry::APolygon APolygon core::Object Object geometry::APolygon->core::Object geometry::Polygon Polygon geometry::Polygon->geometry::APolygon geometry::ConvexPolygon ConvexPolygon geometry::ConvexPolygon->geometry::APolygon

Parents

interface Object

core :: Object

The root of the class hierarchy.

Children

class ConvexPolygon

geometry :: ConvexPolygon

Convex Polygon class
class Polygon

geometry :: Polygon

A simple polygon

Class definitions

geometry $ APolygon
# Abstraction of a Polygon
abstract class APolygon
	# Vertices of this polygon
	var points: Array[Point[Float]]

	init do assert points.length >= 3

	# Get an array of the x coordinates of the vertices
	private fun x_coordinates: Array[Float] do
		return [for p in points do p.x]
	end

	# Get an array of the y coordinates of the vertices
	private fun y_coordinates: Array[Float] do
		return [for p in points do p.y]
	end

	# Get a matrice containing the coordinates of the vertices
	private fun vertices: Array[Array[Float]] do
		var vertices = new Array[Array[Float]]
		for i in [0..points.length[ do
			var temp = new Array[Float]
			temp.add(points[i].x)
			temp.add(points[i].y)
			vertices.add(temp)
		end
		return vertices
	end

	# Returns the axes corresponding to the edges of the polygon, used for collision detection
	private fun axes: Array[Point[Float]] do
		var axes = new Array[Point[Float]]
		for i in [0..points.length[ do
			var p1 = new Point[Float](points[i].x, points[i].y)
			var p2 = new Point[Float](points[(i+1) % points.length].x, points[(i+1) % points.length].y)
			var edge = new Point[Float](p1.x - p2.x, p1.y - p2.y)
			var normal = new Point[Float](-edge.y, edge.x)
			axes[i] = normal
		end
		return axes
	end

	# Sort the vertices in counter clockwise order
	#
	# ~~~
	# var p1 = new Point[Float](0.0, 0.0)
	# var p2 = new Point[Float](5.0, 0.0)
	# var p3 = new Point[Float](0.0, 5.0)
	# var p4 = new Point[Float](5.0, 5.0)
	# var arr = new Array[Point[Float]].with_items(p1, p2, p3, p4)
	# var poly = new ConvexPolygon(arr)
	# poly.sort_ccw
	# assert poly.points == [p4, p2, p1, p3]
	# ~~~
	fun sort_ccw do
		var sorter = new CounterClockWiseSort.with_center(vertices)
		sorter.sort(points)
	end

	# Sort the vertices in clockwise order
	#
	# ~~~
	# var p1 = new Point[Float](0.0, 0.0)
	# var p2 = new Point[Float](5.0, 0.0)
	# var p3 = new Point[Float](0.0, 5.0)
	# var p4 = new Point[Float](5.0, 5.0)
	# var arr = new Array[Point[Float]].with_items(p1, p2, p3, p4)
	# var poly = new ConvexPolygon(arr)
	# poly.sort_cw
	# assert poly.points == [p3, p1, p2, p4]
	# ~~~
	fun sort_cw do
		var sorter = new ClockWiseSort.with_center(vertices)
		sorter.sort(points)
	end

	# Is `self` convex ?
	#
	# ~~~
	# var p1 = new Point[Float](0.0, 0.0)
	# var p2 = new Point[Float](5.0, 0.0)
	# var p3 = new Point[Float](0.0, 5.0)
	# var p4 = new Point[Float](5.0, 5.0)
	# var arr = new Array[Point[Float]].with_items(p1, p2, p3, p4)
	# var poly = new ConvexPolygon(arr)
	# poly.sort_ccw
	# assert poly.is_convex
	# ~~~
	fun is_convex: Bool do
		var prev = points[points.length - 2]
		var curr = points[points.length - 1]
		var next = points[0]
		var is_ccw = turn_left(prev, curr, next)
		for i in [1..points.length[ do
			prev = curr
			curr= next
			next = points[i]
			if turn_left(prev ,curr, next) != is_ccw then return false
		end
		return true
	end

	# Generate a projection of an edge of the polygon on a given axis
	private fun project(axis: Point[Float]): Projection do
		var min = axis.x * points[0].x + axis.y * points[0].y
		var max = min
		for i in [0..points.length[ do
			var p = axis.x * points[i].x + axis.y * points[i].y
			if p < min then min = p
			if p > max then max = p
		end
		var projection = new Projection(min, max)
		return projection
	end

	# Remove  `p` from the vertices, keeping at least 3 vertices
	fun delete_vertex(p: Point[Float]) do
		assert points.length > 3
		points.remove(p)
	end

	# Does `self` intersects with `other`
	fun intersects(other: APolygon): Bool is abstract

	# Is `p` contained in `self` ?
	fun contain(p: Point[Float]): Bool is abstract

	# Add a vertex to `self`
	fun add_vertex(p: Point[Float]): Bool do
		points.add(p)
		return true
	end
end
lib/geometry/polygon.nit:22,1--154,3