Tag: 计算几何

Haskell中的Bentley-Ottmannalgorithm?

所以我一直在Haskell中编写一个计算几何库,因为我在Hackage上找不到一个,我认为这样做会很有趣。 然而,我在一个特定的algorithm上被困了近一个星期,我似乎无法进入一个很好的“类似于haskell”的表单。 该algorithm是用于在一组线段中find交点的Bentley-Ottmannalgorithm。 如果你熟悉algorithm,你可以跳到最后一段为我的求助:) 我select实现这个function的方式是把一个线段列表作为一个函数,并返回一个点列表,以及在那个点上相交的线段。 这让我们可以处理多个线段在相同点处相交的情况。 bentleyOttmann :: [Segment] -> [(Point, [Segment])] 该algorithm是一个扫描线algorithm。 我们想象一条线扫过飞机,在不同的地方做algorithm工作。 Bentley-Ottmannalgorithm中的事件点是: 线段的起始端点。 线段的结束端点。 一堆细分的交点。 请注意,事件点可以以多种方式与多个线段关联。 为了跟踪哪些段对应于哪个端点,我使用容器包中的映射。 这张地图的关键是点,这些值是分段的列表,标记是从那一点开始,在那一点结束还是在那一点相交。 扫描线决定点的顺序。 想象一下,一条垂直线扫过飞机,在事件点停下来做工。 事件点先按x值sorting,小点先处理。 一般来说,这是我们所需要的。 在退化情况下,事件点可能具有相同的x坐标。 我们还通过它们的y坐标来sorting,如果存在x坐标系,那么首先处理具有较小y坐标的事件点。 所以我使用的结构自然是一个优先队列。 我使用的是来自Hackage的堆包。 我们在每个活动点上所做的工作是什么? 那么,首先我们检查哪些段与事件点相关联。 如果有多个,那就是一个交点。 我们可以将它添加到我们迄今为止发现的十字路口列表中。 棘手的部分来了。 当我们扫过飞机时,我们会跟踪一组相对于扫掠线相交点的线段 。 当我们处理事件点时,我们首先删除在该事件点结束的所有段。 然后,在该点相交的所有分段按顺序颠倒 。 最后,我们将从该事件点开始的段添加到有序集。 请注意,由于这些分段都在事件点相交,所以必须相对于稍前扰动的扫掠线进行sorting。 在每个事件点,我们必须添加任何新事件点,新发生的交点。 因为我们跟踪与扫掠线相交的线段的相对顺序,我们做两件事之一: 如果我们交换了两个分段或添加了一个新的分段,我们find最下面的(相对于扫掠线)修改的分段,最上面的修改分段,并testing它们与它们的直接未修改的邻居的交集。 如果我们没有交换或添加新的细分市场,那么我们至less会删除一个细分市场,从而使其前邻居现在相邻。 我们testing这些新邻居的交集。 这是Bentley-Ottmannalgorithm的关键,当我们横扫飞机时,我们只用邻居来testing新的候选片段。 这意味着当交叉口相对较less时,我们击败了天真的O(n ^ 2)algorithm。 我的问题(最后,我很抱歉,这是如此冗长)是这样的:我不知道如何实现这个顺序逻辑。 我无法使用Data.Set,因为在我们扫描时sorting发生了变化。 我试图实现我自己的数据结构来跟踪信息,但它是蹩脚的,越野车,可能是低效的,也是丑陋的! 我讨厌丑陋的代码。 我知道Haskell是关于漂亮的代码。 […]

查找一个点是否在一个凸点内部,而不计算船体本身

testingP点是否在由一组点X构成的凸包内部的最简单方法是什么? 我想要一个在高维空间(也就是多达40个维度)工作的algorithm,它没有明确计算凸包本身。 有任何想法吗?

地理围栏 – 指向内部/外部多边形

我想确定一个多边形,并实现一个algorithm来检查一个点是否在多边形的内部或外部。 有谁知道是否有任何类似的algorithm可用的例子吗?

algorithm来检测圆与相同平面中的任何其他圆相交

