Skip to main content

Professional 2D and 3D geometry toolkit with shapes, vectors, conics, transformations, coordinate geometry, and analytic 3D formulas.

Project description

GeomLib Advanced

GeomLib Advanced is a pure-Python geometry toolkit for 2D and 3D mathematical work. It covers school-level geometry, coordinate geometry, conic sections, vectors, mensuration, and analytic 3D geometry.

Install from PyPI:

pip install geomlib-advanced

Import from the geomlib package:

from geomlib import Point, Circle, Triangle, Point3D, Sphere

Quick Start

from geomlib import Point, Circle, Triangle, Vector2D, Point3D, Vector3D, Line3D, Plane

circle = Circle(Point(0, 0), 5)
print(circle.area())
print(circle.perimeter())

triangle = Triangle(Point(0, 0), Point(3, 0), Point(0, 4))
print(triangle.area())
print(triangle.incenter())

vector = Vector2D(3, 4)
print(vector.magnitude())
print(vector.normalize())

line = Line3D(Point3D(0, 0, 0), Vector3D(1, 1, 1))
plane = Plane.from_point_normal(Point3D(0, 0, 2), Vector3D(0, 0, 1))
print(plane.line_intersection(line))

Complete Import List

from geomlib import (
    Point, Line, Circle, Rectangle, Square, Rhombus, Parallelogram,
    Triangle, Ellipse, Polygon, regular_polygon,
    Point3D, Sphere, Cube, Cuboid, Cylinder, Cone,
    Vector2D, Vector3D, Line3D, Plane,
    Parabola, Hyperbola,
    distance_between_points, section_formula,
    translate_points, rotate_points, scale_points,
    reflect_point_x, reflect_point_y, reflect_point_origin, translate_points3d,
    degrees_to_radians, radians_to_degrees,
    pythagorean_hypotenuse, pythagorean_leg, heron_area,
    distance_2d, distance_3d, midpoint_2d,
)

2D Points

Create a point with Point(x, y).

from geomlib import Point

p1 = Point(0, 0)
p2 = Point(3, 4)

print(p1.distance_to(p2))          # 5.0
print(p2.distance_to_origin())     # 5.0
print(p2.magnitude())              # 5.0
print(p1.midpoint(p2))             # Point halfway between p1 and p2
print(p1.slope_to(p2))             # slope of the line through p1 and p2
print(p2.translate(2, -1))         # move point by dx, dy
print(p2.rotate(90))               # rotate around origin
print(p2.rotate(90, Point(1, 1)))  # rotate around another point
print(p1.to_tuple())               # (0.0, 0.0)

Point also supports vector-like operators:

print(Point(1, 2) + Point(3, 4))
print(Point(3, 4) - Point(1, 2))
print(Point(2, 3) * 4)
print(Point(8, 6) / 2)
print(Point(1, 2).dot(Point(3, 4)))
print(Point(1, 2).cross(Point(3, 4)))

2D Vectors

Use Vector2D(x, y) for vector algebra.

from geomlib import Point, Vector2D

v = Vector2D(3, 4)
w = Vector2D(1, 0)

print(v.magnitude())          # 5.0
print(v.dot(w))               # dot product
print(v.cross(w))             # scalar 2D cross product
print(v.normalize())          # unit vector
print(v.angle_with(w))        # degrees
print(v.projection_on(w))     # vector projection
print(v.perpendicular())      # rotated 90 degrees
print(v.to_point())
print(v.to_tuple())

direction = Vector2D.from_points(Point(0, 0), Point(3, 4))
print(direction)

Vector2D supports +, -, * scalar, and / scalar.

Lines

Create a line from two points.

from geomlib import Point, Line

line1 = Line(Point(0, 0), Point(4, 4))
line2 = Line(Point(0, 4), Point(4, 0))

print(line1.length())
print(line1.slope_angle())
print(line1.is_vertical())
print(line1.is_horizontal())
print(line1.is_parallel(line2))
print(line1.is_perpendicular(line2))
print(line1.intersection(line2))
print(line1.distance_to_point(Point(0, 2)))
print(line1.midpoint())
print(line1.contains_point(Point(2, 2)))
print(line1.contains_point(Point(5, 5), segment=True))
print(line1.equation_coefficients())  # (a, b, c) for ax + by + c = 0
print(line1.angle_with(line2))
print(line1.point_at_distance(2))

