【问题标题】:I don't understand why the j variable is assigned twice [closed]我不明白为什么 j 变量被分配了两次 [关闭]
【发布时间】:2021-01-21 05:35:11
【问题描述】:

快速提问。我对 C# 比较陌生,并且有一个关于以下代码的快速问题。为什么 j 设置为等于一个值,然后几乎立即设置为另一个?

Poly.cs

using UnityEngine;

public static class Poly    
{    
    public static bool ContainsPoint (Vector2[] polyPoints, Vector2 p)    
    {    
        var j = polyPoints.Length - 1;    
        var inside = false;
    
        for (int i = 0; i < polyPoints.Length; j = i++)    
        {    
            var pi = polyPoints[i];    
            var pj = polyPoints[j];
    
            if (((pi.y <= p.y && p.y < pj.y) || (pj.y <= p.y && p.y < pi.y)) && (p.x < (pj.x - pi.x) * (p.y - pi.y) / (pj.y - pi.y) + pi.x))    
                inside = !inside;    
        }
    
        return inside;    
    } 
}

【问题讨论】:

  • j 记住每次迭代之前的 i 值。但是您需要手动设置第一次迭代的初始“先前”值。
  • 哦,我应该补充一点,j = i++ 发生在第一次迭代之后。由于它在代码中的位置,它看起来是立即执行的,但执行发生在最后。
  • 请edit你的帖子和format你的代码。

标签: c# unity3d computational-geometry


【解决方案1】:

for(initializer; condition; iterator) 循环的工作方式如下:

  • initializer 首先被执行,并且只执行一次。它通常用于声明迭代变量(s)并定义初始化状态
  • condition 是一个返回 bool 的表达式,并在每次迭代之前在进行检查。只有当它是 true 时,循环内的代码才会被执行并检查下一次迭代等
  • iterator 在每次迭代之后执行。通常用于增加/交替迭代变量或最终需要打破循环的任何内容(但不一定)

您的j 不会立即重新分配,而是在每次迭代后重新分配.. 也不是两次但可能很多次;)


所以这里看起来像是用来通过polyPoints创建一个完整的闭环。

j用于存储polyPoint中上一个条目的索引。

由于第一次迭代没有“上一个”迭代,因此您使用最后一点 (polyPoints.Length - 1)。

然后之后你基本上在一行中进行每次迭代

j = i;
i+=1;

说明:后缀 increment-operator i++ first 返回当前 i,然后才递增i。 (与++i相反,它先递增,然后返回已经递增的i)

因此,您在进行下一次迭代之前存储当前的i。因此,在循环中,您始终使用第一次迭代的最后一点检查当前 (pi) 与 polyPoints 中的前一个 (pj) 条目。 -> 闭环


你可以而且在我看来应该把它写成

var j = polyPoints.Length - 1;
var inside = false;

for (int i = 0; i < polyPoints.Length; i++)
{
    var pi = polyPoints[i];
    var pj = polyPoints[j];

    if (((pi.y <= p.y && p.y < pj.y) || (pj.y <= p.y && p.y < pi.y)) && (p.x < (pj.x - pi.x) * (p.y - pi.y) / (pj.y - pi.y) + pi.x))
    {
        inside = !inside;
    }

    // Do it here! This is way easier to understand
    j = i;
}

这对您和其他读者来说更容易理解。在我看来,您当前的代码是有人试图以牺牲可读性为代价过度“优化”的结果

【讨论】:

  • 经过琢磨,我更喜欢OP里的版本。因为 for 循环中的第三个表达式表示从一个元素到下一个元素的“常规”工作。在这里,我们正在从一个边缘移动到下一个边缘,i 和 j 都参与其中。那些处理多边形的人都熟悉这个过程。我以前写...; j= i, i++)。在涉及三个顶点的情况下,我会推广到k= j, j= i, i++)。
【解决方案2】:

“几乎立即”:不,它仅在 for 循环结束时重新分配。

此构造确保j, i 覆盖封闭多边形的所有边。

【讨论】:

    猜你喜欢
    • 2022-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-21
    • 1970-01-01
    相关资源
    最近更新 更多