Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我不知道';我不明白为什么j变量被赋值两次_C#_Unity3d_Computational Geometry - Fatal编程技术网

C# 我不知道';我不明白为什么j变量被赋值两次

C# 我不知道';我不明白为什么j变量被赋值两次,c#,unity3d,computational-geometry,C#,Unity3d,Computational Geometry,快速提问。我对C#比较陌生,对下面的代码有一个快速的问题。为什么j等于一个值,然后几乎立即等于另一个值 Poly.cs using UnityEngine; public static class Poly { public static bool ContainsPoint (Vector2[] polyPoints, Vector2 p) { var j = polyPoints.Length - 1;

快速提问。我对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;    
    } 
}
使用UnityEngine;
公共静态类Poly
{    
公共静态bool ContainsPoint(向量2[]多点,向量2 p)
{    
var j=多点。长度-1;
var内=假;
for(int i=0;i
  • 初始值设定项
    首先执行,并且只执行一次。它通常用于声明迭代变量和定义初始状态
  • condition
    是一个返回
    bool
    的表达式,并在每次迭代前检查。只有当它为
    true
    时,才会执行循环内的代码并检查下一次迭代等
  • 迭代器
    在每次迭代后执行。通常用于增加/替换迭代变量或最终需要打破循环的任何东西(不一定)
您的
j
不会立即重新分配,而是在每次迭代后重新分配。。也不会重新分配两次,但可能会重新分配很多次;)


因此,这里它看起来像是用来通过
多点
创建一个完整的闭环

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

因为第一次迭代没有“上一次”迭代,所以使用最后一点(
polyPoints.Length-1

然后,在每次迭代之后,您基本上是在一行中完成的

j = i;
i+=1;
说明:后缀首先返回当前的
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;
}
var j=polyPoints.Length-1;
var内=假;
for(int i=0;i

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

j
记住每次迭代的前一个
i
值。但是您需要手动设置第一次迭代的初始“previous”值。哦,我应该补充一点,
j=i++
发生在第一次迭代之后。看起来因为它在代码中的位置,所以它是即时的,但执行是最后一次。请发布您的帖子和代码。仔细考虑后,我更喜欢OP中的版本。因为for循环中的第三个表达式表示“例程”从一个元素移动到下一个元素。这里我们从一条边移动到下一条边,涉及到
i
j
。处理多边形的人都熟悉这个过程。我通常写
…;j=i,i++
。在涉及三个顶点的情况下,我将推广到
k=j,j=i,i++)