Algorithm 插入新半边对时,如何找到要拆分的正确半边链接?

Algorithm 插入新半边对时,如何找到要拆分的正确半边链接?,algorithm,procedural-generation,Algorithm,Procedural Generation,我正在进行一个程序化的城市建设项目,该项目使用半边/双连接边列表数据结构来表示道路。在下图中,预先存在的连接是实线。有两个半边链接:A到B和X到Y。我需要插入一个由两个新半边组成的新连接(虚线):1和2。箭头表示相关半边的方向,最近的节点(实心圆)是该半边的起点 我需要以编程方式确定是拆分半边链接AB还是XY。在这种情况下,应拆分链接AB以创建两个新的半边链接:A1和2B。你将如何确定这一点 我想我找到了一个解决办法。链接X1/2Y无效的原因是,在从头到尾绘制链接时,它们相互交叉。这让我想到十字

我正在进行一个程序化的城市建设项目,该项目使用半边/双连接边列表数据结构来表示道路。在下图中,预先存在的连接是实线。有两个半边链接:A到B和X到Y。我需要插入一个由两个新半边组成的新连接(虚线):1和2。箭头表示相关半边的方向,最近的节点(实心圆)是该半边的起点

我需要以编程方式确定是拆分半边链接AB还是XY。在这种情况下,应拆分链接AB以创建两个新的半边链接:A1和2B。你将如何确定这一点


我想我找到了一个解决办法。链接X1/2Y无效的原因是,在从头到尾绘制链接时,它们相互交叉。这让我想到十字路口的测试应该是可行的

执行此操作的第一步是查找正在建立的新连接的“创建向量”(虚线)。在本例中,node2是起始位置,endPosition是中心节点。具体做法如下:

creationVector = normalize(endPosition - startPosition);
incomingPoint = nodeAPosition + new float2(-creationVector.y, creationVector.x);
outgoingPoint = nodeAPosition + new float2(creationVector.y, -creationVector.x);
接下来,您需要计算与图中节点2相关的两个点:输入点和输出点。要保持顺时针方向,输入点需要位于创建向量的左侧,输出点需要位于右侧。在下图中,输入点为红色,输出点为蓝色。具体做法如下:

creationVector = normalize(endPosition - startPosition);
incomingPoint = nodeAPosition + new float2(-creationVector.y, creationVector.x);
outgoingPoint = nodeAPosition + new float2(creationVector.y, -creationVector.x);
最后一点是画两条线并测试它们之间是否有交点。我们将从无效链接X1/2Y开始。在本例中,我们绘制的两条线是:nodeX到incomingPoint,outingpoint到nodeA。我为交叉口测试找到的解决方案来自。为了完整起见,我将在下面列出我的版本:

private float2 IntersectionPointGet(
        float2 a1,
        float2 a2,
        float2 b1,
        float2 b2,
        out bool isIntersection)
{
    float tmp = (b2.x - b1.x) * (a2.y - a1.y) - (b2.y - b1.y) * (a2.x - a1.x);

    if (tmp == 0)
    {
        isIntersection = false;
        return float2.zero;
    }

    float mu = ((a1.x - b1.x) * (a2.y - a1.y) - (a1.y - b1.y) * (a2.x - a1.x)) / tmp;

    isIntersection = true;
    return new float2(
        b1.x + (b2.x - b1.x) * mu,
        b1.y + (b2.y - b1.y) * mu
    );
}
如您所见,链接X1/2Y相交,因此无效:

现在将其与A1/2B进行比较,A1/2B不相交,因此是有效的:


这个解决方案的好处在于,您只需要测试一个链接对。如果X1/2Y无效,我们可以假设A1/2B有效。这意味着链接AB是需要拆分的,而链接XY应该单独处理。

对不起,我不理解这个问题。您没有解释为什么要拆分AB或XY。虚线作为新半边有什么问题?你的问题没有任何意义sense@chmike抱歉,澄清一下,当您创建半边时,您需要存储的一条信息就是下半边。开始时,A半边存储对B半边的引用,因为B是链接中的下一个半边。当我插入新连接时,我需要将该引用从B更改为1,因为A现在链接到半边1。半边2现在将是存储对B的引用的半边。问题是,没有简单的方法来告诉(我知道)链接应该是A1/2B而不是X1/2Y。我仍然不理解,也帮不了你。仍然有许多缺失的信息,如必须满足的约束,这些信息有助于确定哪些是无效的,哪些是正确的答案。我怀疑有人能帮助你。问题还不清楚enough@chmike我在想我可能遗漏了什么信息。我想关于半边的另一个重要因素是链接必须是顺时针的。A1、2B、XY都是有效链接,因为它们的方向是顺时针的。X1/2Y是无效的,因为它们是逆时针的。