Raised This Month: $12 Target: $400
 3% 

Stock de Vectores: Rectas y planos


  
 
 
Thread Tools Display Modes
Author Message
gladius
Veteran Member
Join Date: Jul 2008
Location: Santiago, Chile
Old 08-09-2013 , 00:53   Stock de Vectores: Rectas y planos
#1

Bueno, el día de ayer estuve creando stocks para trabajar con vectores, rectas en el espacio y planos.

Si es bien recibido continuaré con otros stocks más complicados. Puede ser que algunos no les parezcan útiles o que puedan ser sacados a partir de otros, pero yo creo que está bien.

Si quiere que haga algún ejemplo, me dicen y lo agrego.

PHP Code:
#include <xs>....

/* 
bool:get_intersection_plane_and_line(Float:flVec1Line[3], Float:flVec2Line[3], Float:flVecPlane[4]) 

Las partes involucradas es un plano y una recta en el espacio.
Tenemos 2 puntos de la recta(e.g. start y end) y calculamos su Vector Director 
con la dirección correcta por donde va la recta. (Puede ser cualquier punto de la recta)

Tenemos un plano y es determinada por cada valor del vector (flVecPlane[0]x + flVecPlane[1]y + flVecPlane[2]z + flVecPlane[4]
sabiendo eso obtenemos su normal que es el vector de los valores A, B y C. N = (flVecPlane[0], flVecPlane[1], flVecPlane[2])

Y se compara si el Vector Director es igual a la Normal del Plano.
*/
stock Float:get_intersection_plane_and_line(Float:flVec1Line[3], Float:flVec2Line[3], Float:flVecPlane[4]) 
{
    new 
Float:flVecDir[3]
    
xs_vec_sub(flVec2LineflVec1LineflVecDir)

    if(
get_vec_line_and_plane_parallel(flVecDirflVecPlane)) 
    {
        return 
false
    
}
    return 
true
}

stock Float:get_intersection_two_planes(Float:flVecPlane1[4], Float:flVecPlane2[4]) 
{
    if(
get_vec_planes_parallel(flVecPlane1 flVecPlane2))
    {
        return 
false
    
}
    return 
true
}