Circles

from geomlib import Point, Line, Circle

c1 = Circle(Point(0, 0), 5)
c2 = Circle(Point(6, 0), 3)

print(c1.area())
print(c1.perimeter())              # circumference
print(c1.diameter())
print(c1.contains(Point(3, 4)))
print(c1.intersects(c2))
print(c1.relation_to_circle(c2))   # separate, tangent, intersecting, contained, coincident
print(c1.intersection_area(c2))
print(c1.tangent_points(Point(10, 0)))
print(c1.line_intersections(Line(Point(-10, 0), Point(10, 0))))
print(c1.scale(2))
print(c1.translate(1, 2))

Rectangles and Squares

from geomlib import Point, Rectangle, Square

rect = Rectangle(Point(0, 0), width=10, height=5)
print(rect.bottom_left)
print(rect.top_left)
print(rect.bottom_right)
print(rect.top_right)
print(rect.center)
print(rect.area())
print(rect.perimeter())
print(rect.diagonal())
print(rect.contains(Point(2, 2)))
print(rect.intersects(Rectangle(Point(5, 2), 3, 3)))
print(rect.intersection(Rectangle(Point(5, 2), 3, 3)))
print(rect.scale(1.5))
print(rect.translate(2, 3))

square = Square(Point(0, 0), side=4)
print(square.area())                       # inherited from Rectangle
print(square.perimeter())                  # inherited from Rectangle
print(square.side_length)
print(square.diagonal())
print(square.inscribed_circle_radius())
print(square.circumscribed_circle_radius())

Triangles

from geomlib import Point, Triangle

t = Triangle(Point(0, 0), Point(6, 0), Point(0, 8))

print(t.side_lengths())
print(t.area())
print(t.perimeter())
print(t.angles())
print(t.is_equilateral())
print(t.is_isosceles())
print(t.is_right_angled())
print(t.centroid())
print(t.circumcenter())
print(t.incenter())
print(t.orthocenter())
print(t.circumradius())
print(t.inradius())
print(t.contains(Point(2, 2)))

Triangle points must form a non-degenerate triangle.

Quadrilaterals

from geomlib import Point, Rhombus, Parallelogram

rhombus = Rhombus(Point(0, 0), side=5, angle_deg=60)
print(rhombus.area())
print(rhombus.perimeter())
print(rhombus.height())
print(rhombus.vertices())
print(rhombus.contains(Point(1, 1)))
print(rhombus.inscribed_circle_radius())

para = Parallelogram(Point(0, 0), base_length=6, side_length=4, angle_deg=45)
print(para.area())
print(para.perimeter())
print(para.height())
print(para.vertices())
print(para.center())
print(para.contains(Point(2, 1)))

Ellipses, Parabolas, and Hyperbolas

from geomlib import Point, Ellipse, Parabola, Hyperbola

ellipse = Ellipse(Point(0, 0), a=5, b=3)
print(ellipse.area())
print(ellipse.perimeter())          # Ramanujan approximation
print(ellipse.eccentricity())
print(ellipse.foci())
print(ellipse.major_axis_length())
print(ellipse.minor_axis_length())
print(ellipse.directrices())
print(ellipse.contains(Point(1, 1)))
print(ellipse.scale(2))
print(ellipse.translate(3, 4))

parabola = Parabola(Point(0, 0), focal_length=2, orientation="up")
print(parabola.focus())
print(parabola.directrix())         # ("y", value) or ("x", value)
print(parabola.latus_rectum_length())
print(parabola.point_at(1))
print(parabola.contains(Point(4, 2)))

hyperbola = Hyperbola(Point(0, 0), a=3, b=4, transverse_axis="x")
print(hyperbola.eccentricity())
print(hyperbola.foci())
print(hyperbola.asymptotes())       # slope/intercept pairs
print(hyperbola.contains(Point(3, 0)))

Parabola orientation can be "right", "left", "up", or "down". Hyperbola transverse axis can be "x" or "y".

Polygons

from geomlib import Point, Polygon, regular_polygon

poly = Polygon([Point(0, 0), Point(4, 0), Point(4, 3), Point(0, 3)])

