Geometry2D

package
v0.0.0-...-c858641 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 14, 2025 License: MIT Imports: 25 Imported by: 0

Documentation

Overview

Provides a set of helper functions to create geometric shapes, compute intersections between shapes, and process various other geometric operations in 2D.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func Advanced

func Advanced() class

Advanced exposes a 1:1 low-level instance of the class, undocumented, for those who know what they are doing.

func BresenhamLine

func BresenhamLine(from Vector2i.XY, to Vector2i.XY) []Vector2i.XY

Returns the Bresenham line between the 'from' and 'to' points. A Bresenham line is a series of pixels that draws a line and is always 1-pixel thick on every row and column of the drawing (never more, never less).

Example code to draw a line between two graphics.gd/classdb/Marker2D nodes using a series of graphics.gd/classdb/CanvasItem.Instance.DrawRect calls:

func ClipPolygons

func ClipPolygons(polygon_a []Vector2.XY, polygon_b []Vector2.XY) [][]Vector2.XY

Clips 'polygon_a' against 'polygon_b' and returns an array of clipped polygons. This performs OperationDifference between polygons. Returns an empty array if 'polygon_b' completely overlaps 'polygon_a'.

If 'polygon_b' is enclosed by 'polygon_a', returns an outer polygon (boundary) and inner polygon (hole) which could be distinguished by calling IsPolygonClockwise.

func ClipPolylineWithPolygon

func ClipPolylineWithPolygon(polyline []Vector2.XY, polygon []Vector2.XY) [][]Vector2.XY

Clips 'polyline' against 'polygon' and returns an array of clipped polylines. This performs OperationDifference between the polyline and the polygon. This operation can be thought of as cutting a line with a closed shape.

func ConvexHull

func ConvexHull(points []Vector2.XY) []Vector2.XY

Given an array of [Vector2.XY]s, returns the convex hull as a list of points in counterclockwise order. The last point is the same as the first one.

func DecomposePolygonInConvex

func DecomposePolygonInConvex(polygon []Vector2.XY) [][]Vector2.XY

Decomposes the 'polygon' into multiple convex hulls and returns an array of [][Vector2.XY].

func ExcludePolygons

func ExcludePolygons(polygon_a []Vector2.XY, polygon_b []Vector2.XY) [][]Vector2.XY

Mutually excludes common area defined by intersection of 'polygon_a' and 'polygon_b' (see IntersectPolygons) and returns an array of excluded polygons. This performs OperationXor between polygons. In other words, returns all but common area between polygons.

The operation may result in an outer polygon (boundary) and inner polygon (hole) produced which could be distinguished by calling IsPolygonClockwise.

func GetClosestPointToSegment

func GetClosestPointToSegment(point Vector2.XY, s1 Vector2.XY, s2 Vector2.XY) Vector2.XY

Returns the 2D point on the 2D segment ('s1', 's2') that is closest to 'point'. The returned point will always be inside the specified segment.

func GetClosestPointToSegmentUncapped

func GetClosestPointToSegmentUncapped(point Vector2.XY, s1 Vector2.XY, s2 Vector2.XY) Vector2.XY

Returns the 2D point on the 2D line defined by ('s1', 's2') that is closest to 'point'. The returned point can be inside the segment ('s1', 's2') or outside of it, i.e. somewhere on the line extending from the segment.

func GetClosestPointsBetweenSegments

func GetClosestPointsBetweenSegments(p1 Vector2.XY, q1 Vector2.XY, p2 Vector2.XY, q2 Vector2.XY) []Vector2.XY

Given the two 2D segments ('p1', 'q1') and ('p2', 'q2'), finds those two points on the two segments that are closest to each other. Returns a [][Vector2.XY] that contains this point on ('p1', 'q1') as well the accompanying point on ('p2', 'q2').

func IntersectPolygons

func IntersectPolygons(polygon_a []Vector2.XY, polygon_b []Vector2.XY) [][]Vector2.XY

Intersects 'polygon_a' with 'polygon_b' and returns an array of intersected polygons. This performs OperationIntersection between polygons. In other words, returns common area shared by polygons. Returns an empty array if no intersection occurs.

The operation may result in an outer polygon (boundary) and inner polygon (hole) produced which could be distinguished by calling IsPolygonClockwise.

func IntersectPolylineWithPolygon

func IntersectPolylineWithPolygon(polyline []Vector2.XY, polygon []Vector2.XY) [][]Vector2.XY

Intersects 'polyline' with 'polygon' and returns an array of intersected polylines. This performs OperationIntersection between the polyline and the polygon. This operation can be thought of as chopping a line with a closed shape.

func IsPointInCircle

func IsPointInCircle(point Vector2.XY, circle_position Vector2.XY, circle_radius Float.X) bool

Returns true if 'point' is inside the circle or if it's located exactly on the circle's boundary, otherwise returns false.

func IsPointInPolygon

