2013-11-01 20 views
3

我有一个应用程序,我正在写我必须在预先定义的标签工作表上放置街道地址的地方。该标签页有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)); 
     } 
    } 
} 

编辑

 private static int _cellsPerRow = 3; 
    private static int _startIndex; 

    static void Main(string[] args) 
    { 

     string userInput = Console.ReadLine(); 
     _startIndex = int.Parse(userInput); 

     int startY = _startIndex/_cellsPerRow; 
     int startX = (_startIndex - 1) % _cellsPerRow; 

     Console.WriteLine(string.Format("The index you chose lives in the following matrix location:\n Row: {0} Column: {1}", startY, startX)); 
     Console.WriteLine("Press any key to continue..."); 
     Console.Read(); 

    } 
+0

你能不能拿数字鸿沟是由数量列来获取行并使用余数来移动到正确列的位置?希望我解释得那么好..... – Sorceri

+0

对不起,Sorceri,也许我误解你的意思,但它与数字9一起工作,但让我们取数字4.我的矩阵有3列10行(或30标签可能),如果我将30除以4,我会得到7.5。列和行分别为4 1和2,所以这不起作用。 – gcoleman0828

+0

你不会按行分割它,而是按行分割以获得这样的行,所以4/3是1行,其余1行是1列。我正在解释你接受的答案,只是没有做得很好;) – Sorceri

回答

3

那么假设你知道每行中的单元格数量(我认为它应该是_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 
} 

Here is proof of the logic, though it is in javascript

编辑:为startY计算已被修饰的正确处理开始的最后一个数字是行(感谢@Zach指点错误了)

+0

感谢您的帮助。我无法让提琴手跑(我不经常使用它,所以我不知道我需要做什么传递点击运行),但我更新了我的问题与我试过的东西,有时它作品,有时不是。我错过了什么?当我输入11时,我得到行:3列:1当它应该是第4行第1列(或两个,如果你从1开始而不是0) – gcoleman0828

+1

@ gcoleman0828:我的代码在零基索引上工作,因为这是你的循环看起来需要什么。在你的3行5行的例子网格中。然后11应该是第3行和第一个单元格。我的代码将正确生成2和0(基于零)。 JSFiddle要求您打开控制台以查看输出结果(以chrome:CTR + SHIFT + J) – musefan

+0

我的错误您是正确的。我误解了行。我想知道为什么列总是正确的,但行是1关闭..大声笑..感谢上帝,这是星期五。这就是我所能说的!是的,这是零基础和@蒂姆的下面是1基础,所以它不会。你是否有任何材料或知道网络上的任何内容会通过这种方程式,以便我能够阅读它并学习它?我认为它与矩阵计算有关,但我研究的所有内容都没有发现太多这种类型的问题。非常感谢您 – gcoleman0828

1
x = num % grid width 

y = num/grid width 

num是开始数 %是模数算子(除以后的余数) 网格宽度是网格宽度:)

1

这适用于基于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); 
} 

(例如,“6:1,2”)

+0

谢谢蒂姆......你能指点我关于这个问题的任何数学网站资料,所以我可以理解你想出了什么,以及如何在未来找出这样的事情?我喜欢学习,而不是仅仅复制 – gcoleman0828

+0

@ gcoleman0828它的核心是'index/_cellsPerRow',使用整数除法和'index%_cellsPerRow',使用模运算符。您可以查看这些条款以获取更多详细信息,但基本上我已经认识到(得益于Ryxuma的解决方案),这些将为您提供您之后的行/列值,但基于0的输入和输出。然后,我只是根据需要添加和减去1(我打印出整个列表并查看所关闭的内容)以获取所需的值。 –

+0

谢谢@Tim。我想我的问题就是为什么'y'除法和'x'是模数? – gcoleman0828

相关问题