Tag: 几何

Windows Phone 7:如何在XAML中解析Bezier Path字符串?

我需要解析Bezier Path Strings,但显然.Net CF框架中的System.Windows.Media.Geometry版本没有Parse()方法,它可以在它的普通对应方法中使用。 但是,输入以下XAML确实有效,因此必须有一种方法解析Path Data String。 有关如何使用XAML外部的自定义字符串启动此解析的任何线索? 我当然也可以尝试使用正则表达式来编写我自己的解析器,但我不想自己处理它,因为框架显然能够实现它。 更新 当使用建议的XAMLReader时,当我将StrokeThickness设置为新创建的Path时,我得到一个奇怪的exception: path.StrokeThickness = strokeWidth; //ArgumentException ??? (strokeWidth = 6) 当我使用我的手动解析器更改代码路径以进行渲染时,一切正常。 我在这里错过了什么吗? 除解析器外没有任何变化。 手动生成数据: //”M {0} {1} Q {2} {3} {4} {5}” String regex_input = @”M (\d+) (\d+) Q (\d+) (\d+) (\d+) (\d+)”; Regex regex = new Regex(regex_input); Match match = regex.Match(pathData); int startx = int.Parse(match.Groups[1].Value); […]

计算正多边形顶点的坐标

我正在编写一个程序,我需要绘制任意数量边的多边形,每个边都由一个动态变化的给定公式进行翻译。 有一些相当有趣的数学,但我被困在这个问题上。 如何只计算边数 ,并且理想地(但不是必须)将原点放在中心,我如何计算正多边形(一个所有角度相等的顶点)顶点的坐标? 例如:六边形可能有以下几点(都是float ): ( 1.5 , 0.5 *Math.Sqrt(3) ) ( 0 , 1 *Math.Sqrt(3) ) (-1.5 , 0.5 *Math.Sqrt(3) ) (-1.5 , -0.5 *Math.Sqrt(3) ) ( 0 , -1 *Math.Sqrt(3) ) ( 1.5 , -0.5 *Math.Sqrt(3) ) 我的方法看起来像这样: void InitPolygonVertexCoords(RegularPolygon poly) 并且需要将坐标添加到此(或类似的东西,如列表): Point[] _polygonVertexPoints; 我主要对这里的算法感兴趣,但C#中的例子会很有用。 我甚至不知道从哪里开始。 我该如何实施呢? 它甚至可能吗?! 谢谢。

用于旋转原点周围点的正确三角法

