标签: computational-geometry

从切割多边形生成新多边形(2D)

我遇到了这个小问题,而我解决这个问题的算法并不适用于所有情况.有人知道如何解决这个问题吗?

这是一个示例多边形:

例如http://img148.imageshack.us/img148/8804/poly.png

正式说明

我们有一个CW顺序列表,用于定义多边形.我们还可以查询一个点是否是一个切割点is_cut(p),在哪里p是一个给定的点.现在我们要计算由此"切割"引起的新多边形.

算法应该这样做:

输入: {a, c1, b, c4, c, c5, d, c6, e, c3, f, c2}

输出:{a, c1, c2},{b, c4, c3, f, c2, c1},{d, c6, c5},{e, c3, c4, c, c5, c6}

这是我目前的算法:

follow your points, CW
if the point is a cut point
-> go back trough the list looking for cut points
--- if next cut point is connected to the current cut point 
    and …
Run Code Online (Sandbox Code Playgroud)

algorithm intersection polygon computational-geometry

11
推荐指数
1
解决办法
4886
查看次数

如何测试点是否位于由点云定义的表面的3d形状内?

我有一个点的集合描述了应该是大致球形的形状的表面,我需要一种方法来确定是否有任何其他给定点位于这个形状内.我以前将形状近似为一个精确的球体,但事实证明这太不准确了,我需要一种更精确的方法.简单和速度有利于完全准确,良好的近似就足够了.

我遇到了将点云转换为3d网格的技术,但我发现的大多数事情都非常复杂,我正在寻找尽可能简单的东西.

有任何想法吗?

c algorithm computational-geometry

11
推荐指数
2
解决办法
3034
查看次数

SVG /矢量图形对象布尔运算(并集,交集,减法)

我有2D闭合矢量路径,在SVG路径类语法中指定- 即这些路径包括直线和各种贝塞尔曲线.有没有什么像一个小的,漂亮的和离散的库(最好用C,Java或Ruby,但如果这个库干净且易于使用,任何语言都可以),它允许做这些路径的联合,交叉和减法等布尔运算?

到目前为止我发现的内容包括:

  • 巨大而昂贵的商业矢量图形产品(例如Autodesk AutoCAD或Adobe Illustrator),可以使用某种API调用或编写脚本来执行布尔2D路径操作 - 这对我来说显然是一种过度杀伤力.
  • Inkscape开发的内部lib2geom库缺少文档,绑定,有一些编译问题,似乎除了Inkscape本身之外没有任何项目使用,看起来相当复杂.
  • CGAL是一个庞大且相当复杂的计算几何库,可以在非常奇怪的对象空间中工作(即你有疯狂的模板组合,命令式样式函数来对这些模板化数据结构进行操作等),而且似乎没有除了C++之外,还有其他语言的健全绑定.Python CG绑定似乎被抛弃了,对我来说看起来并不友好.
  • JTS似乎以GIS为中心,只处理直线,而我需要处理类似SVG的Bezier曲线.

所以,问题是,是否有任何其他小巧,易用的库可以在类似SVG的路径上处理布尔运算?

c ruby java svg computational-geometry

11
推荐指数
1
解决办法
3069
查看次数

是否有一种有效的算法来生成平面中一般位置的随机点?

我需要在平面中的一般位置生成n个随机点,即没有三个点可以位于同一条线上.点的坐标应为整数,并且位于固定的平方m x m内.什么是解决这个问题的最佳算法?

更新:方形与轴对齐.

random algorithm geometry computational-geometry

11
推荐指数
1
解决办法
1938
查看次数

计算多边形周围的Voronoi

我需要在凹面(非凸面)内部多边形周围生成Voronoi图.我在网上寻找方法,但我无法弄清楚如何做到这一点.基本上,我生成点的凸包,计算双点并在这些点之间建立边缘网络.但是,当遇到内部多边形的边缘时,它必须看起来像形状的边缘,就像凸包一样.因此,通过这样做并剪切边界处的所有边缘,我应该得到一个Voronoi图,它具有内部多边形边界的良好边缘,并且没有位于内部多边形两侧的单元格.

让我给你举个例子:

在此输入图像描述

这个问题是单元格穿过内部多边形边缘,并且单元格结构和多边形形状之间没有视觉关系.

