From 0db32702c6b759e2e8bd064558c3d7fa6426b0ad Mon Sep 17 00:00:00 2001 From: SlyVTT Date: Mon, 22 May 2023 22:54:49 +0200 Subject: [PATCH] collision detection [WIP] --- src/level.cpp | 199 +++++++++++++++++++++++++++-------------------- src/level.h | 4 +- src/vector2D.cpp | 7 ++ src/vector2D.h | 1 + 4 files changed, 125 insertions(+), 86 deletions(-) diff --git a/src/level.cpp b/src/level.cpp index fd72dba..33d5796 100644 --- a/src/level.cpp +++ b/src/level.cpp @@ -86,10 +86,10 @@ void Level::UpdateDataMap( void ) MyPlayer.currx = ((float) (i + 0.5f))*16.0f; MyPlayer.curry = ((float) (j + 0.5f))*16.0f; - MyPlayer.vx = 0.0f; - MyPlayer.vy = 0.0f; + MyPlayer.vx = 0; + MyPlayer.vy = 0; - MyPlayer.Update( 0.0f ); + MyPlayer.Update( 0 ); } } } @@ -187,21 +187,21 @@ int Level::GetTileForeground( uint16_t x, uint16_t y ) return currentTile; } - -bool CollisionSegSeg( Point2D A, Point2D B, Point2D C, Point2D D, Point2D *R ) +// Compute the intersection Point between segments [AB] and [CD] +// if there is an intersection, return true and store the result into Point R +bool CollisionSegSeg( Point2D A, Point2D B, Vector2D N, Point2D C, Point2D D, Point2D *R ) { - Vector2D I, J; I.x = B.x - A.x; I.y = B.y - A.y; - if (I.x==0 && I.y==0) return false; + //if (I.x==0 && I.y==0) return false; J.x = D.x - C.x; J.y = D.y - C.y; - if (J.x==0 && J.y==0) return false; + //if (J.x==0 && J.y==0) return false; libnum::num32 det; det = I.x*J.y-I.y*J.x; @@ -214,16 +214,58 @@ bool CollisionSegSeg( Point2D A, Point2D B, Point2D C, Point2D D, Point2D *R ) libnum::num32 k; k = (J.x*A.y - J.x*C.y - J.y*A.x + J.y*C.x) / det; - if ((mlibnum::num32(1) || klibnum::num32(1))) - return false; // intersection of the lines, but not of the segments + if ((m>=libnum::num32(0) && m<=libnum::num32(1) && k>=libnum::num32(0) && k<=libnum::num32(1))) + { + if ( (J.x*N.x + J.y*N.y) >= libnum::num32(0)) + return false; + else + { + (*R).x = C.x + k*J.x; + (*R).y = C.y + k*J.y; + return true; + } + } + else return false; // intersection of the lines, but not of the segments - (*R).x = C.x + k*J.x; - (*R).y = C.y + k*J.y; - return true; } +libnum::num32 ClosestPointOnSegment( Point2D A, Point2D B, Point2D P, Point2D *R ) +{ + Vector2D AB; + AB.x = B.x - A.x; + AB.y = B.y - A.y; + + libnum::num32 t = AB.Dot( AB ); + if (t==0) + { + (*R).x = A.x; + (*R).y = A.y; + return t; + } + + Vector2D Pv, Av; + Pv.x = P.x; + Pv.y = P.y; + Av.x = A.x; + Av.y = A.y; + + libnum::num32 t2 = (Pv.Dot(AB) - Av.Dot(AB)) / t; + + if (t2libnum::num32(1)) t2 = libnum::num32(1); + + Av.Add( AB, t ); + + (*R).x = A.x; + (*R).y = A.y; + return t2; + +} + + + /*RETURN true if the player can go in the target position*/ bool Level::CanGo( void ) { @@ -238,21 +280,12 @@ bool Level::CanGo( void ) if (PlayerTarget.x == PlayerOrigin.x && PlayerTarget.y == PlayerOrigin.y) return true; // velocity is 0 so Player.next = Player.Curr so we can stay here, that's obvious if (MyLevelBorders.size() == 0) return true; // there is no surrounding border so no need to check if there are collisions (also obvious) - for (unsigned int i=0; iA.x; - A.y = MyLevelBorders[i]->A.y; - - B.x = MyLevelBorders[i]->B.x; - B.y = MyLevelBorders[i]->B.y; + Point2D I; // Detection de collision entre [A,B] et [Player.Curr, Player.Next] - - - if (CollisionSegSeg( A, B, PlayerOrigin, PlayerTarget, &I )) + if (CollisionSegSeg( MyLevelBorders[i]->A, MyLevelBorders[i]->B, MyLevelBorders[i]->N, PlayerOrigin, PlayerTarget, &I )) { MyLevelBorders[i]->color = C_RED; MyPlayer.nextx = I.x; @@ -263,22 +296,20 @@ bool Level::CanGo( void ) return false; } - } - return true; } -Border* Level::MakeBorder( libnum::num DX, libnum::num DY, float x1, float y1, float x2, float y2 ) +Border* Level::MakeBorder( libnum::num32 DX, libnum::num32 DY, libnum::num32 x1, libnum::num32 y1, libnum::num32 x2, libnum::num32 y2 ) { Border *Bord = new Border(); - Bord->A.x = DX + libnum::num(x1*15.0); - Bord->A.y = DY + libnum::num(y1*15.0); + Bord->A.x = DX + libnum::num(15)*x1; + Bord->A.y = DY + libnum::num(15)*y1; - Bord->B.x = DX + libnum::num(x2*15.0); - Bord->B.y = DY + libnum::num(y2*15.0); + Bord->B.x = DX + libnum::num(15)*x2; + Bord->B.y = DY + libnum::num(15)*y2; Bord->N.x = Bord->A.y - Bord->B.y; Bord->N.y = Bord->B.x - Bord->A.x; @@ -288,7 +319,7 @@ Border* Level::MakeBorder( libnum::num DX, libnum::num DY, float x1, float y1, f return Bord; } -void Level::ConvertTileToBorder( int16_t currentTile, libnum::num DeltaX, libnum::num DeltaY ) +void Level::ConvertTileToBorder( int16_t currentTile, libnum::num32 DeltaX, libnum::num32 DeltaY ) { Border *B1; @@ -298,35 +329,35 @@ void Level::ConvertTileToBorder( int16_t currentTile, libnum::num DeltaX, libnum case 0: break; // No borders (filling tile) case 1: - B1 = MakeBorder( DeltaX, DeltaY, 0.0,0.0, 0.0,1.0 ); + B1 = MakeBorder( DeltaX, DeltaY, libnum::num32(0),libnum::num32(0), libnum::num32(0),libnum::num32(1) ); MyLevelBorders.push_back(B1); - B1 = MakeBorder( DeltaX, DeltaY, 0.0,1.0, 1.0,1.0 ); + B1 = MakeBorder( DeltaX, DeltaY, libnum::num32(0),libnum::num32(1), libnum::num32(1),libnum::num32(1) ); MyLevelBorders.push_back(B1); - B1 = MakeBorder( DeltaX, DeltaY, 1.0,1.0, 1.0,0.0 ); + B1 = MakeBorder( DeltaX, DeltaY, libnum::num32(1),libnum::num32(1), libnum::num32(1),libnum::num32(0) ); MyLevelBorders.push_back(B1); - B1 = MakeBorder( DeltaX, DeltaY, 1.0,0.0, 0.0,0.0 ); + B1 = MakeBorder( DeltaX, DeltaY, libnum::num32(1),libnum::num32(0), libnum::num32(0),libnum::num32(0) ); MyLevelBorders.push_back(B1); break; //45° diagonals case 2: - B1 = MakeBorder( DeltaX, DeltaY, 0.0,1.0, 1.0,0.0 ); + B1 = MakeBorder( DeltaX, DeltaY, libnum::num32(0),libnum::num32(1), libnum::num32(1),libnum::num32(0) ); MyLevelBorders.push_back(B1); break; case 3: - B1 = MakeBorder( DeltaX, DeltaY, 0.0,0.0, 1.0,1.0 ); + B1 = MakeBorder( DeltaX, DeltaY, libnum::num32(0),libnum::num32(0), libnum::num32(1),libnum::num32(1) ); MyLevelBorders.push_back(B1); break; case 12: - B1 = MakeBorder( DeltaX, DeltaY, 1.0,1.0, 0.0,0.0 ); + B1 = MakeBorder( DeltaX, DeltaY, libnum::num32(1),libnum::num32(1), libnum::num32(0),libnum::num32(0) ); MyLevelBorders.push_back(B1); break; case 13: - B1 = MakeBorder( DeltaX, DeltaY, 1.0,0.0, 0.0,1.0 ); + B1 = MakeBorder( DeltaX, DeltaY, libnum::num32(1),libnum::num32(0), libnum::num32(0),libnum::num32(1) ); MyLevelBorders.push_back(B1); break; @@ -334,43 +365,43 @@ void Level::ConvertTileToBorder( int16_t currentTile, libnum::num DeltaX, libnum //22.5° diagonals case 4: - B1 = MakeBorder( DeltaX, DeltaY, 0.0,1.0, 1.0,0.5 ); + B1 = MakeBorder( DeltaX, DeltaY, libnum::num32(0),libnum::num32(1), libnum::num32(1),libnum::num32(1)/libnum::num32(2) ); MyLevelBorders.push_back(B1); break; case 5: - B1 = MakeBorder( DeltaX, DeltaY, 0.0,0.5, 1.0,0.0 ); + B1 = MakeBorder( DeltaX, DeltaY, libnum::num32(0),libnum::num32(1)/libnum::num32(2), libnum::num32(1),libnum::num32(0) ); MyLevelBorders.push_back(B1); break; case 6: - B1 = MakeBorder( DeltaX, DeltaY, 0.0,0.0, 1.0,0.5 ); + B1 = MakeBorder( DeltaX, DeltaY, libnum::num32(0),libnum::num32(0), libnum::num32(1),libnum::num32(1)/libnum::num32(2) ); MyLevelBorders.push_back(B1); break; case 7: - B1 = MakeBorder( DeltaX, DeltaY, 0.0,0.5, 1.0,1.0 ); + B1 = MakeBorder( DeltaX, DeltaY, libnum::num32(0),libnum::num32(1)/libnum::num32(2), libnum::num32(1),libnum::num32(1) ); MyLevelBorders.push_back(B1); break; case 14: - B1 = MakeBorder( DeltaX, DeltaY, 1.0,0.5, 0.0,0.0 ); + B1 = MakeBorder( DeltaX, DeltaY, libnum::num32(1),libnum::num32(1)/libnum::num32(2), libnum::num32(0),libnum::num32(0) ); MyLevelBorders.push_back(B1); break; case 15: - B1 = MakeBorder( DeltaX, DeltaY, 1.0,1.0, 0.0,0.5 ); + B1 = MakeBorder( DeltaX, DeltaY, libnum::num32(1),libnum::num32(1), libnum::num32(0),libnum::num32(1)/libnum::num32(2) ); MyLevelBorders.push_back(B1); break; case 16: - B1 = MakeBorder( DeltaX, DeltaY, 1.0,0.5, 0.0,1.0 ); + B1 = MakeBorder( DeltaX, DeltaY, libnum::num32(1),libnum::num32(1)/libnum::num32(2), libnum::num32(0),libnum::num32(1) ); MyLevelBorders.push_back(B1); break; case 17: - B1 = MakeBorder( DeltaX, DeltaY, 1.0,0.0, 0.0,0.5 ); + B1 = MakeBorder( DeltaX, DeltaY, libnum::num32(1),libnum::num32(0), libnum::num32(0),libnum::num32(1)/libnum::num32(2) ); MyLevelBorders.push_back(B1); break; @@ -380,43 +411,43 @@ void Level::ConvertTileToBorder( int16_t currentTile, libnum::num DeltaX, libnum case 24: - B1 = MakeBorder( DeltaX, DeltaY, 0.5,1.0, 1.0,0.0 ); + B1 = MakeBorder( DeltaX, DeltaY, libnum::num32(1)/libnum::num32(2),libnum::num32(1), libnum::num32(1),libnum::num32(0) ); MyLevelBorders.push_back(B1); break; case 34: - B1 = MakeBorder( DeltaX, DeltaY, 0.0,1.0, 0.5,0.0 ); + B1 = MakeBorder( DeltaX, DeltaY, libnum::num32(0),libnum::num32(1), libnum::num32(1)/libnum::num32(2),libnum::num32(0) ); MyLevelBorders.push_back(B1); break; case 25: - B1 = MakeBorder( DeltaX, DeltaY, 0.0,0.0, 0.5,1.0 ); + B1 = MakeBorder( DeltaX, DeltaY, libnum::num32(0),libnum::num32(0), libnum::num32(1)/libnum::num32(2),libnum::num32(1) ); MyLevelBorders.push_back(B1); break; case 35: - B1 = MakeBorder( DeltaX, DeltaY, 0.5,0.0, 1.0,1.0 ); + B1 = MakeBorder( DeltaX, DeltaY, libnum::num32(1)/libnum::num32(2),libnum::num32(0), libnum::num32(1),libnum::num32(1) ); MyLevelBorders.push_back(B1); break; case 26: - B1 = MakeBorder( DeltaX, DeltaY, 0.5,1.0, 0.0,0.0 ); + B1 = MakeBorder( DeltaX, DeltaY, libnum::num32(1)/libnum::num32(2),libnum::num32(1), libnum::num32(0),libnum::num32(0) ); MyLevelBorders.push_back(B1); break; case 36: - B1 = MakeBorder( DeltaX, DeltaY, 1.0,1.0, 0.5,0.0 ); + B1 = MakeBorder( DeltaX, DeltaY, libnum::num32(1),libnum::num32(1), libnum::num32(1)/libnum::num32(2),libnum::num32(0) ); MyLevelBorders.push_back(B1); break; case 27: - B1 = MakeBorder( DeltaX, DeltaY, 1.0,0.0, 0.5,1.0 ); + B1 = MakeBorder( DeltaX, DeltaY, libnum::num32(1),libnum::num32(0), libnum::num32(1)/libnum::num32(2),libnum::num32(1) ); MyLevelBorders.push_back(B1); break; case 37: - B1 = MakeBorder( DeltaX, DeltaY, 0.5,0.0, 0.0,1.0 ); + B1 = MakeBorder( DeltaX, DeltaY, libnum::num32(1)/libnum::num32(2),libnum::num32(0), libnum::num32(0),libnum::num32(1) ); MyLevelBorders.push_back(B1); break; @@ -424,83 +455,83 @@ void Level::ConvertTileToBorder( int16_t currentTile, libnum::num DeltaX, libnum // Blocks with 3 sides case 8: - B1 = MakeBorder( DeltaX, DeltaY, 0.0,1.0, 1.0,1.0 ); + B1 = MakeBorder( DeltaX, DeltaY, libnum::num32(0),libnum::num32(1), libnum::num32(1),libnum::num32(1) ); MyLevelBorders.push_back(B1); - B1 = MakeBorder( DeltaX, DeltaY, 1.0,1.0, 1.0,0.0 ); + B1 = MakeBorder( DeltaX, DeltaY, libnum::num32(1),libnum::num32(1), libnum::num32(1),libnum::num32(0) ); MyLevelBorders.push_back(B1); - B1 = MakeBorder( DeltaX, DeltaY, 1.0,0.0, 0.0,0.0 ); + B1 = MakeBorder( DeltaX, DeltaY, libnum::num32(1),libnum::num32(0), libnum::num32(0),libnum::num32(0) ); MyLevelBorders.push_back(B1); break; case 9: - B1 = MakeBorder( DeltaX, DeltaY, 0.0,0.0, 0.0,1.0 ); + B1 = MakeBorder( DeltaX, DeltaY, libnum::num32(0),libnum::num32(0), libnum::num32(0),libnum::num32(1) ); MyLevelBorders.push_back(B1); - B1 = MakeBorder( DeltaX, DeltaY, 1.0,1.0, 1.0,0.0 ); + B1 = MakeBorder( DeltaX, DeltaY, libnum::num32(1),libnum::num32(1), libnum::num32(1),libnum::num32(0) ); MyLevelBorders.push_back(B1); - B1 = MakeBorder( DeltaX, DeltaY, 1.0,0.0, 0.0,0.0 ); + B1 = MakeBorder( DeltaX, DeltaY, libnum::num32(1),libnum::num32(0), libnum::num32(0),libnum::num32(0) ); MyLevelBorders.push_back(B1); break; case 18: - B1 = MakeBorder( DeltaX, DeltaY, 0.0,0.0, 0.0,1.0 ); + B1 = MakeBorder( DeltaX, DeltaY, libnum::num32(0),libnum::num32(0), libnum::num32(0),libnum::num32(1) ); MyLevelBorders.push_back(B1); - B1 = MakeBorder( DeltaX, DeltaY, 0.0,1.0, 1.0,1.0 ); + B1 = MakeBorder( DeltaX, DeltaY, libnum::num32(0),libnum::num32(1), libnum::num32(1),libnum::num32(1) ); MyLevelBorders.push_back(B1); - B1 = MakeBorder( DeltaX, DeltaY, 1.0,1.0, 1.0,0.0 ); + B1 = MakeBorder( DeltaX, DeltaY, libnum::num32(1),libnum::num32(1), libnum::num32(1),libnum::num32(0) ); MyLevelBorders.push_back(B1); break; case 19: - B1 = MakeBorder( DeltaX, DeltaY, 0.0,0.0, 0.0,1.0 ); + B1 = MakeBorder( DeltaX, DeltaY, libnum::num32(0),libnum::num32(0), libnum::num32(0),libnum::num32(1) ); MyLevelBorders.push_back(B1); - B1 = MakeBorder( DeltaX, DeltaY, 0.0,1.0, 1.0,1.0 ); + B1 = MakeBorder( DeltaX, DeltaY, libnum::num32(0),libnum::num32(1), libnum::num32(1),libnum::num32(1) ); MyLevelBorders.push_back(B1); - B1 = MakeBorder( DeltaX, DeltaY, 1.0,0.0, 0.0,0.0 ); + B1 = MakeBorder( DeltaX, DeltaY, libnum::num32(1),libnum::num32(0), libnum::num32(0),libnum::num32(0) ); MyLevelBorders.push_back(B1); break; // Blocks with 2 sides case 28: - B1 = MakeBorder( DeltaX, DeltaY, 0.0,1.0, 1.0,1.0 ); + B1 = MakeBorder( DeltaX, DeltaY, libnum::num32(0),libnum::num32(1), libnum::num32(1),libnum::num32(1) ); MyLevelBorders.push_back(B1); - B1 = MakeBorder( DeltaX, DeltaY, 1.0,0.0, 0.0,0.0 ); + B1 = MakeBorder( DeltaX, DeltaY, libnum::num32(1),libnum::num32(0), libnum::num32(0),libnum::num32(0) ); MyLevelBorders.push_back(B1); break; case 29: - B1 = MakeBorder( DeltaX, DeltaY, 0.0,0.0, 0.0,1.0 ); + B1 = MakeBorder( DeltaX, DeltaY, libnum::num32(0),libnum::num32(0), libnum::num32(0),libnum::num32(1) ); MyLevelBorders.push_back(B1); - B1 = MakeBorder( DeltaX, DeltaY, 1.0,1.0, 1.0,0.0 ); + B1 = MakeBorder( DeltaX, DeltaY, libnum::num32(1),libnum::num32(1), libnum::num32(1),libnum::num32(0) ); MyLevelBorders.push_back(B1); break; case 38: - B1 = MakeBorder( DeltaX, DeltaY, 0.0,0.0, 0.0,1.0 ); + B1 = MakeBorder( DeltaX, DeltaY, libnum::num32(0),libnum::num32(0), libnum::num32(0),libnum::num32(1) ); MyLevelBorders.push_back(B1); - B1 = MakeBorder( DeltaX, DeltaY, 1.0,0.0, 0.0,0.0 ); + B1 = MakeBorder( DeltaX, DeltaY, libnum::num32(1),libnum::num32(0), libnum::num32(0),libnum::num32(0) ); MyLevelBorders.push_back(B1); break; case 39: - B1 = MakeBorder( DeltaX, DeltaY, 1.0,1.0, 1.0,0.0 ); + B1 = MakeBorder( DeltaX, DeltaY, libnum::num32(1),libnum::num32(1), libnum::num32(1),libnum::num32(0) ); MyLevelBorders.push_back(B1); - B1 = MakeBorder( DeltaX, DeltaY, 1.0,0.0, 0.0,0.0 ); + B1 = MakeBorder( DeltaX, DeltaY, libnum::num32(1),libnum::num32(0), libnum::num32(0),libnum::num32(0) ); MyLevelBorders.push_back(B1); break; case 48: - B1 = MakeBorder( DeltaX, DeltaY, 0.0,0.0, 0.0,1.0 ); + B1 = MakeBorder( DeltaX, DeltaY, libnum::num32(0),libnum::num32(0), libnum::num32(0),libnum::num32(1) ); MyLevelBorders.push_back(B1); - B1 = MakeBorder( DeltaX, DeltaY, 0.0,1.0, 1.0,1.0 ); + B1 = MakeBorder( DeltaX, DeltaY, libnum::num32(0),libnum::num32(1), libnum::num32(1),libnum::num32(1) ); MyLevelBorders.push_back(B1); break; case 49: - B1 = MakeBorder( DeltaX, DeltaY, 0.0,1.0, 1.0,1.0 ); + B1 = MakeBorder( DeltaX, DeltaY, libnum::num32(0),libnum::num32(1), libnum::num32(1),libnum::num32(1) ); MyLevelBorders.push_back(B1); - B1 = MakeBorder( DeltaX, DeltaY, 1.0,1.0, 1.0,0.0 ); + B1 = MakeBorder( DeltaX, DeltaY, libnum::num32(1),libnum::num32(1), libnum::num32(1),libnum::num32(0) ); MyLevelBorders.push_back(B1); break; @@ -508,25 +539,25 @@ void Level::ConvertTileToBorder( int16_t currentTile, libnum::num DeltaX, libnum case 10: case 44: - B1 = MakeBorder( DeltaX, DeltaY, 1.0,0.0, 0.0,0.0 ); + B1 = MakeBorder( DeltaX, DeltaY, libnum::num32(1),libnum::num32(0), libnum::num32(0),libnum::num32(0) ); MyLevelBorders.push_back(B1); break; case 11: case 46: - B1 = MakeBorder( DeltaX, DeltaY, 0.0,1.0, 1.0,1.0 ); + B1 = MakeBorder( DeltaX, DeltaY, libnum::num32(0),libnum::num32(1), libnum::num32(1),libnum::num32(1) ); MyLevelBorders.push_back(B1); break; case 20: case 47: - B1 = MakeBorder( DeltaX, DeltaY, 0.0,0.0, 0.0,1.0 ); + B1 = MakeBorder( DeltaX, DeltaY, libnum::num32(0),libnum::num32(0), libnum::num32(0),libnum::num32(1) ); MyLevelBorders.push_back(B1); break; case 21: case 45: - B1 = MakeBorder( DeltaX, DeltaY, 1.0,1.0, 1.0,0.0 ); + B1 = MakeBorder( DeltaX, DeltaY, libnum::num32(1),libnum::num32(1), libnum::num32(1),libnum::num32(0) ); MyLevelBorders.push_back(B1); break; diff --git a/src/level.h b/src/level.h index de8f3bb..5f6fc00 100644 --- a/src/level.h +++ b/src/level.h @@ -38,7 +38,7 @@ class Level void ChangeMap( int level ); void UpdateDataMap( void ); - void ConvertTileToBorder( int16_t currentTile, libnum::num DeltaX, libnum::num DeltaY ); + void ConvertTileToBorder( int16_t currentTile, libnum::num32 DeltaX, libnum::num32 DeltaY ); void UpdateBorders( void ); bool CanGo( void ); @@ -49,7 +49,7 @@ class Level int GetTileBackgroundINT( uint8_t x, uint8_t y ); int GetTileForegroundINT( uint8_t x, uint8_t y ); - Border* MakeBorder( libnum::num DX, libnum::num DY, float x1, float y1, float x2, float y2 ); + Border* MakeBorder( libnum::num32 DX, libnum::num32 DY, libnum::num32 x1, libnum::num32 y1, libnum::num32 x2, libnum::num32 y2 ); }; diff --git a/src/vector2D.cpp b/src/vector2D.cpp index a935c6a..4aded69 100644 --- a/src/vector2D.cpp +++ b/src/vector2D.cpp @@ -56,6 +56,13 @@ Vector2D Vector2D::Clone( void ) return NewVector; } +Vector2D Vector2D::MakeVector( Point2D A, Point2D B) +{ + Vector2D NewVector( B.x-A.x, B.y-A.y ); + return NewVector; +} + + void Vector2D::AddVectors( Vector2D a, Vector2D b ) { this->x = a.x + b.x; diff --git a/src/vector2D.h b/src/vector2D.h index 3aa53e7..5ba9af0 100644 --- a/src/vector2D.h +++ b/src/vector2D.h @@ -42,6 +42,7 @@ class Vector2D ~Vector2D(); Vector2D Clone( void ); + Vector2D MakeVector( Point2D A, Point2D B); void AddVectors( Vector2D a, Vector2D b ); void Add( Vector2D v, libnum::num32 scale );