対角線のどちら側か

f:id:noriok:20160218073255p:plain

R, C が与えられたとき、それぞれの格子点が対角線のどちら側にあるか判定するプログラムです。

  • 対角線の傾き (R-1)/(C - 1)
  • 格子点の傾き i/j

について、その大きさを比較します。もし傾きが等しければ格子点は対角線上にあることがわかります。 等しくなければ、格子点は対角線の左側(右側)のどちらかにあります。

大きさを比較するときは、割り算を避けるために通分して整数での比較をするようにします。

using System;
using System.Collections.Generic;
using System.Linq;

class Program {
    static void Diagonal(int R, int C) {
        if (R < 2 || C < 2) throw new ArgumentException();

        Console.WriteLine("R:{0} C:{1}", R, C);
        for (int i = 0; i < R; i++) {
            for (int j = 0; j < C; j++) {
                int a = (R-1) * j;
                int b = i * (C-1);
                if (a == b) {
                    Console.Write("o"); // 対角線上
                }
                else if (a < b) {
                    Console.Write("+"); // 対角線の左側
                }
                else {
                    Console.Write("-"); // 対角線の右側
                }
            }
            Console.WriteLine();
        }
        Console.WriteLine();
    }

    static void Main() {
        Diagonal(4, 4);
        Diagonal(3, 5);
        Diagonal(3, 6);
        Diagonal(3, 7);
        Diagonal(2, 4);
    }
}

実行結果です。対角線上にある格子点を o で表し、それ以外を領域ごとに +- で表しています。

R:4 C:4
o---
+o--
++o-
+++o

R:3 C:5
o----
++o--
++++o

R:3 C:6
o-----
+++---
+++++o

R:3 C:7
o------
+++o---
++++++o

R:2 C:4
o---
+++o