我正在寻找一种algorithm来检测一个圆是否与同一平面上的任何其他圆相交,因为在一个平面上可以有多个圆。 我发现的标准方法是做分离轴testing(没有谷歌search)。 它说: Two objects don't intersect if you can find a line that separates the two objects. eg the objects / all points of an object are on different sides of the line. 但我不知道如何将其应用于圆圈。 有人可以帮我吗?

给定2D平面上的n个点,找出位于同一直线上的最大点数

以下是我正在尝试实施的解决scheme /** * Definition for a point. * class Point { * int x; * int y; * Point() { x = 0; y = 0; } * Point(int a, int b) { x = a; y = b; } * } */ public class Solution { public int maxPoints(Point[] points) { int max=0; if(points.length==1) […]

鲁棒的三维点云表面重buildalgorithm?

我正试图找出哪些algorithm可以从3D距离数据中进行曲面重build。 乍一看, Ball pivotingalgorithm ( BPA )和泊松曲面重build是比较成熟的方法吗? 在BPA和泊松曲面重buildalgorithm以外,现有的更稳健的algorithm是什么? 推荐研究出版物? 有没有可用的源代码?

计算三angular形网格中的法线

我绘制了一个有10000个顶点(100×100)的三angular形网格,这将是一个草地。 我使用gldrawelements()。 我看了整天,仍然不明白如何计算这个法线。 每个顶点都有自己的法线,还是每个三angular形都有自己的法线? 有人可以指导我如何编辑我的代码,以正确的方向? struct vertices { GLfloat x; GLfloat y; GLfloat z; }vertices[10000]; GLuint indices[60000]; /* 99..9999 98..9998 …….. 01..9901 00..9900 */ void CreateEnvironment() { int count=0; for (float x=0;x<10.0;x+=.1) { for (float z=0;z<10.0;z+=.1) { vertices[count].x=x; vertices[count].y=0; vertices[count].z=z; count++; } } count=0; for (GLuint a=0;a<99;a++){ for (GLuint b=0;b<99;b++){ GLuint v1=(a*100)+b;indices[count]=v1;count++; GLuint v2=(a*100)+b+1;indices[count]=v2;count++; GLuint […]

如何确定多边形是复杂的/凸的/非凸的?

从XFillPolygon的手册页 ·如果形状是复杂的,path可以自相交。 请注意,path中的重合点不被视为自交。 ·如果形状为凸,则对于多边形内的每对点,连接它们的线段不会与path相交。 如果客户知道,指定凸面可以提高性能。 如果将凸指定为非凸的path,则graphics结果是不确定的。 ·如果形状为非凸,path不自相交,但形状不是完全凸的。 如果客户端知道,指定Nonconvex而不是Complex可能会提高性能。 如果您为自相交path指定Nonconvex,则graphics结果未定义。 我遇到了填充XFillPolygon性能问题,因为手册页build议我要采取的第一步是指定Polygon的正确形状(我目前正在使用Complex来保证安全)。 是否有一个有效的algorithm来确定多边形(由一系列坐标定义)是凸的,非凸的还是复杂的?

按顺时针sorting点?

给定一个x,y点的数组,我该如何按顺时针顺序排列这个数组的点(围绕它们的整个平均中心点)? 我的目标是将点传递给线条创build函数,以最终看起来相当“坚固”的东西,尽可能凸出,没有线相交。 对于它的价值,我使用Lua,但任何伪代码将不胜感激。 非常感谢您的帮助! 更新:作为参考,这是基于Ciamej的优秀答案(忽略我的“应用程序”前缀)的Lua代码: function appSortPointsClockwise(points) local centerPoint = appGetCenterPointOfPoints(points) app.pointsCenterPoint = centerPoint table.sort(points, appGetIsLess) return points end function appGetIsLess(a, b) local center = app.pointsCenterPoint if ax >= 0 and bx < 0 then return true elseif ax == 0 and bx == 0 then return ay > by end local det = (ax […]

如何确定多边形点列表是否按顺时针顺序?

有一个点列表,我怎么find,如果他们顺时针顺序? 例如: point[0] = (5,0) point[1] = (6,4) point[2] = (4,5) point[3] = (1,5) point[4] = (1,0) 会说这是逆时针(某些人逆时针)。