csharp-habrador-computational-geometry

Librería Habrador Computational-Geometry en C#

La computación geométrica es una rama de la informática que se enfoca en el estudio de algoritmos y estructuras de datos para resolver problemas geométricos.

La biblioteca Habrador/Computational-Geometry es una recopilación Open Source que proporciona implementaciones eficientes de varios algoritmos geométricos.

Entre los algoritmos disponibles están,

  • Triangulación: División de un polígono en triángulos.
  • Convex Hull: Cálculo del menor polígono convexo que contiene un conjunto de puntos.
  • Intersección de segmentos: Detección de intersección entre líneas y segmentos.
  • Algoritmos de visibilidad: Cálculo de áreas visibles desde un punto.
  • Diagramas de Voronoi: División del plano basado en distancias a un conjunto de puntos.
  • Redes de Delaunay: Triangulación optimizada de un conjunto de puntos.
  • Polígonos y operaciones: Manipulación y análisis de polígonos.

Algunos ejemplos

Aquí algunos ejemplos de los algoritmos incluidos en Habrador/Computational-Geometry. Para más información, consultar la documentación de la librería.

Cálculo de Convex Hull

Este ejemplo muestra cómo calcular el convex hull de un conjunto de puntos utilizando el algoritmo de Graham Scan.

using System;
using System.Collections.Generic;
using Habrador.ComputationalGeometry;

class Program
{
    static void Main(string[] args)
    {
        List<MyVector2> points = new List<MyVector2>
        {
            new MyVector2(0, 0),
            new MyVector2(1, 1),
            new MyVector2(2, 2),
            new MyVector2(1, 2),
            new MyVector2(2, 1),
            new MyVector2(3, 3)
        };

        List<MyVector2> convexHull = ConvexHullAlgorithms.GrahamScan(points);

        Console.WriteLine("Convex Hull:");
        foreach (var point in convexHull)
        {
            Console.WriteLine($"({point.x}, {point.y})");
        }
    }
}

Triangulación de un polígono

En este ejemplo, se muestra cómo dividir un polígono en triángulos utilizando la biblioteca.

using System;
using System.Collections.Generic;
using Habrador.ComputationalGeometry;

class Program
{
    static void Main(string[] args)
    {
        List<MyVector2> polygon = new List<MyVector2>
        {
            new MyVector2(0, 0),
            new MyVector2(2, 0),
            new MyVector2(2, 2),
            new MyVector2(0, 2)
        };

        List<Triangle2> triangles = Triangulator.TriangulatePolygon(polygon);

        Console.WriteLine("Triangles:");
        foreach (var triangle in triangles)
        {
            Console.WriteLine($"({triangle.p1.x}, {triangle.p1.y}), ({triangle.p2.x}, {triangle.p2.y}), ({triangle.p3.x}, {triangle.p3.y})");
        }
    }
}

Detección de intersección de segmentos

Este ejemplo muestra cómo detectar la intersección entre segmentos de línea.

using System;
using Habrador.ComputationalGeometry;

class Program
{
    static void Main(string[] args)
    {
        MyVector2 p1 = new MyVector2(0, 0);
        MyVector2 p2 = new MyVector2(2, 2);
        MyVector2 p3 = new MyVector2(0, 2);
        MyVector2 p4 = new MyVector2(2, 0);

        bool intersects = Intersections.Intersect(p1, p2, p3, p4, out MyVector2 intersectionPoint);

        if (intersects)
        {
            Console.WriteLine($"Intersection at: ({intersectionPoint.x}, {intersectionPoint.y})");
        }
        else
        {
            Console.WriteLine("No intersection");
        }
    }
}

Diagrama de Voronoi

Este ejemplo muestra cómo generar un diagrama de Voronoi a partir de un conjunto de puntos.

using System;
using System.Collections.Generic;
using Habrador.ComputationalGeometry;

class Program
{
    static void Main(string[] args)
    {
        List<MyVector2> points = new List<MyVector2>
        {
            new MyVector2(1, 1),
            new MyVector2(3, 1),
            new MyVector2(2, 3)
        };

        VoronoiDiagram voronoi = VoronoiDiagram.Generate(points);

        Console.WriteLine("Voronoi Edges:");
        foreach (var edge in voronoi.edges)
        {
            Console.WriteLine($"({edge.v0.x}, {edge.v0.y}) -> ({edge.v1.x}, {edge.v1.y})");
        }
    }
}