相关疑难解决方法(0)

没有孔的多边形联合

我正在寻找一些相当容易的(我知道多边形联合不是一个简单的操作,但也许有人可以用一个相对简单的方法指向我的方法)合并两个相交的多边形.多边形可以是没有孔的凹面,输出多边形也不应该有孔.多边形以逆时针方式表示.我的意思是在图片上显示.正如你所看到的那样,即使在多边形的组合中有一个洞,我也不需要它在输出中.输入多边形肯定没有洞.我认为没有漏洞应该更容易,但我仍然没有想法. 多边形 - 输入蓝色和红色,输出绿色

algorithm math geometry polygon computational-geometry

21
推荐指数
1
解决办法
1万
查看次数

两个旋转矩形的交点面积

我有两个2D矩形,定义为原点(x,y)的大小(高度,宽度)和旋转角度(0-360°).我可以保证两个矩形的大小相同.

我需要计算这两个矩形的近似交叉区域. 矩形交叉点

计算不需要精确,尽管可以.我将把结果与其他交叉区域进行比较,以确定一组矩形中最大的交叉区域,因此它只需要相对于同一算法的其他计算准确.

我想过使用相交区域的边界框区域,但由于所有不同的可能情况,我无法获取相交区域的顶点: 这么多可能的交叉形状

我正在Cocoa框架中的Objective-C中编写这个程序,这是值得的,所以如果有人知道任何快捷方式使用NSBezierPath或者你也欢迎提出建议.

algorithm graphics geometry intersection

21
推荐指数
2
解决办法
1万
查看次数

分组地理形状

我正在使用Dundas Maps并尝试绘制世界地图,其中国家/地区被分组到特定于业务实现的区域.

我有世界上每个国家的形状数据(点和段).通过将区域内的所有国家/地区的所有点和细分添加到新的区域形状,我可以将国家/地区组合到一起.

foreach(var region in GetAllRegions()){
    var regionShape = new Shape { Name = region.Name };
    foreach(var country in GetCountriesInRegion(region.Id)){
        var countryShape = GetCountryShape(country.Id);
        regionShape.AddSegments(countryShape.ShapeData.Points, countryShape.ShapeData.Segments);
    }
    map.Shapes.Add(regionShape);
}
Run Code Online (Sandbox Code Playgroud)

问题是国家边界线仍然出现在一个区域内,我想删除它们,以便只显示区域边界.

Dundas多边形必须在同一点开始和结束.所有国家形状都是如此.现在我需要一个能够:

  • 确定国家边界在区域边界的交叉点,以便我可以加入区域边界段.
  • 确定哪些国家/地区边界不是区域边界,以便我可以丢弃它们.
  • 对生成的区域点进行排序,以便它们按顺序描述形状边界.

以下是我到目前为止使用地图的地方.您可以看到仍需要删除国家/地区边界.例如,蒙古和中国之间的边界应该被丢弃,而蒙古和俄罗斯之间的边界应该保留.

我需要保留区域边界的原因是区域颜色在传达信息方面很重要,但相邻区域可能是相同的颜色.这些地区可以改变以包括或排除国家,这就是区域塑造必须是动态的原因.

编辑: 我现在知道我正在寻找的是一个多边形联盟.David Lean 解释了如何使用SQL Server 2008中的空间函数来执行此操作,这可能是一个选项,但我的努力已经停止,因为生成的多边形联合非常复杂,以至于SQL将其截断为43,480个字符.我现在正在尝试为此找到解决方法或找到在代码中进行联合的方法.

区域地图

c# algorithm geometry geography dundas

10
推荐指数
1
解决办法
2710
查看次数

构造多边形联合多边形

假设我有很多多边形,构造多边形的最佳算法是什么 - 可能是所有这些多边形的并集孔?

为了我的目的,你可以想象每个多边形作为一个拼图块,当你完成它们你会得到一个很好的图片.但问题是,缺少一小部分(比如<5%)的拼图,你仍然要求尽可能完整地形成一幅画面; 这是多边形(或多边形) - 可能有孔 - 我想形成.

我天真的方法是取两个多边形,合并它们,然后取另一个多边形,将它与两个多边形的并集联合起来,然后重复这个过程,直到每个单元都结合在一起.然后我将遍历联合多边形列表并检查是否仍然可以组合一些多边形,并且我将重复此过程,直到获得满意的结果.

但这似乎是一种非常天真的方法.我只是想知道还有其他更好的算法吗?

c# algorithm geometry computational-geometry

10
推荐指数
2
解决办法
5294
查看次数

