public Vector GetSpringForce(Node n)
 {
     // ばねの力は自然長からの変位に比例 (比例定数 -k, ばねの長さ l)
     const double k = 0.1d;
     const double l = 60.0d;
     double dx = this.R.X - n.R.X;
     double dy = this.R.Y - n.R.Y;
     double d2 = dx * dx + dy * dy;
     if (d2 < double.Epsilon)
     {
         // 距離0の時は例外として乱数で決定
         Random rand = new Random();
         return new Vector()
         {
             X = rand.NextDouble() - 0.5d,
             Y = rand.NextDouble() - 0.5d
         };
     }
     double d = Math.Sqrt(d2);
     double cos = dx / d;
     double sin = dy / d;
     double dl = d - l;
     return new Vector()
     {
         X = -k * dl * cos,
         Y = -k * dl * sin
     };
 }
 public Vector GetReplusiveForce(Node n)
 {
     // 反発は距離の2乗に反比例 (比例定数 g)
     const double g = 500.0d;
     double dx = this.R.X - n.R.X;
     double dy = this.R.Y - n.R.Y;
     double d2 = dx * dx + dy * dy;
     if (d2 < double.Epsilon)
     {
         // 距離0の時は例外として乱数で決定
         Random rand = new Random();
         return new Vector()
         {
             X = rand.NextDouble() - 0.5d,
             Y = rand.NextDouble() - 0.5d
         };
     }
     double d = Math.Sqrt(d2);
     double cos = dx / d;
     double sin = dy / d;
     return new Vector()
     {
         X = g / d2 * cos,
         Y = g / d2 * sin
     };
 }