chickadee » 2d-primitives

Outdated egg!

This is an egg for CHICKEN 4, the unsupported old release. You're almost certainly looking for the CHICKEN 5 version of this egg, if it exists.

If it does not exist, there may be equivalent functionality provided by another egg; have a look at the egg index. Otherwise, please consider porting this egg to the current version of CHICKEN.



A collection of primitives and linear algebra common for 2D graphics and 2D games.


Richard van Roy (pluizer)




Floating points

fmod numer denomprocedure

Returns the floating-point remainder of numer/denom (rounded towards zero).

clamp f mmin mmaxprocedure

Clamp a floating-point number to a minimum and a maximum.

sqr xprocedure

Square a number.


Minimum representable floating-point number.





radian->degree radiansprocedure
degree->radian degreesprocedure
flip-radian-h radiansprocedure
flip-radian-v radiansprocedure
flip-degree-h degreesprocedure
flip-degree-v degreesprocedure


vect:create x yprocedure

Returs a new vector

vect? objprocedure
vect:x vprocedure
vect:y vprocedure

Constant for the zero vector.

(vect=? a b #!optional (epsilon .001)procedure

Check if two vectors are equal.

vect+ a bprocedure

Add two vectors.

vect- a #!optional bprocedure

Subtract two vectors or negate a vector.

vect* v sprocedure

Scalar multiplication.

vect:dot a bprocedure

Vector dot product.

vect:cross a bprocedure

2D vector cross product analog. The cross product of 2D vectors results in a 3D vector with only a z component. This function returns the magnitude of the z value.

vect:perp vprocedure

Returns a perpendicular vector. <procedure>(90 degree rotation)</procedure><br/>

vect:vperp vprocedure

Returns a perpendicular vector. <procedure>(-90 degree rotation)</procedure><br/>

vect:project a bprocedure

Returns the vector projection of /a/ onto /b/.

angle->vect aprocedure

Returns the unit length vector for the given angle (in radians).

vect->angle vprocedure

Returns the angular direction v is pointing in (in radians).

vect:rotate a bprocedure

Uses complex number multiplication to rotate /a/ by /b/. Scaling will occur if /a/ is not a unit vector.

vect:unrotate a bprocedure

Inverse of vect:rotate

vect:length-squared vprocedure

Returns the squared length of v. Faster than /(vect:length)/ when you only need to compare lengths.

vect:length vprocedure

Returns the length of v.

vect:lerp v1 v2 tprocedure

Linearly interpolate between /a/ and /b/.

vect:normalize vprocedure

Returns a normalized copy of v.

vect:clamp v lenprocedure

Clamp v to length len.

vect:lerp-const v1 v2 distprocedure

Linearly interpolate between v1 towards v2 by distance d.

vect:dist v1 v2procedure

Returns the distance between v1 and v2.

vect:dist-squared v1 v2procedure

Returns the squared distance between v1 and v2. Faster than /(vect:distance)/ when you only need to compare distances.

vect:near? a b distprocedure

Returns true if the distance between v1 and v2 is less than dist.

vect:spherical-lerp a b tprocedure

Spherical linearly interpolate between /a/ and /b/.

vect:spherical-lerp-const a b angleprocedure

Spherical linearly interpolate between /a/ towards /b/ by no more than angle /angle/ in radians.

Bounding Boxes

rect:create l r b tprocedure

Returs a new bounding box.

rect? objprocedure

Can also be a line.

rect:l rectprocedure
rect:r rectprocedure
rect:b rectprocedure
rect:t rectprocedure
rect:for-circle p rprocedure

Constructs a /rect/ for a circle with the given position and radius.

rect:intersects? a bprocedure

Returns true if /a/ and /b/ intersect.

rect:contains? rect otherprocedure

Returns true if /other/ lies completely within /rect/.

rect:constains-vect? rect vprocedure

Returns true if /rect/ contains /v/.

rect:merge a bprocedure

Returns a bounding box that holds both bounding boxes.

rect:expand rect vprocedure

Returns a bounding box that holds both /rect/ and /v/.

rect:center rectprocedure

Returns the center of a bounding box.

rect:area rectprocedure

Returns the area of the bounding box.

rect:merged-area a bprocedure

Merges /a/ and /b/ and returns the area of the merged bounding box.

rect:segment-query rect a bprocedure

Returns the fraction along the segment query the bounding box is hit. Returns /infinity/ if it doesn't hit.

rect:intersects-segment? rect a bprocedure

Return true if the bounding box intersects the line segment with ends /a/ and /b/.

rect- rect vectprocedure

Substracts a vector from a rectangle.

rect+ rect vectprocedure

Adds a vector to a rectangle.


line:create a bprocedure

Makes a line from two vectors

line? objprocedure

Can also be a rect.


(polygon:create vects)syntax

Creates a new polygon from a list of vectors.

polygon->vects polygonprocedure

Converts a polygon to a list of vertices.

polygon:triangulate polygonprocedure

Triangulates the given polygon and returns an array of vectors.

polygon:triangulate->triangles polygonprocedure

Same as polygon-triangulate but returns a list of triangles.

polygon-convex? polygonprocedure

Return #t if the given polygon is convex.

convex-hull vectsprocedure

Returns the convex hull of a group of vertices in clockwise order.

polygon:convex-hull vectsprocedure

Converts any polygon to a convex polygon.

Bezier curves

bezier:create control-points ...procedure

Creates a new bezier curve with a minimum of two control-points.

bezier:ref bezier nprocedure

Return the point of a bezier at position n, where 0.0 is the start of the curve and 1.0 is the end.

bezier->vects bezier accuracyprocedure

Returns a list of points that make of a bezier curve. A higher /accuracy/ results in a higher resolution (more points).


(rgb:create r g b #!optional (a 1.0)procedure

Creates a new RGB colour

rgb:r rgbprocedure
rgb:g rgbprocedure
rgb:b rgbprocedure
rgb:a rgbprocedure
rgb->hsv rgbprocedure

Convers a rgb colour to a hsv colour.

(hsv:create h s v #!optional (a 1.0)procedure

Creates a new HSV colour

hsv:h hsvprocedure
hsv:s hsvprocedure
hsv:v hsvprocedure
hsv:a hsvprocedure
hsv->rgb hsvprocedure

Converts a hsv colour to a rgb colour.

Contents »