Tag: 计算几何

如何使用C#/ SQL Server 2008空间“平均”两个或更多地理线串

假设我从一项关于特定候鸟行为的研究中得到了一组结果。 这只鸟已被标记,GPS接收器记录了它在五年内每年所遵循的迁移路径。 结果存储在SQL Server表中,该表包含每年路径的一个地理线串。 你将如何定义代表五年期间“平均”路径的线串? 请注意,每个样本线串可能包含不同数量的点。 它们也不会以完全相同的点开始和结束。 到目前为止,我所获得的最佳方法是使用插值来确定沿每个线串的特定设定比例的点。 因此,例如,起点,四分之一路,沿着每条路线的中途等。然后计算所有路线上这些位置的平均纬度/经度,并从这些平均点构建新的地理线串。 我查看了一些计算几何书籍,看看是否有更好的已知算法或技术来做到这一点,但似乎没有任何相关性。 我不敢相信这不是别人以前没有做过的事情…… 我不需要确切的代码 – 只是建议任何更好的一般方法。 我也不需要“超精准”。 作为旁注,我理想地喜欢这种方法也适用于两个或多个多边形。 谢谢你的任何建议!

将一个矩形的坐标转换为另一个矩形

在上图中我展示了两个矩形 矩形1的x可以在-900到13700之间变化,Y可以在-600到6458之间变化 矩形2的坐标X可以在0到3000之间变化,y可以在0到2000之间变化 另外: 矩形2的起始点位于左上角位置(0,0),而矩形1的起始点(宽度/ 2,高度/ 2)。 我需要做的是 :使用缩放或平移将矩形1的点转换为矩形2的点。 那么,为了将矩形1的坐标变换为矩形2 , x和y坐标应该是什么缩放因子?

迭代最近点实现

我目前正在使用以下伪代码在C#中实现ICP算法。 从ICP Powerpoint获得 function ICP(Scene,Model) begin E` = + ∞; (Rot,Trans) = In Initialize-Alignment(Scene,Model); repeat E = E`; Aligned-Scene = Apply-Alignment(Scene,Rot,Trans); Pairs = Return-Closest-Pairs(Aligned-Scene,Model); (Rot,Trans,E`) = Update-Alignment(Scene,Model,Pairs,Rot,Trans); Until |E`- E| < Threshold return (Rot,Trans); end 但是我不完全确定应该如何实现更新对齐? 如果有人能解释这一点比powerpoint更清楚:)我已经编写了计算对应错误和对齐错误的方法,但是我不知道如何应用这些来获得新的更新对齐。

计算3D网格的体积

