gpt4 book ai didi

ios - 获取相交线的面积(CGPoints)

转载 作者:行者123 更新时间:2023-11-29 00:46:15 33 4
gpt4 key购买 nike

我有一个 CGPoints 数组,我想找到那些构建形状的点。请看附图: enter image description here

红色圆圈只是标记我的点数。

如何找到带问号的区域?

谢谢。

最佳答案

您必须从第一条线段开始并检查是否有交点。显然,如果前两条线段相交,那么它们是同一条线,并且您的形状只是一条线,因此请忽略这种情况。当您继续沿着线段向下移动时,一旦找到相交的线段对,您就拥有了形状。

对照线段 1 检查线段 2。然后对照线段 2 检查线段 3,然后对照线段 1 检查线段 4。然后对照线段 3 检查线段 4,然后对照线段 2,然后对照线段 1,依此类推...如果找到该线段7 与线段 3 相交,删除线段 3 的第一个点并将其设置为您找到的交点。然后删除线段7的最后一个点并将其设置为您找到的交点。在那里你就有了你的形状。

这是一个查找 2 条线段交点的示例方法(用 C# 编写,但它是直接数学运算,因此应该很容易转换为您想要的任何语言)。 Taken from here:

// Determines if the lines AB and CD intersect.
static bool LinesIntersect(PointF A, PointF B, PointF C, PointF D)
{
PointF CmP = new PointF(C.X - A.X, C.Y - A.Y);
PointF r = new PointF(B.X - A.X, B.Y - A.Y);
PointF s = new PointF(D.X - C.X, D.Y - C.Y);

float CmPxr = CmP.X * r.Y - CmP.Y * r.X;
float CmPxs = CmP.X * s.Y - CmP.Y * s.X;
float rxs = r.X * s.Y - r.Y * s.X;

if (CmPxr == 0f)
{
// Lines are collinear, and so intersect if they have any overlap

return ((C.X - A.X < 0f) != (C.X - B.X < 0f))
|| ((C.Y - A.Y < 0f) != (C.Y - B.Y < 0f));
}

if (rxs == 0f)
return false; // Lines are parallel.

float rxsr = 1f / rxs;
float t = CmPxs * rxsr;
float u = CmPxr * rxsr;

return (t >= 0f) && (t <= 1f) && (u >= 0f) && (u <= 1f);
}

关于ios - 获取相交线的面积(CGPoints),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38575226/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com