C# 我不知道';我不明白为什么j变量被赋值两次
快速提问。我对C#比较陌生,对下面的代码有一个快速的问题。为什么j等于一个值,然后几乎立即等于另一个值 Poly.csC# 我不知道';我不明白为什么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;
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++)
。