func IsPointInPolygon(point Vector2.XY, polygon []Vector2.XY) bool

Returns true if 'point' is inside 'polygon' or if it's located exactly on polygon's boundary, otherwise returns false.

func IsPolygonClockwise

func IsPolygonClockwise(polygon []Vector2.XY) bool

Returns true if 'polygon”s vertices are ordered in clockwise order, otherwise returns false.

Note: Assumes a Cartesian coordinate system where +x is right and +y is up. If using screen coordinates (+y is down), the result will need to be flipped (i.e. a true result will indicate counter-clockwise).

func LineIntersectsLine

func LineIntersectsLine(from_a Vector2.XY, dir_a Vector2.XY, from_b Vector2.XY, dir_b Vector2.XY) any

Returns the point of intersection between the two lines ('from_a', 'dir_a') and ('from_b', 'dir_b'). Returns a [Vector2.XY], or null if the lines are parallel.

from and dir are not endpoints of a line segment or ray but the slope (dir) and a known point (from) on that line.

func MergePolygons

func MergePolygons(polygon_a []Vector2.XY, polygon_b []Vector2.XY) [][]Vector2.XY

Merges (combines) 'polygon_a' and 'polygon_b' and returns an array of merged polygons. This performs OperationUnion between polygons.

The operation may result in an outer polygon (boundary) and multiple inner polygons (holes) produced which could be distinguished by calling IsPolygonClockwise.

func OffsetPolygon

func OffsetPolygon(polygon []Vector2.XY, delta Float.X, join_type PolyJoinType) [][]Vector2.XY

Inflates or deflates 'polygon' by 'delta' units (pixels). If 'delta' is positive, makes the polygon grow outward. If 'delta' is negative, shrinks the polygon inward. Returns an array of polygons because inflating/deflating may result in multiple discrete polygons. Returns an empty array if 'delta' is negative and the absolute value of it approximately exceeds the minimum bounding rectangle dimensions of the polygon.

Each polygon's vertices will be rounded as determined by 'join_type', see PolyJoinType.

The operation may result in an outer polygon (boundary) and inner polygon (hole) produced which could be distinguished by calling IsPolygonClockwise.

Note: To translate the polygon's vertices specifically, multiply them to a [Transform2D.OriginXY]:

func OffsetPolygonOptions

func OffsetPolygonOptions(polygon []Vector2.XY, delta Float.X, join_type PolyJoinType) [][]Vector2.XY

Inflates or deflates 'polygon' by 'delta' units (pixels). If 'delta' is positive, makes the polygon grow outward. If 'delta' is negative, shrinks the polygon inward. Returns an array of polygons because inflating/deflating may result in multiple discrete polygons. Returns an empty array if 'delta' is negative and the absolute value of it approximately exceeds the minimum bounding rectangle dimensions of the polygon.

Each polygon's vertices will be rounded as determined by 'join_type', see PolyJoinType.

The operation may result in an outer polygon (boundary) and inner polygon (hole) produced which could be distinguished by calling IsPolygonClockwise.

Note: To translate the polygon's vertices specifically, multiply them to a [Transform2D.OriginXY]:

func OffsetPolyline

func OffsetPolyline(polyline []Vector2.XY, delta Float.X, join_type PolyJoinType) [][]Vector2.XY

Inflates or deflates 'polyline' by 'delta' units (pixels), producing polygons. If 'delta' is positive, makes the polyline grow outward. Returns an array of polygons because inflating/deflating may result in multiple discrete polygons. If 'delta' is negative, returns an empty array.

Each polygon's vertices will be rounded as determined by 'join_type', see PolyJoinType.

Each polygon's endpoints will be rounded as determined by 'end_type', see PolyEndType.

The operation may result in an outer polygon (boundary) and inner polygon (hole) produced which could be distinguished by calling IsPolygonClockwise.

func OffsetPolylineOptions

func OffsetPolylineOptions(polyline []Vector2.XY, delta Float.X, join_type PolyJoinType, end_type PolyEndType) [][]Vector2.XY

Inflates or deflates 'polyline' by 'delta' units (pixels), producing polygons. If 'delta' is positive, makes the polyline grow outward. Returns an array of polygons because inflating/deflating may result in multiple discrete polygons. If 'delta' is negative, returns an empty array.

Each polygon's vertices will be rounded as determined by 'join_type', see PolyJoinType.

Each polygon's endpoints will be rounded as determined by 'end_type', see PolyEndType.

The operation may result in an outer polygon (boundary) and inner polygon (hole) produced which could be distinguished by calling IsPolygonClockwise.

func PointIsInsideTriangle

func PointIsInsideTriangle(point Vector2.XY, a Vector2.XY, b Vector2.XY, c Vector2.XY) bool

Returns if 'point' is inside the triangle specified by 'a', 'b' and 'c'.

func SegmentIntersectsCircle

func SegmentIntersectsCircle(segment_from Vector2.XY, segment_to Vector2.XY, circle_position Vector2.XY, circle_radius Float.X) Float.X

