added multiple flipper option

This commit is contained in:
Sylvain PILLOT 2023-05-29 00:09:33 +02:00
parent c47464dae6
commit e546f53e84
6 changed files with 289 additions and 106 deletions

View File

@ -8,7 +8,7 @@ Add targets and enable bonus
Add multiple flippers all around the tables/boards
Add the possibilty to have connected tables using a king on tunnel
Add the possibilty to have connected tables using a kind on tunnel
Add ball launcher with user controle initial velocity

View File

@ -23,12 +23,14 @@
#include "extrakeyboard.h"
#include "pinball_entities.h"
#include "stdint-gcc.h"
#include "tables.h"
#include "utilities.h"
#include "vector2D.h"
#include <vector>
#include <math.h>
#include "tables.h"
bool screenshot = false;
bool record = false;
@ -66,59 +68,11 @@ uint16_t CX(Vector2D pos) { return (int) (pos.x * cScale); }
uint16_t CY(Vector2D pos) { return (int) (libnum::num32(azrp_height) - pos.y * cScale); }
/* create the pinball board */
void SetupScene(void) {
libnum::num32 offset = libnum::num32(0.02);
flipperHeight = libnum::num32(1.7);
cScale = libnum::num32(azrp_height) / flipperHeight;
simWidth = libnum::num32(azrp_width) / cScale;
simHeight = libnum::num32(azrp_height) / cScale;
MyPinball.score = 0;
MyPinball.gravity.Set( Vector2D( libnum::num32(0.0), libnum::num32(-3.0) ) );
MyPinball.pause = true;
MyPinball.borders.clear();
MyPinball.borders.push_back( Vector2D( libnum::num32(0.74) , libnum::num32(0.25)));
MyPinball.borders.push_back( Vector2D( libnum::num32(1.0)-offset, libnum::num32(0.4)));
MyPinball.borders.push_back( Vector2D( libnum::num32(1.0)-offset, flipperHeight - offset));
MyPinball.borders.push_back( Vector2D( offset , flipperHeight - offset));
MyPinball.borders.push_back( Vector2D( offset , libnum::num32(0.4)));
MyPinball.borders.push_back( Vector2D( libnum::num32(0.26) , libnum::num32(0.25)));
MyPinball.borders.push_back( Vector2D( libnum::num32(0.26) , libnum::num32(offset)));
MyPinball.borders.push_back( Vector2D( libnum::num32(0.74) , libnum::num32(offset)));
void SetupScene( int which_table ) {
MyPinball.balls.clear();
libnum::num32 ball_radius = libnum::num32(0.03);
libnum::num32 ball_mass = libnum::num32( PI ) * ball_radius * ball_radius;
Vector2D ball_pos1( libnum::num32(0.92), libnum::num32(0.5) );
Vector2D ball_vel1( libnum::num32(0.2) , libnum::num32(3.5) );
MyPinball.balls.push_back( Ball( ball_radius, ball_mass, ball_pos1, ball_vel1, 0.2 ) );
Vector2D ball_pos2( libnum::num32(0.08), libnum::num32(0.5) );
Vector2D ball_vel2( libnum::num32(0.2) , libnum::num32(3.5) );
MyPinball.balls.push_back( Ball( ball_radius, ball_mass, ball_pos2, ball_vel2, 0.2 ) );
MyPinball.obstacles.clear();
MyPinball.obstacles.push_back( Obstacle( 0.1 , Vector2D( libnum::num32(0.25), libnum::num32(0.6) ), 2.0 ) );
MyPinball.obstacles.push_back( Obstacle( 0.1 , Vector2D( libnum::num32(0.75), libnum::num32(0.5) ), 2.0 ) );
MyPinball.obstacles.push_back( Obstacle( 0.12, Vector2D( libnum::num32(0.7 ), libnum::num32(1.0) ), 2.0 ) );
MyPinball.obstacles.push_back( Obstacle( 0.1 , Vector2D( libnum::num32(0.2 ), libnum::num32(1.2) ), 2.0 ) );
libnum::num32 flip_radius = libnum::num32( 0.03);
libnum::num32 flip_length = libnum::num32( 0.2);
libnum::num32 flip_maxRotation = libnum::num32(1.0);
libnum::num32 flip_restAngle = libnum::num32(0.5);
libnum::num32 flip_angularVelocity = libnum::num32(10.0);
libnum::num32 flip_restitution = libnum::num32(0.0);
Vector2D flip_pos1( libnum::num32(0.26), libnum::num32(0.22) );
Vector2D flip_pos2( libnum::num32(0.74), libnum::num32(0.22) );
MyPinball.flippers.push_back( Flipper( flip_radius, flip_pos1, flip_length, -flip_restAngle, flip_maxRotation, flip_angularVelocity, flip_restitution) );
MyPinball.flippers.push_back( Flipper( flip_radius, flip_pos2, flip_length, libnum::num32(PI) + flip_restAngle, -flip_maxRotation, flip_angularVelocity, flip_restitution) );
if (which_table==0) Setup_Table_0();
else if (which_table==1) Setup_Table_1();
else Setup_Table_0();
}
void HandleBallBallCollision( Ball *ball1, Ball *ball2 )
@ -320,12 +274,6 @@ static void render(void) {
{
Vector2D start = MyPinball.flippers[i].pos;
Vector2D end = MyPinball.flippers[i].getTip();
//libnum::num32 angleflip = MyPinball.flippers[i].restAngle + MyPinball.flippers[i].sign * MyPinball.flippers[i].rotation;
//azrp_filledcircle( CX(MyPinball.flippers[i].pos), CY(MyPinball.flippers[i].pos), (int) (MyPinball.flippers[i].radius*cScale), C_GREEN );
//azrp_filledcircle( CX(MyPinball.flippers[i].getTip()), CY(MyPinball.flippers[i].getTip()), (int) (MyPinball.flippers[i].radius*cScale), C_GREEN );
//azrp_line( CX(MyPinball.flippers[i].pos), CY(MyPinball.flippers[i].pos), CX(MyPinball.flippers[i].getTip()), CY(MyPinball.flippers[i].getTip()), C_GREEN );
azrp_filledcircle( CX(start), CY(start), (int) (MyPinball.flippers[i].radius*cScale), C_GREEN );
azrp_filledcircle( CX(end), CY(end), (int) (MyPinball.flippers[i].radius*cScale), C_GREEN );
azrp_line(CX(start), CY(start), CX(end), CY(end), C_GREEN );
@ -357,32 +305,38 @@ static void get_inputs(float dt) {
/* LEFT FLIPPER */
if (MyKeyboard.IsKeyPressed(MYKEY_F1)) {
MyPinball.flippers[0].touchIdentifier = libnum::num32(0);
for(int i=0; i<MyPinball.flippers.size();i++)
if (MyPinball.flippers[i].side == LEFT)
MyPinball.flippers[i].touchIdentifier = libnum::num32(0);
}
else {
MyPinball.flippers[0].touchIdentifier = libnum::num32(-1);
for(int i=0; i<MyPinball.flippers.size();i++)
if (MyPinball.flippers[i].side == LEFT)
MyPinball.flippers[i].touchIdentifier = libnum::num32(-1);
}
/* RIGHT FLIPPER */
if (MyKeyboard.IsKeyPressed(MYKEY_F6)) {
MyPinball.flippers[1].touchIdentifier = libnum::num32(0);
for(int i=0; i<MyPinball.flippers.size();i++)
if (MyPinball.flippers[i].side == RIGHT)
MyPinball.flippers[i].touchIdentifier = libnum::num32(0);
}
else {
MyPinball.flippers[1].touchIdentifier = libnum::num32(-1);
for(int i=0; i<MyPinball.flippers.size();i++)
if (MyPinball.flippers[i].side == RIGHT)
MyPinball.flippers[i].touchIdentifier = libnum::num32(-1);
}
/* RESET THE GAME */
if(MyKeyboard.IsKeyPressed(MYKEY_SHIFT) &&
MyKeyboard.IsKeyHoldPressed(MYKEY_MENU)) {
/** TODO : This need to be seriously clean up **/
MyPinball.balls[0].pos.Set( Vector2D( libnum::num32(0.92), libnum::num32(0.5) ) );
MyPinball.balls[0].vel.Set( Vector2D( libnum::num32(0.2) , libnum::num32(3.5) ) );
MyPinball.balls[1].pos.Set( Vector2D( libnum::num32(0.08), libnum::num32(0.5) ) );
MyPinball.balls[1].vel.Set( Vector2D( libnum::num32(0.2) , libnum::num32(3.5) ) );
MyKeyboard.IsKeyHoldPressed(MYKEY_F2)) {
SetupScene(0);
}
if(MyKeyboard.IsKeyPressed(MYKEY_SHIFT) &&
MyKeyboard.IsKeyHoldPressed(MYKEY_F3)) {
SetupScene(1);
}
#if (DEBUG_MODE)
if (MyKeyboard.IsKeyPressed(MYKEY_OPTN) &&
@ -480,7 +434,7 @@ int main(void) {
usb_interface_t const *interfaces[] = {&usb_ff_bulk, NULL};
usb_open(interfaces, GINT_CALL_NULL);
SetupScene();
SetupScene(0);
prof_init();

View File

@ -8,6 +8,13 @@
#include <vector>
enum
{
LEFT = 0,
RIGHT = 1,
};
class Ball {
public:
Ball(libnum::num32 radius, libnum::num32 mass, Vector2D pos, Vector2D vel,
@ -50,7 +57,7 @@ class Flipper {
public:
Flipper(libnum::num32 radius, Vector2D pos, libnum::num32 length,
libnum::num32 restAngle, libnum::num32 maxRotation,
libnum::num32 angularVelocity, libnum::num32 restitution) {
libnum::num32 angularVelocity, libnum::num32 restitution, uint8_t side ) {
this->radius = radius;
this->pos = pos.Clone();
this->length = length;
@ -61,6 +68,7 @@ public:
this->rotation = libnum::num32(0);
this->currentAngularVelocity = libnum::num32(0);
this->touchIdentifier = libnum::num32(-1);
this->side=side;
}
void Simulate(libnum::num32 dt) {
@ -93,6 +101,7 @@ public:
libnum::num32 rotation;
libnum::num32 currentAngularVelocity;
libnum::num32 touchIdentifier;
uint8_t side;
};

201
src/tables.h Normal file
View File

@ -0,0 +1,201 @@
#ifndef TABLES_H
#define TABLES_H
#include "pinball_entities.h"
#include "utilities.h"
#include "vector2D.h"
#include <num/num.h>
extern Scene MyPinball;
extern libnum::num32 flipperHeight;
extern libnum::num32 cScale;
extern libnum::num32 simWidth;
extern libnum::num32 simHeight;
void Setup_Table_0(void) {
libnum::num32 offset = libnum::num32(0.02);
flipperHeight = libnum::num32(1.7);
cScale = libnum::num32(azrp_height) / flipperHeight;
simWidth = libnum::num32(azrp_width) / cScale;
simHeight = libnum::num32(azrp_height) / cScale;
MyPinball.score = 0;
MyPinball.gravity.Set(Vector2D(libnum::num32(0.0), libnum::num32(-3.0)));
MyPinball.pause = true;
MyPinball.borders.clear();
MyPinball.borders.push_back(
Vector2D(libnum::num32(0.74), libnum::num32(0.25)));
MyPinball.borders.push_back(
Vector2D(libnum::num32(1.0) - offset, libnum::num32(0.4)));
MyPinball.borders.push_back(
Vector2D(libnum::num32(1.0) - offset, flipperHeight - offset));
MyPinball.borders.push_back(Vector2D(offset, flipperHeight - offset));
MyPinball.borders.push_back(Vector2D(offset, libnum::num32(0.4)));
MyPinball.borders.push_back(
Vector2D(libnum::num32(0.26), libnum::num32(0.25)));
MyPinball.borders.push_back(
Vector2D(libnum::num32(0.26), libnum::num32(offset)));
MyPinball.borders.push_back(
Vector2D(libnum::num32(0.74), libnum::num32(offset)));
MyPinball.balls.clear();
libnum::num32 ball_radius = libnum::num32(0.03);
libnum::num32 ball_mass = libnum::num32(PI) * ball_radius * ball_radius;
Vector2D ball_pos1(libnum::num32(0.92), libnum::num32(0.5));
Vector2D ball_vel1(libnum::num32(0.2), libnum::num32(3.5));
MyPinball.balls.push_back(
Ball(ball_radius, ball_mass, ball_pos1, ball_vel1, 0.2));
Vector2D ball_pos2(libnum::num32(0.08), libnum::num32(0.5));
Vector2D ball_vel2(libnum::num32(0.2), libnum::num32(3.5));
MyPinball.balls.push_back(
Ball(ball_radius, ball_mass, ball_pos2, ball_vel2, 0.2));
MyPinball.obstacles.clear();
MyPinball.obstacles.push_back(
Obstacle(0.1, Vector2D(libnum::num32(0.25), libnum::num32(0.6)), 2.0));
MyPinball.obstacles.push_back(
Obstacle(0.1, Vector2D(libnum::num32(0.75), libnum::num32(0.5)), 2.0));
MyPinball.obstacles.push_back(
Obstacle(0.12, Vector2D(libnum::num32(0.7), libnum::num32(1.0)), 2.0));
MyPinball.obstacles.push_back(
Obstacle(0.1, Vector2D(libnum::num32(0.2), libnum::num32(1.2)), 2.0));
MyPinball.flippers.clear();
libnum::num32 flip_radius = libnum::num32(0.03);
libnum::num32 flip_length = libnum::num32(0.2);
libnum::num32 flip_maxRotation = libnum::num32(1.0);
libnum::num32 flip_restAngle = libnum::num32(0.5);
libnum::num32 flip_angularVelocity = libnum::num32(10.0);
libnum::num32 flip_restitution = libnum::num32(0.0);
Vector2D flip_pos1(libnum::num32(0.26), libnum::num32(0.22));
MyPinball.flippers.push_back(Flipper(flip_radius, flip_pos1, flip_length,
-flip_restAngle, flip_maxRotation,
flip_angularVelocity, flip_restitution, LEFT));
Vector2D flip_pos2(libnum::num32(0.74), libnum::num32(0.22));
MyPinball.flippers.push_back(Flipper(
flip_radius, flip_pos2, flip_length, libnum::num32(PI) + flip_restAngle,
-flip_maxRotation, flip_angularVelocity, flip_restitution, RIGHT));
Vector2D flip_pos3(libnum::num32(offset), libnum::num32(1.50));
MyPinball.flippers.push_back(Flipper(flip_radius, flip_pos3, flip_length,
-flip_restAngle, flip_maxRotation,
flip_angularVelocity, flip_restitution, LEFT));
Vector2D flip_pos4(libnum::num32(1.0)-offset, libnum::num32(1.25));
MyPinball.flippers.push_back(Flipper(
flip_radius, flip_pos4, flip_length, libnum::num32(PI) + flip_restAngle,
-flip_maxRotation, flip_angularVelocity, flip_restitution, RIGHT));
}
void Setup_Table_1(void) {
flipperHeight = libnum::num32(2.0);
cScale = libnum::num32(azrp_height) / flipperHeight;
simWidth = libnum::num32(azrp_width) / cScale;
simHeight = libnum::num32(azrp_height) / cScale;
MyPinball.score = 0;
MyPinball.gravity.Set(Vector2D(libnum::num32(0.0), libnum::num32(-0.80)));
MyPinball.pause = true;
MyPinball.borders.clear();
MyPinball.borders.push_back(
Vector2D(libnum::num32(0.74), libnum::num32(0.25)));
MyPinball.borders.push_back(
Vector2D(libnum::num32(0.995), libnum::num32(0.4)));
MyPinball.borders.push_back(
Vector2D(libnum::num32(0.995), libnum::num32(1.4)));
libnum::num arcRadius = libnum::num32(0.5);
libnum::num32 arcStartAngle = libnum::num32(0);
libnum::num32 arcEndAngle = libnum::num32(numPI);
libnum::num32 arcSegments = libnum::num32(11);
libnum::num32 arcAngleStep = (arcEndAngle - arcStartAngle) / arcSegments;
for (int i = 1; i <= (int)arcSegments; i++) {
libnum::num32 angle = arcStartAngle + libnum::num32(i) * arcAngleStep;
MyPinball.borders.push_back(
Vector2D(libnum::num32(0.5) + arcRadius * COS(angle),
libnum::num32(1.375) + arcRadius * SIN(angle)));
}
MyPinball.borders.push_back(Vector2D(libnum::num32(0), libnum::num32(0.4)));
MyPinball.borders.push_back(
Vector2D(libnum::num32(0.26), libnum::num32(0.25)));
MyPinball.borders.push_back(
Vector2D(libnum::num32(0.26), libnum::num32(0.05)));
MyPinball.borders.push_back(
Vector2D(libnum::num32(0.74), libnum::num32(0.05)));
MyPinball.borders.clear();
libnum::num32 offset = libnum::num32(0.02);
MyPinball.borders.push_back(
Vector2D(libnum::num32(0.74), libnum::num32(0.25)));
MyPinball.borders.push_back(
Vector2D(libnum::num32(1.0) - offset, libnum::num32(0.4)));
MyPinball.borders.push_back(
Vector2D(libnum::num32(1.0) - offset, flipperHeight - offset));
MyPinball.borders.push_back(Vector2D(offset, flipperHeight - offset));
MyPinball.borders.push_back(Vector2D(offset, libnum::num32(0.4)));
MyPinball.borders.push_back(
Vector2D(libnum::num32(0.26), libnum::num32(0.25)));
MyPinball.borders.push_back(
Vector2D(libnum::num32(0.26), libnum::num32(offset)));
MyPinball.borders.push_back(
Vector2D(libnum::num32(0.74), libnum::num32(offset)));
MyPinball.balls.clear();
libnum::num32 ball_radius = libnum::num32(0.03);
libnum::num32 ball_mass = libnum::num32(PI) * ball_radius * ball_radius;
Vector2D ball_pos1(libnum::num32(0.92), libnum::num32(0.5));
Vector2D ball_vel1(libnum::num32(0.2), libnum::num32(3.5));
MyPinball.balls.push_back(
Ball(ball_radius, ball_mass, ball_pos1, ball_vel1, 0.2));
Vector2D ball_pos2(libnum::num32(0.08), libnum::num32(0.5));
Vector2D ball_vel2(libnum::num32(0.2), libnum::num32(3.5));
MyPinball.balls.push_back(
Ball(ball_radius, ball_mass, ball_pos2, ball_vel2, 0.2));
MyPinball.obstacles.clear();
MyPinball.obstacles.push_back(
Obstacle(0.04, Vector2D(libnum::num32(0.10), libnum::num32(1.68)), 0.8));
MyPinball.obstacles.push_back(
Obstacle(0.08, Vector2D(libnum::num32(0.50), libnum::num32(1.45)), 1.5));
MyPinball.obstacles.push_back(
Obstacle(0.08, Vector2D(libnum::num32(0.74), libnum::num32(1.20)), 1.5));
MyPinball.obstacles.push_back(
Obstacle(0.08, Vector2D(libnum::num32(0.26), libnum::num32(1.20)), 1.5));
MyPinball.obstacles.push_back(
Obstacle(0.08, Vector2D(libnum::num32(0.50), libnum::num32(0.95)), 1.5));
MyPinball.obstacles.push_back(
Obstacle(0.04, Vector2D(libnum::num32(0.13), libnum::num32(0.80)), 1.5));
MyPinball.obstacles.push_back(
Obstacle(0.04, Vector2D(libnum::num32(0.87), libnum::num32(0.80)), 1.5));
MyPinball.obstacles.push_back(
Obstacle(0.04, Vector2D(libnum::num32(0.15), libnum::num32(0.60)), 1.5));
MyPinball.obstacles.push_back(
Obstacle(0.04, Vector2D(libnum::num32(0.85), libnum::num32(0.60)), 1.5));
MyPinball.flippers.clear();
libnum::num32 flip_radius = libnum::num32(0.035);
libnum::num32 flip_length = libnum::num32(0.175);
libnum::num32 flip_maxRotation = libnum::num32(1.0);
libnum::num32 flip_restAngle = libnum::num32(0.5);
libnum::num32 flip_angularVelocity = libnum::num32(10.0);
libnum::num32 flip_restitution = libnum::num32(0.0);
Vector2D flip_pos1(libnum::num32(0.26), libnum::num32(0.22));
Vector2D flip_pos2(libnum::num32(0.74), libnum::num32(0.22));
MyPinball.flippers.push_back(Flipper(flip_radius, flip_pos1, flip_length,
-flip_restAngle, flip_maxRotation,
flip_angularVelocity, flip_restitution, LEFT));
MyPinball.flippers.push_back(Flipper(
flip_radius, flip_pos2, flip_length, libnum::num32(PI) + flip_restAngle,
-flip_maxRotation, flip_angularVelocity, flip_restitution, RIGHT));
}
#endif

View File

@ -27,6 +27,7 @@ void azrp_draw_text(int x, int y, char const *fmt, ...)
libnum::num32 COS( libnum::num32 angle )
{
float a = (float) angle;
float c = cos( a );
return libnum::num32(c);

View File

@ -4,6 +4,8 @@
#include <num/num.h>
#include <stdint.h>
#define numPI 3.14159265
libnum::num32 sqrt_num32(libnum::num32 v) {
uint32_t t, q, b, r;
r = v.v;
@ -24,56 +26,74 @@ libnum::num32 sqrt_num32(libnum::num32 v) {
return ret;
}
/* TO DO : rework these functions for sine and cosine calculation */
libnum::num32 cos_num32( libnum::num32 angle ) {
libnum::num32 cos_num32(libnum::num32 angle) {
// Taylor serie for cos(x) = 1 - x²/2! + x⁴/4! + x⁶/6! + x⁸/8! + ...
if(angle<libnum::num32(0)) return cos_num32(-angle);
// Cosine function is even
if (angle < libnum::num32(0))
return cos_num32(-angle);
// Look for an angle in the range [0, 2*pi [
libnum::num32 anglereduced = angle;
while (anglereduced >= libnum::num32(2 * numPI))
anglereduced -= libnum::num32(2 * numPI);
// Exploit the symetry for angle and angle+Pi to reduce the order of the
// limited developpement
if (anglereduced >= libnum::num(numPI))
return -cos_num32(anglereduced - libnum::num(numPI));
libnum::num32 sum = libnum::num32(1);
libnum::num32 angle2 = angle*angle;
libnum::num32 angle2 = anglereduced * anglereduced;
// set first value of the Taylor serie : x⁰/0! = 1/1
libnum::num32 numerator = libnum::num32(1);
libnum::num32 numerator = libnum::num32(1);
libnum::num32 denominator = libnum::num32(1);
for(int i=2; i<=8; i+=2 )
{
for (int i = 2; i <= 8; i += 2) {
numerator *= (-angle2);
denominator *= libnum::num32(i-1) * libnum::num32(i);
sum += ( numerator / denominator );
denominator *= libnum::num32(i - 1) * libnum::num32(i);
sum += (numerator / denominator);
}
return sum;
}
libnum::num32 sin_num32( libnum::num32 angle ) {
libnum::num32 sin_num32(libnum::num32 angle) {
// Taylor serie for cos(x) = x/1! - x³/3! + x⁵/5! - x⁷/7! + x⁹/9! + ...
if(angle<libnum::num32(0)) return -sin_num32(-angle);
// Sine function is odd
if (angle < libnum::num32(0))
return -sin_num32(-angle);
libnum::num32 sum = angle;
libnum::num32 angle2 = angle*angle;
// Look for an angle in the range [0, 2*pi [
libnum::num32 anglereduced = angle;
while (anglereduced >= libnum::num32(2 * numPI))
anglereduced -= libnum::num32(2 * numPI);
// Exploit the symetry for angle and angle+Pi to reduce the order of the
// limited developpement
if (anglereduced >= libnum::num(numPI))
return -sin_num32(anglereduced - libnum::num(numPI));
libnum::num32 sum = anglereduced;
libnum::num32 angle2 = anglereduced * anglereduced;
// set first value of the Taylor serie : x¹/1! = x/1
libnum::num32 numerator = angle;
libnum::num32 numerator = anglereduced;
libnum::num32 denominator = libnum::num32(1);
for(int i=2; i<=8; i+=2 )
{
for (int i = 2; i <= 8; i += 2) {
numerator *= (-angle2);
denominator *= libnum::num32(i) * libnum::num32(i+1);
sum += ( numerator / denominator );
denominator *= libnum::num32(i) * libnum::num32(i + 1);
sum += (numerator / denominator);
}
return sum;
}
class Vector2D {
public:
@ -99,14 +119,12 @@ public:
~Vector2D() {}
void Set( Vector2D v )
{
void Set(Vector2D v) {
this->x = v.x;
this->y = v.y;
}
void Normalise( void )
{
void Normalise(void) {
libnum::num32 len = this->Length();
this->x /= len;
this->y /= len;
@ -235,19 +253,20 @@ public:
libnum::num32 y;
};
Vector2D ClosestPointOnSegment(Vector2D P, Vector2D A, Vector2D B ) {
Vector2D ClosestPointOnSegment(Vector2D P, Vector2D A, Vector2D B) {
Vector2D AB = B - A;
libnum::num32 t = AB.Dot(AB);
if (t == 0) return A;
if (t == 0)
return A;
libnum::num32 t2 = (P.Dot(AB) - A.Dot(AB)) / t;
if (t2 < libnum::num32(0)) t2 = libnum::num32(0);
if (t2 > libnum::num32(1)) t2 = libnum::num32(1);
if (t2 < libnum::num32(0))
t2 = libnum::num32(0);
if (t2 > libnum::num32(1))
t2 = libnum::num32(1);
Vector2D C = A.Clone();
C.Add(AB, t2);
@ -255,5 +274,4 @@ Vector2D ClosestPointOnSegment(Vector2D P, Vector2D A, Vector2D B ) {
return C;
}
#endif