大佬教程收集整理的这篇文章主要介绍了我不明白为什么 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,请注明来意。