Skip to content

gm #

Geometry algorithms and structures

This package provides some functions to help with the solution of geometry problems. It also includes some routines loosely related with geometry.

Constants #

const xdelzero = 1e-10 // minimum distance between coordinates; i.e. xmax[i]-xmin[i] mininum

fn dist_point_line #

fn dist_point_line(p &Point, a &Point, b &Point, tol f64) f64

dist_point_line computes the distance from p to line passing through a -> b

fn dist_point_point #

fn dist_point_point(a &Point, b &Point) f64

dist_point_point computes the unsigned distance from a to b

fn is_point_in #

fn is_point_in(p &Point, cmin []f64, cmax []f64, tol f64) bool

is_point_in returns whether p is inside box with cmin and cmax

fn is_point_in_line #

fn is_point_in_line(p &Point, a &Point, b &Point, zero f64, told f64, tolin f64) bool

is_point_in_line returns whether p is inside line passing through a and b

fn points_lims #

fn points_lims(pp []&Point) ([]f64, []f64)

points_lims returns the limits of a set of points

fn vector_add #

fn vector_add(alpha f64, u []f64, beta f64, v []f64) []f64

vector_add returns a new vector by adding two other vectors w := αu + βv

fn vector_dot #

fn vector_dot(u []f64, v []f64) f64

vector_dot returns the dot product between two vectors

fn vector_new #

fn vector_new(m f64, u []f64) []f64

vector_new returns a new vector scaled by m

fn vector_norm #

fn vector_norm(u []f64) f64

vector_norm returns the length (Euclidean norm) of a vector

fn Bins.new #

fn Bins.new(xmin []f64, xmax []f64, ndiv_ []int) &Bins

Bins.new initialise bins structure xmin -- [ndim] min/initial coordinates of the whole space (box/cube) xmax -- [ndim] max/final coordinates of the whole space (box/cube) ndiv -- [ndim] number of divisions for xmax-xmin

fn Point.new #

fn Point.new(x f64, y f64, z f64) &Point

Point.new creates a new point

fn Segment.new #

fn Segment.new(a &Point, b &Point) &Segment

Segment.new creates a new segment from a to b

type PointsDiffFn #

type PointsDiffFn = fn (is_old int, x_new []f64) bool

struct Bin #

@[heap]
struct Bin {
pub mut:
	index   int // index of bin
	entries []&BinEntry // entries
}

Bin defines one bin in Bins (holds entries for search)

fn (Bin) str #

fn (o Bin) str() string

str returns the string representation of one Bin

struct BinEntry #

@[heap]
struct BinEntry {
pub mut:
	id    int     // object Id
	x     []f64   // entry coordinate (read only)
	extra voidptr // any entity attached to this entry
}

BinEntry holds data of an entry to bin

struct Bins #

@[heap]
struct Bins {
mut:
	tmp []int // [ndim] temporary (auxiliary) slice
pub mut:
	ndim int    // space dimension
	xmin []f64  // [ndim] left/lower-most point
	xmax []f64  // [ndim] right/upper-most point
	xdel []f64  // [ndim] the lengths along each direction (whole box)
	size []f64  // size of bins
	ndiv []int  // [ndim] number of divisions along each direction
	all  []&Bin // [nbins] all bins (there will be an extra "ghost" bin along each dimension)
}

Bins implements a set of bins holding entries and is used to fast search entries by given coordinates.

fn (Bins) append #

fn (mut o Bins) append(x []f64, id int, extra voidptr)

append adds a new entry {x, id, something} into the bins structure

fn (Bins) clear #

fn (mut o Bins) clear()

clear clears all biBinsns

fn (Bins) find_bin_by_index #

fn (mut o Bins) find_bin_by_index(idx int) &Bin

find_bin_by_index finds or allocate new bin corresponding to index idx

fn (Bins) calc_index #

fn (mut o Bins) calc_index(x []f64) int

calc_index calculates the bin index where the point x is returns -1 if out-of-range

fn (Bins) find_closest #

fn (mut o Bins) find_closest(x []f64) (int, f64)

find_closest returns the id of the entry whose coordinates are closest to x id_closest -- the id of the closest entity. return -1 if out-of-range or not found sq_dist_min -- the minimum distance (squared) between x and the closest entity in the same bin

Note: find_closest does search the whole area.It only locates neighbours in the same bin where the given x is located. So, if there area no entries in the bin containing x, no entry will be found.

fn (Bins) find_closest_and_append #

fn (mut o Bins) find_closest_and_append(mut next_id &int, x []f64, extra voidptr, rad_tol f64, diff PointsDiffFn) (int, bool)

find_closest_and_append finds closest point and, if not found, append to bins with a new Id input: next_id -- is the Id of the next point. Will be incremented if x is a new point to be added. x -- is the point to be added extra -- extra information attached to point rad_tol -- is the tolerance for the radial distance (i.e. NOT squared) to decide whether a new point will be appended or not. diff -- [optional] a function for further check that the new and an eventual existent points are really different, even after finding that they coincide (within tol) output: id -- the id attached to x existent -- flag telling if x was found, based on given tolerance

fn (Bins) find_along_segment #

fn (mut o Bins) find_along_segment(xi_ []f64, xf_ []f64, tol f64) []int

find_along_segment gets the ids of entries that lie close to a segment

Note: the initial (xi) and final (xf) points on segment define a bounding box to filter points

fn (Bins) get_limits #

fn (o &Bins) get_limits(idx_bin int) ([]f64, []f64)

get_limits returns limigs of a specific bin

fn (Bins) nactive #

fn (o &Bins) nactive() int

nactive returns the number of active bins; i.e. non-nil bins

fn (Bins) nentries #

fn (o &Bins) nentries() int

nentries returns the total number of entries (in active bins)

fn (Bins) summary #

fn (o &Bins) summary() string

summary returns the summary of this Bins' data

fn (Bins) str #

fn (o &Bins) str() string

str returns the string representation of a set of Bins

struct Point #

@[heap]
struct Point {
pub mut:
	x f64
	y f64
	z f64
}

Point holds the Cartesian coordinates of a point in 3D space

fn (Point) clone #

fn (o &Point) clone() &Point

clone creates a new copy of Point

fn (Point) disp #

fn (o &Point) disp(dx f64, dy f64, dz f64) &Point

disp creates a new copy of Point displaced by dx, dy, dz

fn (Point) str #

fn (o &Point) str() string

str outputs Point

struct Segment #

@[heap]
struct Segment {
pub:
	a &Point = unsafe { nil }
	b &Point = unsafe { nil }
}

Segment represents a directed segment from a to b

fn (Segment) len #

fn (o &Segment) len() f64

len computes the length of Segment == Euclidean norm

fn (Segment) scaled #

fn (o &Segment) scaled(m f64) &Segment

New creates a new Segment scaled by m and starting from A

fn (Segment) vector #

fn (o &Segment) vector(m f64) []f64

vector returns the vector representing Segment from A to B (scaled by m)

fn (Segment) str #

fn (o &Segment) str() string

str outputs Segment