程序问答   发布时间:2022-05-31  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了我不明白为什么 j 变量被分配了两次大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决我不明白为什么 j 变量被分配了两次?

开发过程中遇到我不明白为什么 j 变量被分配了两次的问题如何解决?下面主要结合日常开发的经验,给出你关于我不明白为什么 j 变量被分配了两次的解决方法建议,希望对你解决我不明白为什么 j 变量被分配了两次有所启发或帮助;

快速提问。我对 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;    
    } 
}

解决方法

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 返回current i,然后才返回它增加 i。 (与++i相反,先递增,然后返回已经递增的i

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


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

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;
}

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

,

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

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

大佬总结

以上是大佬教程为你收集整理的我不明白为什么 j 变量被分配了两次全部内容,希望文章能够帮你解决我不明白为什么 j 变量被分配了两次所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:j