将重叠三角形合并为多​​边形

我从投影到2D平面的3D模型中得到了一堆重叠的三角形.我需要将触摸三角形的每个岛合并成一个封闭的非凸多边形.

生成的多边形不应该有任何孔(因为源数据不会).

许多源三角形与源数据中的其他三角形共享(浮点相同)边.

最简单的方法是什么?性能不是特别重要,因为这将在设计时完成.

algorithm math graphics geometry

7
推荐指数
1
解决办法
3370
查看次数

如何合并网格上的相邻共面面

我正在寻找一种方法/算法,它允许我将3d网格上的几个相邻共面面合并为一个面.我希望这将优化我的网格生成程序,因为它现在生成许多'小'三角形.当我在屏幕上看到最后的三维物体时,我可以看到它们都朝向同一个方向,并且它们可以被一个包含整个物体的更大的三角形取代!我希望我很清楚我想要做什么.谢谢你的帮助.

algorithm 3d mesh

5
推荐指数
1
解决办法
5029
查看次数

如何在 THREEJS 网格中对共面三角形进行分组?

我正在开发一种建模工具,可以让您直接操作网格。例如,您可以抓住一张脸并将其拖动。用户对“脸”的感知可能是多个共面三角形。例如,立方体的顶“面”实际上是两个三角形,它们被拖到一起形成一个正方形。

为了实现这一点,我想收集任何特定三角形的所有共面、相邻面,以便在拖动时使用。我已经查看了Simplifier以及这篇文章作为示例,但我想保留底层三角形,而不是减少/删除它们。

在过去的美好时光,您可以构建一个边缘模型 ala Mantlya,您可以在每个边缘上行走以查看相邻的面并检查法线。

我希望可能已经为 THREEJS 编写了一些代码,将共面三角形组合在一起。如果我从头开始写这个,我能想到的最好的算法是 O(n^2),类似于:

  1. 通过遍历所有面的所有顶点来构建边缘哈希(两个方向)。每个条目都是一个包含 2 个面指针的数组。您只需在创建或修改网格时执行此步骤一次。
  2. 当用户选择要操作的面孔时,创建空的评估堆栈并将选取的面孔放入该堆栈中。另外,创建空的共面面阵列。
  3. 将面从评估堆栈中弹出,并遍历该面的边缘。在边缘散列中查找与该边缘相邻的所有面。如果面共面,则将该面推入计算堆栈并存储在共面面数组中。
  4. 重复步骤 3-4,直到计算堆栈为空。

当该算法完成时,您应该拥有一个所有面共面且与开始的面相邻的数组。但对我来说,这似乎效率相对较低。

欢迎任何和所有建议/指示!

algorithm computational-geometry three.js geometry-surface

5
推荐指数
1
解决办法
2542
查看次数

如何合并多边形(纬度和经度)?

我在地图上定义了多边形,纬度和经度作为坐标系.我想合并所有重叠的多边形. 在此输入图像描述

来自这个问题

我找到了这个软件:软件

我下载了代码,它适用于笛卡尔坐标.但是,我不知道如何利用它来获得纬度和经度.

什么是解决这个问题的最佳方法?

例如,这里是我要合并的多边形:

        var polyA = new List<GpsLocation>();
        var pA1 = new GpsLocation(0, 0);
        polyA.Add(pA1);
        var pA2 = GpsHelper.CreateLocationBasedOnBearingDistance(pA1, 5, 100);
        polyA.Add(pA2);
        var pA3 = GpsHelper.CreateLocationBasedOnBearingDistance(pA2, 95, 100);
        polyA.Add(pA3);
        var pA4 = GpsHelper.CreateLocationBasedOnBearingDistance(pA3, 185, 100);
        polyA.Add(pA4);

        var polyB = new List<GpsLocation>();

        var pB1 = GpsHelper.CreateLocationBasedOnBearingDistance(pA1, 95, 50);
        polyB.Add(pB1);
        var pB2 = GpsHelper.CreateLocationBasedOnBearingDistance(pB1, 5, 100);
        polyB.Add(pB2);
        var pB3 = GpsHelper.CreateLocationBasedOnBearingDistance(pB2, 95, 100);
        polyB.Add(pB3);
        var pB4 = GpsHelper.CreateLocationBasedOnBearingDistance(pB3, 185, 100);
        polyB.Add(pB4);
Run Code Online (Sandbox Code Playgroud)

gis merge google-maps polygon latitude-longitude

3
推荐指数
1
解决办法
2652
查看次数