X-Git-Url: http://gitweb.pgornicz.com/gitweb.cgi?a=blobdiff_plain;f=src%2Fmathw.cpp;h=2b71dece6336c80fc9ab372f1cdfc3327488c838;hb=bcd46b8f4ee0d9b5ed6d983793f962ff66efa3aa;hp=430a601be26c274111906eb574a30c4254edf6b0;hpb=27b748208e91c2e802cbc2b8f7ab3620adaf6cb6;p=physics.git diff --git a/src/mathw.cpp b/src/mathw.cpp index 430a601..2b71dec 100644 --- a/src/mathw.cpp +++ b/src/mathw.cpp @@ -1,9 +1,21 @@ -#include "mathw.h" - - -/// ***** Private Varibles ***** +/* + * Copyright (C) 2008 Patrik Gornicz, Gornicz_P (at) hotmail (dot) com. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ -const float PI = 3.141592653; +#include "mathw.h" /// ***** Public Methods ***** @@ -13,16 +25,45 @@ int mod(int x, int y) return x % y + (x < 0 ? y : 0); } -/// Vector2 Math +// Vector2 Math + +Vector2 vectorToLine +( + const Vector2& vec, + float x1, + float y1, + float x2, + float y2 +) +{ + float lineSize = (float) sqrt((x1 - x2) * (x1 - x2) + + (y1 - y2) * (y1 - y2)); + if (lineSize == 0) + return Vector2(x1 - vec.m_fX, y1 - vec.m_fY); + + float u = ((vec.m_fX - x1) * (x2 - x1) + + (vec.m_fY - y1) * (y2 - y1)) / (lineSize * lineSize); + + if (u < 0) + return Vector2(x1 - vec.m_fX, y1 - vec.m_fY); + else if (u > 1) + return Vector2(x2 - vec.m_fX, y2 - vec.m_fY); + else + { + float ix = x1 + u * (x2 - x1); + float iy = y1 + u * (y2 - y1); + return Vector2(ix - vec.m_fX, iy - vec.m_fY); + } +} Vector2 perp(const Vector2& vec) { - return Vector2(-vec.y, vec.x); + return Vector2(-vec.m_fY, vec.m_fX); } float dot(const Vector2& vec1, const Vector2& vec2) { - return vec1.x * vec2.x + vec1.y * vec2.y; + return vec1.m_fX * vec2.m_fX + vec1.m_fY * vec2.m_fY; } //TODO float Vector2::projectionCoeff(const Vector2* vec) const;