home *** CD-ROM | disk | FTP | other *** search
/ GameStar Special 2004 August / GSSH0804.iso / Action / Parsec47 / Parsec47.exe / p47 / src / abagames / util / Vector.d < prev   
Text File  |  2003-11-29  |  2KB  |  126 lines

  1. /*
  2.  * $Id: Vector.d,v 1.1.1.1 2003/11/28 17:26:30 kenta Exp $
  3.  *
  4.  * Copyright 2003 Kenta Cho. All rights reserved.
  5.  */
  6. module abagames.util.Vector;
  7.  
  8. import std.math;
  9.  
  10. /**
  11.  * Vector.
  12.  */
  13. public class Vector {
  14.  public:
  15.   float x, y;
  16.  
  17.  private:
  18.  
  19.   public this() {}
  20.  
  21.   public this(float x, float y) {
  22.     this.x = x; this.y = y;
  23.   }
  24.  
  25.   public float innerProduct(Vector v) {
  26.     return x * v.x + y * v.y;
  27.   }
  28.  
  29.   public Vector getElement(Vector v) {
  30.     Vector rsl;
  31.     float ll = v.x * v.x + v.y * v.y;
  32.     if (ll != 0) {
  33.       float mag = innerProduct(v);
  34.       rsl.x = mag * v.x / ll;
  35.       rsl.y = mag * v.y / ll;
  36.     } else {
  37.       rsl.x = rsl.y = 0; 
  38.     }
  39.     return rsl;
  40.   }
  41.  
  42.   public void add(Vector v) {
  43.     x += v.x;
  44.     y += v.y;
  45.   }
  46.  
  47.   public void sub(Vector v) {
  48.     x -= v.x;
  49.     y -= v.y;
  50.   }
  51.  
  52.   public void mul(float a) {    
  53.     x *= a;
  54.     y *= a;
  55.   }
  56.  
  57.   public void div(float a) {    
  58.     x /= a;
  59.     y /= a;
  60.   }
  61.  
  62.   public float checkSide(Vector pos1, Vector pos2) {
  63.     float xo = pos2.x - pos1.x;
  64.     float yo = pos2.y - pos1.y;
  65.     if (xo == 0) {
  66.       if (yo == 0)
  67.     return 0;
  68.       if (yo > 0)
  69.     return x - pos1.x;
  70.       else
  71.     return pos1.x - x;
  72.     } else if (yo == 0) {
  73.       if (xo > 0)
  74.     return pos1.y - y;
  75.       else
  76.     return y - pos1.y;
  77.     } else {
  78.       if (xo * yo > 0) { 
  79.     return (x - pos1.x) / xo - (y - pos1.y) / yo;
  80.       } else {
  81.     return -(x - pos1.x) / xo + (y - pos1.y) / yo;
  82.       }
  83.     }
  84.   }
  85.  
  86.   public float checkSide(Vector pos1, Vector pos2, Vector ofs) {
  87.     float xo = pos2.x - pos1.x;
  88.     float yo = pos2.y - pos1.y;
  89.     float mx = x - ofs.x;
  90.     float my = y - ofs.y;
  91.     if (xo == 0) {
  92.       if (yo == 0)
  93.     return 0;
  94.       if (yo > 0)
  95.     return mx - pos1.x;
  96.       else
  97.     return pos1.x - mx;
  98.     } else if (yo == 0) {
  99.       if (xo > 0)
  100.     return pos1.y - my;
  101.       else
  102.     return my - pos1.y;
  103.     } else {
  104.       if (xo * yo > 0) { 
  105.     return (mx - pos1.x) / xo - (my - pos1.y) / yo;
  106.       } else {
  107.     return -(mx - pos1.x) / xo + (my - pos1.y) / yo;
  108.       }
  109.     }
  110.   }
  111.  
  112.   public float size() {
  113.     return sqrt(x * x + y * y);
  114.   }
  115.  
  116.   public float dist(Vector v) {
  117.     float ax = fabs(x - v.x);
  118.     float ay = fabs(y - v.y);
  119.     if ( ax > ay ) {
  120.       return ax + ay / 2;
  121.     } else {
  122.       return ay + ax / 2;
  123.     }
  124.   }
  125. }
  126.