有人知道如何解决这个问题吗?是否有一些算法已经做到这一点或接近我正在努力实现的目标?

非常感谢你的任何输入!

java processing voronoi polygon computational-geometry

11
推荐指数
1
解决办法
2856
查看次数

找到重叠的矩形算法

假设我有一组巨大的非重叠矩形和整数坐标,它们一劳永逸地固定

我有另一个矩形A,其整数坐标的坐标正在移动(但你可以假设它的大小是常数)

查找哪些矩形与A交叉(或内部)的最有效方法是什么?我不能简单地遍历我的设置,因为它太大了.谢谢

编辑:矩形都与轴平行

c++ algorithm computational-geometry

11
推荐指数
2
解决办法
7547
查看次数

计算几何Javascript

我正在考虑为我的Computational Geometry类(2D)编写几个例子,我想使用html5和javascript.

任何人都可以推荐一个JavaScript库或html5有我需要启动的一切吗?

我将主要使用点和线,但是有一些东西可以绘制笛卡尔平面作为参考,也许可以使用一些数据结构.

javascript html5 geometry computational-geometry html5-canvas

11
推荐指数
2
解决办法
4455
查看次数

确定是否可以使用单个三角形扇形绘制2d多边形

起初,我认为这个问题等同于确定多边形是否是凸面,但似乎仍然可以通过一个三角形扇形绘制非凸多边形. 考虑这个形状,一个非凸多边形.可以很容易地想象一些中心点区域允许用三角形扇形绘制这个多边形(尽管会有其他中心点不会).给定一个固定的中心点,我希望能够确定定义多边形的2d点的集合是否允许使用单个三角形扇形绘制它.

看起来关键是要确保从中心点到任何顶点绘制的线条没有"妨碍",这意味着顶点的其他边缘线.但是,重要的是尽可能使计算成本低廉,并且我不确定这样做是否有一个很好的数学捷径.

最终,我将要让多边形的顶点移动,并且我需要确定允许顶点移动的"边界",因为其余的是固定的(并且可能稍后甚至允许直接同时反应移动)还有2个邻居),以保持多边形能够在单个三角形扇形中绘制.但这就是未来,希望对整个多边形的测试可以分解为一个计算子集,以假设已经凸出的多边形来测试单个顶点运动的边界.

c++ math geometry computational-geometry

11
推荐指数
2
解决办法
653
查看次数

找到共线之间的重叠

给定两条共线线段AB和CD,如何找到它们是否重叠?如何找到重叠的起点和终点?

以下是我正在使用的方法.我首先确保A <B和C <D.

if(pa < pc){
  if(pc < pb){
    if(pd < pb){
      //  overlap exists; CD falls entirely within AB
    }
    else {
      //  overlap exists; CB is the overlapping segment
    }
  }
  else {
    //  no overlap exists; AB lies before CD
  }
}
else {
  if(pa < pd){
    if(pb < pd){
      //  overlap exists; AB lies entirely within CD
    }
    else {
      //  overlap exists; AD is the overlapping segment
    }
  }
  else {
    //  no overlap …
Run Code Online (Sandbox Code Playgroud)

algorithm geometry coordinates line-segment computational-geometry

11
推荐指数
1
解决办法
6199
查看次数

大纲绘图算法

我的妻子给了我这个任务,所以这是头等大事:-)

我有一系列积分(实际上是Northings和Eastings,但这并不重要).我想取这些点并创建一组代表轮廓的矢量,这样我就可以在Google地球上绘图.

所以,像:

  #                       #
           #             #       #
#             #    #
      #   #

            #
Run Code Online (Sandbox Code Playgroud)

会给:

  #-----------------------#--
 /                            \ --#
#                  #------------/
 \-----#         /
         \     /
            #
Run Code Online (Sandbox Code Playgroud)

我想出的一个可能的解决方案是计算每个点之间的向量,并丢弃与另一个向量重叠的每个向量.我还没有实现这个(不太确定如何),但我想知道是否还有其他方法.

该算法只需要运行几次,所以如果每次运行需要一个小时,那么RAM就不是问题.

algorithm computational-geometry

11
推荐指数
1
解决办法
677
查看次数