print(poly.signed_area())
print(poly.area())
print(poly.perimeter())
print(poly.edges())
print(poly.centroid())
print(poly.contains(Point(2, 2)))
print(poly.contains(Point(0, 1), include_boundary=False))
print(poly.is_convex())
print(poly.bounding_box())
print(poly.translate(1, 1))
print(poly.rotate(45))
print(poly.scale(2))

pentagon = regular_polygon(Point(0, 0), sides=5, radius=10)
print(pentagon.vertices)

Polygon vertices must be ordered around the boundary.

3D Points and Vectors

from geomlib import Point3D, Vector3D

p = Point3D(1, 2, 3)
q = Point3D(4, 6, 3)

print(p.distance_to(q))
print(p.distance_to_origin())
print(p.dot(q))
print(p.cross(q))
print(p.magnitude())
print(p.normalize())
print(p.translate(1, 1, 1))
print(p.rotate_x(90))
print(p.rotate_y(90))
print(p.rotate_z(90))
print(p.to_tuple())

v = Vector3D(1, 2, 3)
w = Vector3D(4, 5, 6)

print(Vector3D.from_points(p, q))
print(v.magnitude())
print(v.dot(w))
print(v.cross(w))
print(v.normalize())
print(v.angle_with(w))
print(v.projection_on(w))
print(v.scalar_triple(Vector3D(1, 0, 0), Vector3D(0, 1, 0)))
print(v.to_point3d())
print(v.to_tuple())

Point3D and Vector3D support +, -, * scalar, and / scalar.

3D Lines and Planes

from geomlib import Point3D, Vector3D, Line3D, Plane

line1 = Line3D(Point3D(0, 0, 0), Vector3D(1, 1, 1))
line2 = Line3D.from_points(Point3D(0, 1, 0), Point3D(1, 2, 1))

print(line1.point_at(2))
print(line1.distance_to_point(Point3D(1, 0, 0)))
print(line1.is_parallel(line2))
print(line1.angle_with(line2))
print(line1.shortest_distance_to_line(line2))

plane1 = Plane(0, 0, 1, -2)  # z - 2 = 0
plane2 = Plane.from_point_normal(Point3D(0, 0, 2), Vector3D(0, 0, 1))
plane3 = Plane.from_points(Point3D(0, 0, 0), Point3D(1, 0, 0), Point3D(0, 1, 0))

print(plane1.normal)
print(plane1.contains(Point3D(1, 1, 2)))
print(plane1.distance_to_point(Point3D(0, 0, 5)))
print(plane1.is_parallel(plane2))
print(plane1.angle_with(plane3))
print(plane1.line_intersection(line1))
print(plane1.coefficients())

3D Shapes

from geomlib import Point3D, Sphere, Cube, Cuboid, Cylinder, Cone

sphere = Sphere(Point3D(0, 0, 0), radius=3)
print(sphere.volume())
print(sphere.surface_area())
print(sphere.diameter())
print(sphere.contains(Point3D(1, 1, 1)))
print(sphere.intersects(Sphere(Point3D(4, 0, 0), 2)))
print(sphere.volume_intersection(Sphere(Point3D(4, 0, 0), 2)))
print(sphere.scale(2))
print(sphere.translate(1, 2, 3))

cube = Cube(Point3D(0, 0, 0), side=4)
print(cube.volume())
print(cube.surface_area())
print(cube.space_diagonal())
print(cube.vertices())
print(cube.contains(Point3D(1, 1, 1)))
print(cube.inscribed_sphere_radius())
print(cube.circumscribed_sphere_radius())
print(cube.scale(2))
print(cube.translate(1, 2, 3))

cuboid = Cuboid(Point3D(0, 0, 0), length=2, width=3, height=4)
print(cuboid.volume())
print(cuboid.surface_area())
print(cuboid.space_diagonal())
print(cuboid.vertices())
print(cuboid.contains(Point3D(0, 0, 1)))
print(cuboid.scale(2))
print(cuboid.translate(1, 2, 3))

cylinder = Cylinder(Point3D(0, 0, 0), radius=2, height=10)
print(cylinder.volume())
print(cylinder.surface_area())
print(cylinder.lateral_surface_area())
print(cylinder.contains(Point3D(1, 1, 0)))
print(cylinder.scale(2))
print(cylinder.translate(1, 2, 3))

