C# 给定网格中的位置,它是哪一行和哪一列

C# 给定网格中的位置,它是哪一行和哪一列,c#,math,graph,matrix,C#,Math,Graph,Matrix,我有一个我正在写的应用程序,我必须把街道地址放在预先定义的标签纸上。此标签页有3列10行。我有一个正确创建标签的循环,但是有一个要求允许用户能够选择从图纸上的哪个标签开始。我本以为这将是一个简单的数学矩阵方程,但我无法想出或找到解决方案 以下是一个例子: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 根据上面的矩阵,假设用户决定从#6开始。我需要能够告诉我的循环从该位置开始:col:1 row:2 如果有帮助的话,我的循环看起来是这样的,但我认为这

我有一个我正在写的应用程序,我必须把街道地址放在预先定义的标签纸上。此标签页有3列10行。我有一个正确创建标签的循环,但是有一个要求允许用户能够选择从图纸上的哪个标签开始。我本以为这将是一个简单的数学矩阵方程,但我无法想出或找到解决方案

以下是一个例子:

1   2  3  4  5
6   7  8  9 10
11 12 13 14 15 
根据上面的矩阵,假设用户决定从#6开始。我需要能够告诉我的循环从该位置开始:col:1 row:2

如果有帮助的话,我的循环看起来是这样的,但我认为这可以归结为一个我没有想到的数学方程:

for (var yCounter = 0; yCounter < _labelSettings.LabelPerColumn; yCounter++)
{
    for (var xCounter = 0; xCounter < _labelSettings.ColumnsPerPage; xCounter++)
    {       
        foreach (var table in customNugget.PdfTables)
        {
            table.YPosition = SheetSettings.PageHeight -
                              (verticalOffset + yCounter * ((verticalSize + verticalOffset)));

            table.XPosition = horizontalOffset + xCounter * ((horizontalSize + horizontalOffset));
        }
    }
}

假设您知道每行中的单元格数(我认为应该是
\u labelSettings.ColumnsPerPage
),您可以这样计算起始值:

int cells = 5;//number of cells per row
int startAt = 6;//cell number to start at

int startY = (startAt - 1) / cells;//1
int startX = (startAt - 1) % cells;//0
然后可以使用这些开始值来初始化循环,但是需要小心确保内部循环仅在第一次运行时使用计算出的开始值。为此,您可以在第一次执行y循环后重置
startX
。像这样:

for (var yCounter = startY; yCounter < _labelSettings.LabelPerColumn; yCounter++)
{
    for (var xCounter = startX; xCounter < _labelSettings.ColumnsPerPage; xCounter++)
    {
        //do stuff
    }
    startX = 0;//reset so that the next execution starts at the beginning of the row
}
for(var yCounter=startY;yCounter<\u labelSettings.LabelPerColumn;yCounter++)
{
对于(var xCounter=startX;xCounter<_labelSettings.ColumnsPerPage;xCounter++)
{
//做事
}
startX=0;//重置,以便下一次执行从行的开头开始
}

编辑:
startY
的计算已被修改,以正确处理从最后一个数字开始的行(感谢@Zach指出错误)

num是要开始的数字 %是模数运算符(除法后的余数)
网格宽度是网格宽度:)

这适用于基于1的值,如您在问题中所示:

int _cellsPerRow = 5; //number of cells per row
for (int startAt = 1; startAt <= 15; startAt++)
{
    int startY = (startAt - 1) / _cellsPerRow + 1;
    int startX = (startAt - 1) % _cellsPerRow + 1;
    Console.WriteLine("{0}: {1}, {2}", startAt, startX, startY);
}
int\u cellsPerRow=5//每行的单元格数

对于(int startAt=1;startAt你能不能用数字除以列数得到行,然后用余数移到正确列的位置?希望我解释得足够好…..对不起,Sorceri,也许我误解了你的意思,但它对数字9有效,但让我们用数字4。我的矩阵哈s 3列,10行(或30个标签),如果我将30除以4,我得到7.5。列和行分别为4 1和2,因此这不起作用。你不会将其除以行,而是除以列,得到行so 4/3,其中1行和1的剩余部分,所以一列。我解释了你接受的答案,只是显然做得不好;)谢谢你的帮助。我无法让fiddler运行(我不经常使用它,所以我不确定通过单击运行我需要做什么),但我用我尝试过的方法更新了我上面的问题,有时有效,有时无效。我错过了什么吗?当我输入11时,我得到了行:3列:1,而它应该是行4列1(如果从1开始而不是从0开始,则为两个)@gcoleman0828:我的代码在基于零的索引上工作,因为这是您的循环似乎需要的。在您的示例中,3行5的网格中,那么11应该是第3行和第一个单元格。我的代码将正确地生成2和0(基于零的).JSFiddle要求您打开控制台以查看输出结果(在chrome:CTR+SHIFT+J中)我的错误你是对的。我算错了行。我想知道为什么列总是对的,但行却错了1..哈哈..感谢上帝,今天是星期五。这就是我所能说的!是的,它是零基的,@Tim's below是1基的,所以它不会这样。你有任何资料或知道网络上有任何关于这类方程的信息,让我我想这和矩阵计算有关,但我所研究的一切都没有发现太多关于这类问题的答案。非常感谢你。我遗漏了一些东西,或者这个答案错了吗?如果你从一个列数的完美除数开始呢?举个例子,假设5在这种情况下,y将被关1。你应该得到starty(行)=0和startx(列)=4,而不是starty(行)=1和startx(列)=4@Zach:好的,我已经更新了我的答案来处理这个问题。谢谢Tim…你能给我指一下关于这个主题的任何数学网站材料吗?这样我就能理解你是从哪里想到的,以及将来如何解决类似的问题吗?我喜欢学习而不是仅仅学习copy@gcoleman0828它的核心是
index/\u cellsPerRow
,使用整数除法,和
index%\u cellsPerRow
,使用模运算符。您可以查找这些术语以了解更多详细信息,但基本上我能识别(多亏Ryxuma的解决方案)这会给你你想要的行/列值,但是输入和输出都是基于0的。然后我根据需要加1减1(我打印了整个列表,并查看了关闭的内容)为了得到你需要的值。谢谢@Tim。我想我的问题是为什么“y”是除法而“x”是模?因为
a/b
from
a==0
(递增
a
)将返回
0
repeated
b
次,然后返回
1
b
次,等等。如果您计算行(
y
s),这恰好是您要计数的事情从0和
a%b
from
a==0
返回
0
b-1
,然后循环回到
0
并再次开始。如果您计算列(
x
s),这恰好是相同的事情从0开始。换言之:如果用
a*b
乘以
a
宽度为
b
高的矩形中的项目数,则整数除法
a/b
是在将
a
项目排列到中时计算整行的数量
x = num % grid width

y = num / grid width
int _cellsPerRow = 5; //number of cells per row
for (int startAt = 1; startAt <= 15; startAt++)
{
    int startY = (startAt - 1) / _cellsPerRow + 1;
    int startX = (startAt - 1) % _cellsPerRow + 1;
    Console.WriteLine("{0}: {1}, {2}", startAt, startX, startY);
}