Raised This Month: $ Target: $400
 0% 

Stock de Vectores: Rectas y planos


  
 
 
Thread Tools Display Modes
Prev Previous Post   Next Post Next
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
 



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:58.


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