我厌倦了计算3D物体的体积(Cube,Cylinder ……)可以任何一个帮助 有这个问题? 问题是,如何从他的身上计算物体的体积 基于三角形的坐标。 我的class级做得不好,任何人帮助我 强化class级? 谢谢 public class Algorithm { private Mesh _mesh { get; set; } public Algorithm(Mesh mesh) { _mesh = mesh; } private double SignedVolumeOfTriangle(Vector3 p1, Vector3 p2, Vector3 p3) { var v321 = p3.X * p2.Y * p1.Z; var v231 = p2.X * p3.Y * p1.Z; var v312 = […]

找到重叠两个共线段的段的算法

更新 我在C#中的原始实现 我在C#中的最终实现,基于我得到的答案。 鉴于以下条件,我如何以编程方式找到两条线之间的重叠段? 另外,对于不同的斜率: 对于垂直线: 对于水平线: 注意:对于所有象限! 我开始编写所有可能的条件,但它变得丑陋。 public Line GetOverlap (Line line1, Line line2) { double line1X1 = line1.X1; double line1Y1 = line1.Y1; double line1X2 = line1.X2; double line1Y2 = line1.Y2; double line2X1 = line2.X1; double line2Y1 = line2.Y1; double line2X2 = line2.X2; double line2Y2 = line2.Y2; if (line1X1 > line1X2) { double […]

实现Bentley-Ottmann算法

我在C#中正确实现Bentley-Ottmann算法时遇到了一些麻烦。 我试图根据伪代码在这里实现它。 我在下面发布了我的主要代码。 假设我的BST和PriorityQueue类正确实现,您是否看到代码有任何问题? 没有错误,但并非找到所有交叉点,只有一些。 我的猜测是代码的else部分存在错误(当前事件是交叉点时)。 我不确定伪代码是什么意思通过交换BST中两个段的位置。 我这样做的方式很好吗? 因为最终,两者在BST中并没有真正交换。 我也不能改变他们的立场,因为这可能打破BST属性。 另外,我是否正确地假设它们的左端点的Y坐标在BST中排序? 我注意到我无法追踪的另一个错误是有时点(0, 0)进入eventList 。 (0, 0)由Geometry.Intersects输出,以防没有交集,但在这种情况下, if条件应该阻止它被添加。 我不知道它是如何进入的。如果我在添加一个点后打印eventList的内容, (0, 0)永远不会显示。 如果我在提取并弹出元素后打印内容(0, 0)有时会显示(0, 0) 。 这可能与Pop()方法搞乱引用有关,还是我的PriorityQueue实现中肯定是一个问题? 如果需要,我也可以显示我的BST和优先级队列的实现。 static class BentleyOttman { private static void AddIntersectionEvent(PriorityQueue eventList, Segment segEv, Segment segA, SegPoint i) { i.IntersectingSegments = new Tuple(segEv, segA); i.Type = SegmentPointType.IntersectionPoint; eventList.Add(i); } public static void […]

Cubic Bezier反向GetPoint方程:float for Vector Vector for float

鉴于结果值和四点,是否有可能获得浮动? 如果是这样,怎么样? public static Vector3 GetPoint (Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3, float t) { t = Mathf.Clamp01(t); float oneMinusT = 1f – t; return oneMinusT * oneMinusT * oneMinusT * p0 + 3f * oneMinusT * oneMinusT * t * p1 + 3f * oneMinusT * t * t * p2 + […]

如何判断一条线是否与C#中的多边形相交?

我有一个非常类似的问题: 如何知道一条线是否与C#中的平面相交? 我正在寻找一种方法(在C#中),它告诉一条线是否与任意多边形相交。 我认为Chris Marasti-Georg的算法非常有用,但缺少最重要的方法,即线对线交叉。 有没有人知道线路交叉方法来完成Chris Marasti-Georg的代码还是有类似的东西? 在C#中是否有内置代码? 此方法适用于使用禁区function增强的Bing Maps算法。 生成的路径不得通过禁区(任意多边形)。

画一条平行线

我有x1,y1和x2,y2,形成一个线段。 如何得到另一条线x3,y3-x4,y4,它与第一条线平行,如图所示。 我可以简单地将n添加到x1和x2以获得平行线,但它不是我想要的。 我希望线条在图片中平行。

计算端点给定距离,方位,起点

我试图找到目的地点,给定起点纬度/长度,方位和距离。 下面这个网站的计算器给了我想要的结果。 http://www.movable-type.co.uk/scripts/latlong.html 当我尝试通过代码实现相同的操作时,我得不到正确的结果。 以下是我的代码 – private GLatLng pointRadialDistance(double lat1, double lon1, double radianBearing, double radialDistance) { double rEarth = 6371.01; lat1 = DegreeToRadian(lat1); lon1 = DegreeToRadian(lon1); radianBearing = DegreeToRadian(radianBearing); radialDistance = radialDistance / rEarth; double lat = Math.Asin(Math.Sin(lat1) * Math.Cos(radialDistance) + Math.Cos(lat1) * Math.Sin(radialDistance) * Math.Cos(radianBearing)); double lon; if (Math.Cos(lat) == 0) { // […]