stock Float:get_intersection_two_lines(Float:flVec1Line1[3], Float:flVec2Line1[3], Float:flVec1Line2[3], Float:flVec2Line2[3]) 
{
    new 
Float:flVecDir1[3], Float:flVecDir2[3]
    
xs_vec_sub(flVec2Line1flVec1Line1flVecDir1)
    
xs_vec_sub(flVec2Line2flVec1Line2flVecDir2)
    
    new 
Float:flVecLine1Line2[3
    
xs_vec_sub(flVec1Line2flVec1Line1flVecLine1Line2)
    
    new 
Float:flVecDirCross[3
    
xs_vec_cross(flVecDir1flVecDir2flVecDirCross

    if(
xs_vec_dot(flVecDirCrossflVecLine1Line2))
    {
        return 
true
    
}
    return 
false
}

stock Float:get_plane_by_points(Float:flVecPoint1[3], Float:flVecPoint2[3], Float:flVecPoint3[3], Float:flVecPlane[4]) 
{
    new 
Float:flVecPoint1Point2[3], Float:flVecPoint1Point3[3]
    
xs_vec_sub(flVecPoint1flVecPoint2flVecPoint1Point2)
    
xs_vec_sub(flVecPoint1flVecPoint3flVecPoint1Point3)
    
    new 
Float:flVecDirCross[3
    
xs_vec_cross(flVecPoint1Point2flVecPoint1Point3flVecDirCross
    
    
xs_vec_copy(flVecDirCrossflVecPlane)
    
flVecPlane[3] = -(xs_vec_dot(flVecDirCrossflVecPoint1))
}

stock Float:get_dist_point_and_plane(Float:flVecPoint1[3], Float:flVecPlane[4]) 
{
    return (
xs_vec_dot(flVecPoint1flVecPlane) + flVecPlane[3]) / xs_vec_len(flVecPlane)
}

stock Float:get_dist_planes(Float:flVecPlane1[4], Float:flVecPlane2[4]) 
{
    new 
Float:flVecPlane1Plane2[3]
    
xs_vec_sub(flVecPlane1flVecPlane2flVecPlane1Plane2)
    
    if(
get_vec_planes_parallel(flVecPlane1flVecPlane2true)
    {
        return (
flVecPlane1[3] - flVecPlane2[3]) / floatsqroot(xs_vec_len(flVecPlane1Plane2))
    }
    return 
0;
}

stock Float:get_dist_points(Float:flVecPoint1[3], Float:flVecPoint2[3]) 
{
    new 
Float:flVecPoint1Point2[3]
    
xs_vec_sub(flVecPoint2flVecPoint1flVecPoint1Point2)
    
    return 
floatsqroot(xs_vec_len(flVecPoint1Point2))
}

stock Float:get_dist_point_and_line(Float:flVecPoint[3], Float:flVec1Line[3], Float:flVec2Line[3]) 

    new 
Float:flVecDir[3]
    
xs_vec_sub(flVec2LineflVec1LineflVecDir)
    
    new 
Float:flVecPointLine[3
    
xs_vec_sub(flVecPointflVec1LineflVecPointLine)
    
    new 
Float:flVecDirCross[3
    
xs_vec_cross(flVecDir1flVecPointLineflVecDirCross
        
    return 
xs_vec_len(flVecDirCross) / xs_vec_len(flVecDir1
}

stock Float:get_dist_two_lines(Float:flVec1Line1[3], Float:flVec2Line1[3], Float:flVec1Line2[3], Float:flVec2Line2[3]) 

    new 
Float:flVecDir1[3], Float:flVecDir2[3]
    
xs_vec_sub(flVec2Line1flVec1Line1flVecDir1)
    
xs_vec_sub(flVec2Line2flVec1Line2flVecDir2)
    
    new 
Float:flVecLine1Line2[3
    
xs_vec_sub(flVec1Line2flVec1Line1flVecLine1Line2)
    
    new 
Float:flVecDirCross[3
    if(
get_vec_lines_parallel(flVecDir1vecDir2)) 
    {         
        
xs_vec_cross(flVecLine1Line2flVecDir1flVecDirCross
        
        return 
xs_vec_len(flVecDirCross) / xs_vec_len(flVecDir1
    } 
    
xs_vec_cross(flVecDir1flVecDir2flVecDirCross
    
    new 
FloatflDet fabs(get_line_determinant_order3(flVecLine1Line2flVecDir1flVecDir2))
    
    return 
flDet xs_vec_len(flVecDirCross)
}

stock bool:get_vec_lines_parallel(Float:flVecLine1[3], Float:flVecLine2[3])
{
    
xs_vec_set(flVecLine1fabs(flVecLine1[0]), fabs(flVecLine1[1]), fabs(flVecLine1[2]))
    
xs_vec_set(flVecLine2fabs(flVecLine2[0]), fabs(flVecLine2[1]), fabs(flVecLine2[2]))
    
    return (
xs_vec_equal(flVecLine1flVecLine2)
}

stock bool:get_vec_line_and_plane_parallel(Float:flVecLine[3], Float:flVecPlane[4])
{
    new 
flVecNormal[3]
    
get_vec_normal_plane(flVecPlaneflVecNormal);
    
    if(
xs_vec_dot(flVecNormalflVecLine))
    {
        return 
true
    
}
    return 
false
}

/* 
bool:get_vec_planes_parallel(Float:flVecPlane1[4], Float:flVecPlane2[4], nocoincident = false)

Para obtener la intersección de estas se verifica que los cocientes entre sus componentes homólogas son iguales. (A1/A2, B1/B2, C1/C2)
*/
stock bool:get_vec_planes_parallel(Float:flVecPlane1[4], Float:flVecPlane2[4], nocoincident false)
{
    new 
Float:flVecPlanesDiv[3]
    
xs_vec_set(flVecPlanesDivfabs(flVecPlane1[0]/flVecPlane2[0]), fabs(flVecPlane1[1]/flVecPlane2[1]), fabs(flVecPlane1[2]/flVecPlane2[2]))
    
    if(
nocoincident)
    {
        return (
get_vec_equal(flVecPlanesDiv) && flVecPlane1[3] != flVecPlane2[3])
    }
    return 
get_vec_equal(flVecPlanesDiv) && flVecPlane1[3]
}

stock get_vec_normal_point(Float:flVecPoint[3], Float:flVecNormalPoint[3])
{
    new 
Float:flInvLen 1.0 floatsqroot(xs_vec_len(flVecPoint))
    
xs_vec_mul_scalar(flVecPointflInvLenflVecNormalPoint)
}

stock get_vec_normal_plane(Float:flVecPlane[4], Float:flVecNormalPoint[3])
{
    
xs_vec_copy(flVecPlaneflVecNormalPoint)
}

stock get_line_determinant_order3(Float:flVecPoint1[3], Float:flVecPoint2[3], Float:flVecPoint3[3])
{
    new 
Float:flFirstDiagonal = (flVecPoint1[0] * flVecPoint2[1] * flVecPoint3[2])
    
flFirstDiagonal+= (flVecPoint1[1] * flVecPoint2[2] * flVecPoint3[0])
    
flFirstDiagonal+= (flVecPoint1[2] * flVecPoint2[0] * flVecPoint3[1])
    
    new 
Float:flSecondDiagonal = (flVecPoint1[2] * flVecPoint2[1] * flVecPoint3[0])
    
flSecondDiagonal+= (flVecPoint1[1] * flVecPoint2[0] * flVecPoint3[2])
    
flSecondDiagonal+= (flVecPoint1[0] * flVecPoint2[2] * flVecPoint3[1])
    
    return 
flFirstDiagonal flSecondDiagonal;
}

stock get_vec_equal(Float:flVecPoint[3])
{
    if(
flVecPoint[0] == flVecPoint[1] && flVecPoint[0] == flVecPoint[2])
    {
        return 
true;
    }
    return 
false;

Si necesitan otras funciones relacionadas con vectores me avisan para ayudarles y si es posible agregarlas acá.
__________________
Proyects
Kreedz Chile Mod [100%] (Fixing some details).


Last edited by gladius; 08-10-2013 at 14:14.
gladius is offline
Send a message via MSN to gladius Send a message via Skype™ to gladius
DiegoCS
Senior Member
Join Date: Mar 2013
Old 08-09-2013 , 06:17   Re: Stocks de rectas y planos
#2

piolas.. da ejemplos .
DiegoCS is offline
Destro-
Veteran Member
Join Date: Jun 2010
Location: $me->location();
Old 08-09-2013 , 11:22   Re: Stocks de rectas y planos
#3

Podrías agregar un coment corto de lo que hace,aunque el nombre lo dice casi todo ja.

Me viene de 10 para unas cosas que quiero hacer con las lasermines
__________________

Last edited by Destro-; 08-09-2013 at 11:22.
Destro- is offline
Desktop
AlliedModders Donor
Join Date: Sep 2009
Location: C:\Users\Default\
Old 08-09-2013 , 12:39   Re: Stocks de rectas y planos
#4

Quote:
Originally Posted by Destro- View Post
Podrías agregar un coment corto de lo que hace,aunque el nombre lo dice casi todo ja.

Me viene de 10 para unas cosas que quiero hacer con las lasermines
Sí, agregá un comentario en cada uno para darnos una mayor idea de las func.
Gracias por el aporte, muy interesante
__________________
Massive Infection:: Piu-Games
Desktop is offline
Roccoxx
AlliedModders Donor
Join Date: Jan 2012
Location: Argentina
Old 08-09-2013 , 12:47   Re: Stocks de rectas y planos
#5

porque el primer stock devuelve siempre false
__________________
Tutorials here (Spanish)

Like as another Pijudo said: "Tired and retired"
Roccoxx is offline
Send a message via MSN to Roccoxx
MexPower
Veteran Member
Join Date: Nov 2012
Old 08-09-2013 , 16:06   Re: Stocks de rectas y planos
#6

Quote:
Originally Posted by Roccoxx View Post
porque el primer stock devuelve siempre false
Es lo que pense, y la verdad ni puta idea de cuando usar esos stocks
__________________
Allied Modders En Español
MexPower is offline
gladius
Veteran Member
Join Date: Jul 2008
Location: Santiago, Chile
Old 08-09-2013 , 17:51   Re: Stocks de rectas y planos
#7

Quote:
Originally Posted by Destro- View Post
Podrías agregar un coment corto de lo que hace,aunque el nombre lo dice casi todo ja.

Me viene de 10 para unas cosas que quiero hacer con las lasermines
Quote:
Originally Posted by Desktop View Post
Sí, agregá un comentario en cada uno para darnos una mayor idea de las func.
Gracias por el aporte, muy interesante
A esto me refería con continuar si hay interés, hoy más tarde agregaré comentarios a las funciones y unos ejemplos de como usarlo. Saludos.

Quote:
Originally Posted by Roccoxx View Post
porque el primer stock devuelve siempre false
Perdón corregido, copié el return completo y me olvidé de cambiarlo jajaja
__________________
Proyects
Kreedz Chile Mod [100%] (Fixing some details).


Last edited by gladius; 08-09-2013 at 17:52.
gladius is offline
Send a message via MSN to gladius Send a message via Skype™ to gladius
meTaLiCroSS
Gaze Upon My Hat
Join Date: Feb 2009
Location: Viña del Mar, Chile
Old 08-09-2013 , 19:04   Re: Stocks de rectas y planos
#8

get_intersection_two_lines tiene de tag float cuando devuelve bool D:
__________________
Quote:
Originally Posted by joropito View Post
You're right Metalicross
meTaLiCroSS is offline
gladius
Veteran Member
Join Date: Jul 2008
Location: Santiago, Chile
Old 08-09-2013 , 19:34   Re: Stocks de rectas y planos
#9

Arreglado, gracias. Errores de cuando hago copy & paste de los encabezados y no me fijo bien
__________________
Proyects
Kreedz Chile Mod [100%] (Fixing some details).


Last edited by gladius; 08-09-2013 at 19:34.
gladius is offline
Send a message via MSN to gladius Send a message via Skype™ to gladius
Roccoxx
AlliedModders Donor
Join Date: Jan 2012
Location: Argentina
Old 08-10-2013 , 13:29   Re: Stocks de rectas y planos
#10

ahi lo agregue en la recopilacion de tutoriales.

me vienen re bien para una super arma que estoy haciendo jeje.
__________________
Tutorials here (Spanish)

Like as another Pijudo said: "Tired and retired"
Roccoxx is offline
Send a message via MSN to Roccoxx
 


Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 06:09.


Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Theme made by Freecode