查找对象的行

Finding the row of an object

我正在尝试创建一个由四边形组成的程序形状。

我希望能够获取任何四边形并使用它的索引来查找它所在的行。

从图像中取出四边形 9。我可以使用哪种函数来查找该行(在本例中它是 0 索引中的 2)。四轮20怎么样?

行的宽度总是改变 2 个四边形,每边一个。

抱歉,这有点令人费解,但我不确定如何解决这个问题。

假设直径为d,四边形数为q。我声称行从 0 到 d-1。此外,还有 (d/2)(2+d) 个元素。更简单的情况是如果 0<=q<(d/4)(2+d) 在这种情况下我们处于上半场。那么索引就是trunc((-1+sqrt(1+4*q))/2)。这是通过观察第 n 行以 n(n+1) 开始的观察结果得出的,这可以用算术级数的和正式表示,然后逆向计算并求解二次方程。 另一方面,如果我们在后半部分 (d/4)(2+d)<=q<(d/2)(2*d) 并且我们通过从末尾取偏移量来求解.令 q' 为 (d/2)(2+d)-1-q。将上述索引公式应用于q'而不是q,将结果从d-1中减去得到q所在行的索引。 我可能在这里或那里偏离了一个,但我认为这是它的要点。

我在想,因为这是发布到一个编程站点,也许更合乎逻辑的是提供一个可以实现的功能,而无需抽取大量数学知识,而只是依靠加法。我认为遵循起来更容易,但更难搞砸(尽管我可能低估了自己搞砸的能力,而我几乎做到了)。

var quadRowIndex = function (diameter, quadNumber) {
//diameter should be a positive even number
//quadNumber should be between 0 and index of last number in last row (inclusive)
var quadIndex = 0; //holds the RowIndex, which the function will return once the row contains quadNumber
var rowStartNum = 0;
var rowLength = 2;

//iterate through first half
while (rowLength <= diameter) {
    rowStartNum += rowLength;
    if (rowStartNum > quadNumber) {
        return quadIndex;
    }
    quadIndex++;
    rowLength += 2;
}
rowLength -= 2;
//iterate through second half if still here
while (rowLength >= 2) {
    rowStartNum += rowLength;
    if (rowStartNum > quadNumber) {
        return quadIndex;
    }
    quadIndex++;
    rowLength -= 2;
}
//still here -- number was too high, return error signal
return -1;
};
console.log(quadRowIndex(6, 9));
console.log(quadRowIndex(6, 20));
console.log(quadRowIndex(6, 100));