[Я согласен со Стюартом, но продолжаю как академическое упражнение.]
Tricky ...
В некотором смысле, вы не действительно повторяете себя; вы делаете две похожие вещи, которые (в прямом и переносном смысле) ортогональны друг другу.
Полагаю, вы могли бы сделать следующее, хотя оно не более читабельно и, конечно, не более производительно:
[псевдо C #]:
void DrawGrid()
{
DrawLines(w, rowHeights, true);
DrawLines(h, colWidths, false);
}
void DrawLines(int lineLength, int[] lineSeparations, bool isHorizontal)
{
MyDrawLine(Point(0, 0), Point(lineLength, 0), isHorizontal);
int offset = 0;
for (int i = 0; i < widths.length; i++)
{
offset += lineSeparations[i];
MyDrawLine(Point(offset, 0), Point(offset, lineLength), isHorizontal);
}
}
void MyDrawLine(Point startPoint, Point endPoint, bool isHorizontal)
{
if (isHorizontal)
{
SwapXAndYCoordinates(startPoint);
SwapXAndYCoordinates(endPoint);
}
drawLine(startPoint, endPoint);
}
Если подумать, я думаю, что это просто глупая идея ...: -)