cone = Cone(Point3D(0, 0, 0), radius=2, height=6)
print(cone.volume())
print(cone.surface_area())
print(cone.lateral_surface_area())
print(cone.slant_height())
print(cone.contains(Point3D(0, 0, -2)))
print(cone.scale(2))
print(cone.translate(1, 2, 3))

Coordinate Geometry Helpers

from geomlib import Point, distance_between_points, section_formula

p1 = Point(0, 0)
p2 = Point(6, 6)

print(distance_between_points(p1, p2))
print(section_formula(p1, p2, 1, 2))                  # internal division
print(section_formula(p1, p2, 3, 1, internal=False))  # external division

Formula Helpers

from geomlib import (
    degrees_to_radians,
    radians_to_degrees,
    pythagorean_hypotenuse,
    pythagorean_leg,
    heron_area,
    distance_2d,
    distance_3d,
    midpoint_2d,
)

print(degrees_to_radians(180))
print(radians_to_degrees(3.141592653589793))
print(pythagorean_hypotenuse(3, 4))
print(pythagorean_leg(5, 3))
print(heron_area(3, 4, 5))
print(distance_2d(0, 0, 3, 4))
print(distance_3d(0, 0, 0, 1, 2, 2))
print(midpoint_2d(0, 0, 4, 6))

Transformation Helpers

from geomlib import (
    Point,
    Point3D,
    translate_points,
    rotate_points,
    scale_points,
    reflect_point_x,
    reflect_point_y,
    reflect_point_origin,
    translate_points3d,
)

points = [Point(1, 0), Point(0, 1)]

print(translate_points(points, 2, 3))
print(rotate_points(points, 90))
print(scale_points(points, 2))
print(reflect_point_x(Point(2, 3)))
print(reflect_point_y(Point(2, 3)))
print(reflect_point_origin(Point(2, 3)))
print(translate_points3d([Point3D(1, 2, 3)], 1, 1, 1))

Validation Rules

  • Lengths, radii, dimensions, and axes must be positive.
  • Zero vectors cannot be normalized.
  • Lines need distinct points for meaningful geometry.
  • Triangles must be non-degenerate.
  • Polygon vertices must be ordered and must enclose non-zero area.
  • Division by zero raises the normal Python exception or a ValueError, depending on context.

Curriculum Coverage

GeomLib Advanced supports common CBSE, ICSE, and NCERT geometry topics:

  • Class 10 coordinate geometry: distance, midpoint, section formula, slope, line equations
  • Class 10 mensuration: triangle, quadrilateral, circle, cube, cuboid, cylinder, cone, sphere
  • Class 11 straight lines: slopes, angles, parallel/perpendicular checks, line equations
  • Class 11 conic sections: circle, ellipse, parabola, hyperbola
  • Class 11 introduction to 3D geometry: points and distance in 3D
  • Class 12 vectors and 3D geometry: vectors, dot/cross product, lines, planes, angles, distances

Development

Run tests:

python -m unittest discover -s tests

Build locally:

python -m build

Upload to PyPI after building and checking:

python -m twine check dist/*
python -m twine upload dist/*

License

This project is licensed under the MIT License.

Author

Arjun Singh Gangwar

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

geomlib_advanced-0.1.1.tar.gz (26.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

geomlib_advanced-0.1.1-py3-none-any.whl (29.5 kB view details)

Uploaded Python 3

File details

Details for the file geomlib_advanced-0.1.1.tar.gz.

File metadata

  • Download URL: geomlib_advanced-0.1.1.tar.gz
  • Upload date:
  • Size: 26.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.12

File hashes

Hashes for geomlib_advanced-0.1.1.tar.gz
Algorithm Hash digest
SHA256 8aa189675965a50550345189fbe153f772ec6546d939118457466aaca26a7658
MD5 f1c36118deedde5d6a137b3f7824bccd
BLAKE2b-256 dbda64c77a4f4da51a772f69f97c4f78d528a72cdef4355b4d0279d2042b669e

See more details on using hashes here.

File details

Details for the file geomlib_advanced-0.1.1-py3-none-any.whl.

File metadata

File hashes

Hashes for geomlib_advanced-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 d0ddefa1617de34d00e3445e2655051e243e3fc83a94683383f153bf26c03fb1
MD5 5b9cb4d404d82a11eda97825c12f13bb
BLAKE2b-256 7d78f71915c6b74820fa2ad46c7962833e3ec59a000f6e333a9850ab43a3f682

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page