以下任何一种方法都使用正确的数学来旋转一个点吗? 如果是这样,哪一个是正确的? POINT rotate_point(float cx,float cy,float angle,POINT p) { float s = sin(angle); float c = cos(angle); // translate point back to origin: px -= cx; py -= cy; // Which One Is Correct: // This? float xnew = px * c – py * s; float ynew = px * s + py * […]

检测两个重合线段的重合子集

这个问题与以下内容有关: 如何确定GDI +中两条线的交点? (对代数的很好的解释,但没有代码) 如何检测两个线段相交的位置? (接受的答案实际上不起作用) 但请注意,一个有趣的子问题在大多数解决方案中都被完全掩盖了,即使有三个子案例,它们也只是在重合的情况下返回null: 巧合,但不重叠 触摸只是点和巧合 重叠/重合线子段 例如,我们可以像这样设计一个C#函数: public static PointF[] Intersection(PointF a1, PointF a2, PointF b1, PointF b2) 其中(a1,a2)是一个线段,(b1,b2)是另一个。 此function需要涵盖大多数实现或解释所掩盖的所有奇怪情况。 为了解释重合线的奇怪性,该函数可以返回PointF的数组: 如果线条平行或不相交(无限线相交但线段不相交 ,或线条平行 ),则为零结果点(或null) 一个结果点(包含交叉点位置),如果它们相交或者它们在一个点上重合 如果两条线重合,则两个结果点(对于线段的重叠部分)

如何确定点是否在某一线附近?

我之前问过“ 我怎么能判断一个点是否属于某条线? ”我找到了合适的答案,所以非常感谢你。 现在,我想知道如何确定某个点是否接近我的线。

如何用自己压缩一个IEnumerable

我正在实现一些基于点列表的数学算法,如距离,面积,质心等。就像在这篇文章中一样: 找到使用linq导航点列表所需的距离 该文章描述了如何通过基本上用“自身”压缩序列来计算一系列点的总距离(按顺序排列),通过将原始IEnumerable的起始位置偏移1来生成Zip的序列。 因此,给定.Net 4.0中的Zip扩展,假设点类型为Point,以及合理的距离公式,您可以进行这样的调用,以生成从一个点到下一个点的距离序列,然后对距离求和: var distances = points.Zip(points.Skip(1),Distance); double totalDistance = distances.Sum(); 面积和质心计算类似,因为它们需要迭代序列,处理每对点(点[i]和点[i + 1])。 我想要制作一个通用的IEnumerable扩展,适合实现这些(可能还有其他)算法,这些算法在序列上运行,一次取两个项目(points [0]和points [1],points [1]和points [2], …,点[n-1]和points [n](或者是n-2和n-1 ……)并应用函数。 我的通用迭代器将具有与Zip类似的签名,但它不会收到第二个要压缩的序列,因为它实际上只是自己压缩。 我的第一次尝试看起来像这样: public static IEnumerable ZipMyself(this IEnumerable seq, Func resultSelector) { return seq.Zip(seq.Skip(1),resultSelector); } 开始编辑:看到响应后,我已经实现了Pairwise,并明确使用了底层的Enumerator,如下所示: public static IEnumerable Pairwise(this IEnumerable seq, Func resultSelector) { TSequence prev = default(TSequence); using (IEnumerator e […]

计算距离A的给定距离的AB线上的点

我会非常疯狂地计算沿着给定线AB的点,在距离A的给定距离处,以便我可以“绘制”两个给定点之间的线。 一开始听起来很简单,但我似乎无法做到这一点。 更糟糕的是,我不明白我哪里出错了。 几何(和一般的数学)不是我强大的套件。 我已经阅读了类似的问题,并在那里有答案。 事实上,我直接从Mads Elvheim的回答中解除了我对CalculatePoint函数的当前实现: 给定一个起点和终点以及一个距离,计算沿线的一个点 (加上后面的注释中的修正 – 如果我理解正确的话)因为我的独立尝试解决问题让我无处可去,除了头等舱快递票务frusterpationland。 这是我的更新代码(请参阅EDIT备注post的底部): using System; using System.Drawing; using System.Windows.Forms; namespace DrawLines { public class MainForm : Form { // ===================================================================== // Here’s the part I’m having trouble with. I don’t really understand // how this is suposed to work, so I can’t seem to get it […]

检测地理位置是否在复杂多边形中

我们目前正在使用以下算法来检测地理点是否在复杂多边形内。 这种方法很好,除非多边形穿过180°经度线。 例如,在多边形160,65,0 160,15,0 -160,15,0 -160,65,0 160,65,0中未检测到点(-170,60) 看看下图:[Img] http://tinypic.com/r/14x2xl1 [/ img]我想要红色框中的所有内容。 不是黄色的盒子! public static bool IsCoordinateInPolygon(IList polygon, KMLCoordinate testPoint) { bool result = false; int j = polygon.Count – 1; for (int i = 0; i < polygon.Count; i++) { if (polygon[i].Latitude = testPoint.Latitude || polygon[j].Latitude = testPoint.Latitude) { if (polygon[i].Longitude + (testPoint.Latitude – polygon[i].Latitude) […]

顺畅连接圆心

我试图沿着中心画一条穿过管子内部的路径。 我必须处理的数据是圆圈的中心点,描述管道中每个转弯的开始和结束时的管道。 通过管道的直线段绘制路径是微不足道的,但我不确定如何接近弯道。 两个圆之间的任何转弯应该是恒定的半径。 因此,我可以访问此圆上的两个点,以及该点处圆圈线的方向。 有谁知道我将如何计算这个圈子的其余部分? 编辑: 附上了照片般逼真的管道素描。 因此,假装曲线不会像地狱那样摇摆不定,蓝色线条表示圆圈,红色表示中心点,绿色表示穿过中心的路径。