我正在编写一个代码来在屏幕上使用svg绘制六边形网格,我之所以使用单个六边形而不是模式,是因为我最终想让每个六边形成为一个引用的对象
我有点使用一些数学和点引用绘制六边形。
所以不是让这个变得复杂,而是通过尝试解释我的代码,这是我的代码https://jsfiddle.net/Snedden27/9nnrt7hp/8/,
我的问题是功能drawHexAround(分) //第41行, 该函数假设用六角形围绕六边形绘制六边形' @ cent'
这是检查条件:
if (!contains(drawnCentroids,centroidNew)) {
makeHex(centroidNew);
drawnCentroids.push(centroidNew);
}
这是函数
function contains(a, obj) {
var l = a.length;
for (var i=0;i<l;i++) {
// console.log(a[i],obj);
// console.log(a[i] === obj);
if (a[i] === obj) {
// console.log('true');
return true;
}
}
return false;
}
它绘制了六边形,但它也会覆盖现有的六边形,尽管我使用contains(a,obj)
来检查条件
我不明白为什么这种情况结果总是如此,显然在某些情况下会导致错误。
答案 0 :(得分:1)
你错了,检查2个对象的相等性将检查对象中每个属性的相等性 - 它不会!
您的问题中未指明,但从代码中我们可以看到您检查的对象如下所示:
centroidNew = {
cx: xRight,
cy: yMidTop
};
你有一系列你正在寻找的循环。
除非if (a[i] === obj) {
和a[0]
引用完全相同的对象,否则测试obj
永远不会评估为真。
要解决这个问题,您可以明确地查看属性,因为只有2个属性可能适用于您
if (a[i].cx === obj.cx && a[i].cy === obj.cy) {
以下是您的小提琴的更新:https://jsfiddle.net/9nnrt7hp/4/现在有时会从该测试中记录true
。