Given the 2D segment ('segment_from', 'segment_to'), returns the position on the segment (as a number between 0 and 1) at which the segment hits the circle that is located at position 'circle_position' and has radius 'circle_radius'. If the segment does not intersect the circle, -1 is returned (this is also the case if the line extending the segment would intersect the circle, but the segment does not).

func SegmentIntersectsSegment

func SegmentIntersectsSegment(from_a Vector2.XY, to_a Vector2.XY, from_b Vector2.XY, to_b Vector2.XY) any

Checks if the two segments ('from_a', 'to_a') and ('from_b', 'to_b') intersect. If yes, return the point of intersection as [Vector2.XY]. If no intersection takes place, returns null.

func TriangulateDelaunay

func TriangulateDelaunay(points []Vector2.XY) []int32

Triangulates the area specified by discrete set of 'points' such that no point is inside the circumcircle of any resulting triangle. Returns a []int32 where each triangle consists of three consecutive point indices into 'points' (i.e. the returned array will have n * 3 elements, with n being the number of found triangles). If the triangulation did not succeed, an empty []int32 is returned.

func TriangulatePolygon

func TriangulatePolygon(polygon []Vector2.XY) []int32

Triangulates the polygon specified by the points in 'polygon'. Returns a []int32 where each triangle consists of three consecutive point indices into 'polygon' (i.e. the returned array will have n * 3 elements, with n being the number of found triangles). Output triangles will always be counter clockwise, and the contour will be flipped if it's clockwise. If the triangulation did not succeed, an empty []int32 is returned.

Types

type Atlas

type Atlas struct {
	Points []struct {
		X float32
		Y float32
	} `gd:"points"`
	Size struct {
		X int32
		Y int32
	} `gd:"size"`
}

func MakeAtlas

func MakeAtlas(sizes []Vector2.XY) Atlas

Given an array of [Vector2.XY]s representing tiles, builds an atlas. The returned dictionary has two keys: points is a [][Vector2.XY] that specifies the positions of each tile, size contains the overall size of the whole atlas as [Vector2i.XY].

type Extension

type Extension[T gdclass.Interface] struct{ gdclass.Extension[T, Instance] }

Extension can be embedded in a new struct to create an extension of this class. T should be the type that is embedding this Extension

func (*Extension[T]) AsObject

func (self *Extension[T]) AsObject() [1]gd.Object

type ID

type ID Object.ID

ID is a typed object ID (reference) to an instance of this class, use it to store references to objects with unknown lifetimes, as an ID will not panic on use if the underlying object has been destroyed.

func (ID) Instance

func (id ID) Instance() (Instance, bool)

type Instance

type Instance [1]gdclass.Geometry2D

Instance of the class with convieniently typed arguments and results.

func (Instance) AsObject

func (self Instance) AsObject() [1]gd.Object

func (Instance) ID

func (self Instance) ID() ID

func (*Instance) SetObject

func (self *Instance) SetObject(obj [1]gd.Object) bool

func (Instance) Virtual

func (self Instance) Virtual(name string) reflect.Value

type PolyBooleanOperation

type PolyBooleanOperation int //gd:Geometry2D.PolyBooleanOperation
const (
	// Create regions where either subject or clip polygons (or both) are filled.
	OperationUnion PolyBooleanOperation = 0
	// Create regions where subject polygons are filled except where clip polygons are filled.
	OperationDifference PolyBooleanOperation = 1
	// Create regions where both subject and clip polygons are filled.
	OperationIntersection PolyBooleanOperation = 2
	// Create regions where either subject or clip polygons are filled but not where both are filled.
	OperationXor PolyBooleanOperation = 3
)

type PolyEndType

type PolyEndType int //gd:Geometry2D.PolyEndType
const (
	// Endpoints are joined using the [PolyJoinType] value and the path filled as a polygon.
	EndPolygon PolyEndType = 0
	// Endpoints are joined using the [PolyJoinType] value and the path filled as a polyline.
	EndJoined PolyEndType = 1
	// Endpoints are squared off with no extension.
	EndButt PolyEndType = 2
	// Endpoints are squared off and extended by delta units.
	EndSquare PolyEndType = 3
	// Endpoints are rounded off and extended by delta units.
	EndRound PolyEndType = 4
)

type PolyJoinType

type PolyJoinType int //gd:Geometry2D.PolyJoinType
const (
	// Squaring is applied uniformally at all convex edge joins at 1 * delta.
	JoinSquare PolyJoinType = 0
	// While flattened paths can never perfectly trace an arc, they are approximated by a series of arc chords.
	JoinRound PolyJoinType = 1
	// There's a necessary limit to mitered joins since offsetting edges that join at very acute angles will produce excessively long and narrow "spikes". For any given edge join, when miter offsetting would exceed that maximum distance, "square" joining is applied.
	JoinMiter PolyJoinType = 2
)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL