【CGALDotNet】二维矢量多边形可视域计算(C#调用CGAL)

本文介绍了如何使用CGALDotNet库在二维空间中计算给定点K对多边形的可视域,通过PolygonVisibility类的ComputeVisibility方法获取可视区域,并给出了一个代码示例。示例中计算了点K能看到的多边形部分,结果以坐标形式输出。
摘要由CSDN通过智能技术生成

参考

CGALDotNet快速开始:https://blog.csdn.net/liqian_ken/article/details/138274933

CGAL二维可视域计算介绍:https://doc.cgal.org/latest/Visibility_2/index.html#visibility_2_introduction
CGAL相关接口:https://doc.cgal.org/latest/Visibility_2/classCGAL_1_1Triangular__expansion__visibility__2.html

示例

已知多边形ABCDEFGHIJ,多边形内有一点视点K,下面要计算K点能看到的区域。
在这里插入图片描述
代码:

using CGALDotNet;
using CGALDotNet.Polygons;
using CGALDotNetGeometry.Numerics;
using System;
using System.Collections.Generic;
using System.Linq;

namespace CTestCore31
{
    public class Program
    {
        static void Main(string[] args)
        {
            var points = new Point2d[]
             {
                new Point2d(0, 0),
                new Point2d(0, 1),
                new Point2d(3, 1),
                new Point2d(3, 2),
                new Point2d(4, 2),
                new Point2d(4, 1),
                new Point2d(8, 1),
                new Point2d(8, -1),
                new Point2d(5, -1),
                new Point2d(4, 0),
             };
            points = points.Reverse().ToArray();

            var poly = new Polygon2<EEK>(points);
            var pv = new PolygonVisibility<EEK>();

            var pt = new Point2d(0.5, 0.5);
            pv.ComputeVisibility(pt, poly, out Polygon2<EEK> result);

            List<Point2d> resultPoints = new List<Point2d>();
            result.GetPoints(resultPoints);
            foreach (Point2d point in resultPoints)
            {
                Console.WriteLine($"{point.x} {point.y}");
            }
            Console.ReadLine();
        }
    }
}

由此获得可视域多边形,其坐标:

3 1
0 1
0 0
4 0
8 -0.5714285714285714
8 1
4 1
4 1.2000000000000002

根据需要将其绘制出来,如下图所示:
在这里插入图片描述

将上面两张图叠加(绿色区域为视点K的可视域):
在这里插入图片描述

注意

视点必须位于多边形内部,不能位于外部(计算结果为null)或多边形边界上(报错)。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值