home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 1997 March
/
VPR9703A.ISO
/
VPR_DATA
/
DOGA
/
SOURCES
/
POLYEDIT.LZH
/
MATLIB
/
SETVEC.C
< prev
next >
Wrap
C/C++ Source or Header
|
1996-05-22
|
9KB
|
376 lines
/*
* ベクトル演算ライブラリ
*
* 1994.6.5 Copyright T.Kobayashi
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <assert.h>
#include "lib.h"
#include "_matclas.h"
#include "inlib.h"
extern int MatrixClassID ;
int VectorClassID ;
extern double ToDouble( DataStruct* );
static int VectorToString( int, int, DataStruct* );
static int SysVector( int, int, DataStruct* );
static int SysVecUnit( int, int, DataStruct* );
static int SysVecX( int, int, DataStruct* );
static int SysVecY( int, int, DataStruct* );
static int SysVecZ( int, int, DataStruct* );
static int SysVecAbs( int, int, DataStruct* );
static int SysVecElement( int, int, DataStruct* );
static int SysScalPro( int, int, DataStruct* );
static int SysVecPro( int, int, DataStruct* );
static int SysVecAdd( int, int, DataStruct* );
static int SysVecMultMat( int, int, DataStruct* );
static int SysMinus( int, int, DataStruct* );
static int SysVecEqual( int, int, DataStruct* );
VectorClass *StackAllocVector( buf )
DataStruct *buf ;
{
DataStruct *top ;
top = StackAlloc( 1 );
top->type = TYPE_OBJECT ;
top->od.ptr = ObjectDup( buf->od.ptr );
return (VectorClass*)top->od.ptr ;
}
void InitVectorLibrary()
{
VectorClassID = NewClass( "Vector", 0 );
NewFunction( 0, "vector", SysVector );
NewFunction( VectorClassID, "tostring", VectorToString );
NewFunction( VectorClassID, "unit", SysVecUnit );
NewFunction( VectorClassID, "vx", SysVecX );
NewFunction( VectorClassID, "vy", SysVecY );
NewFunction( VectorClassID, "vz", SysVecZ );
NewFunction( VectorClassID, "element", SysVecElement );
NewFunction( VectorClassID, "abs", SysVecAbs );
NewOperator( VectorClassID, OPE_DOT, SysScalPro );
NewOperator( VectorClassID, OPE_MULT, SysVecPro );
NewOperator( VectorClassID, OPE_PLUS, SysVecAdd );
NewOperator( VectorClassID, OPE_MINUS, SysVecAdd );
NewOperator( VectorClassID, OPE_MINUS1, SysMinus );
NewOperator( VectorClassID, OPE_EQ, SysVecEqual);
NewOperator( VectorClassID, OPE_NOTEQ, SysVecEqual);
}
/* 表示 */
static int VectorToString( ident, args, buf )
int ident ;
int args ;
DataStruct *buf ;
{
char str[256] ;
VectorClass *v ;
assert( buf->type == TYPE_OBJECT );
v = (VectorClass*)buf->od.ptr ;
sprintf( str, "( %8.4f, %8.4f, %8.4f )", v->vec.x, v->vec.y, v->vec.z );
buf = StackAlloc( 1 );
StringToObject( buf, str );
return RETURN_RETURN ;
}
/* ベクトルを得る */
static int SysVector( ident, args, buf )
int ident ;
int args ;
DataStruct *buf ;
{
extern int ToVector(int args, DataStruct *buf, Vector* vec);
VectorClass *vec ;
Vector v;
#if 0
ArgCheck( "vector", args, buf,
TYPE_INT|TYPE_REAL, TYPE_INT|TYPE_REAL, TYPE_INT|TYPE_REAL, TYPE_NOASN );
vec = (VectorClass*)ObjectAlloc( sizeof( VectorClass ), VectorClassID );
vec->vec.x = ToDouble( &buf[0] );
vec->vec.y = ToDouble( &buf[1] );
vec->vec.z = ToDouble( &buf[2] );
#endif
if (ToVector(args, buf, &v) == 0) {
ExecError( "引数の型が不正です。(Vector:vector)" );
}
vec = (VectorClass*)ObjectAlloc( sizeof( VectorClass ), VectorClassID );
vec->vec = v;
buf = StackAlloc( 1 );
buf->type = TYPE_OBJECT ;
buf->od.ptr = (Object*)vec ;
return RETURN_RETURN ;
}
/* 正規化 */
static int SysVecUnit( ident, args, buf )
int ident ;
int args ;
DataStruct *buf ;
{
VectorClass *v ;
ArgCheck( "unit", args, buf, TYPE_OBJECT, TYPE_NOASN );
v = StackAllocVector( &buf[0] );
VecUnit( &v->vec );
return RETURN_RETURN ;
}
/* 成分を返す */
static int SysVecX( ident, args, buf )
int ident ;
int args ;
DataStruct *buf ;
{
VectorClass *v ;
assert( buf[0].type == TYPE_OBJECT );
v = (VectorClass*)buf[0].od.ptr ;
StackPushReal( v->vec.x );
return RETURN_RETURN ;
}
static int SysVecY( ident, args, buf )
int ident ;
int args ;
DataStruct *buf ;
{
VectorClass *v ;
assert( buf[0].type == TYPE_OBJECT );
v = (VectorClass*)buf[0].od.ptr ;
StackPushReal( v->vec.y );
return RETURN_RETURN ;
}
static int SysVecZ( ident, args, buf )
int ident ;
int args ;
DataStruct *buf ;
{
VectorClass *v ;
assert( buf[0].type == TYPE_OBJECT );
v = (VectorClass*)buf[0].od.ptr ;
StackPushReal( v->vec.z );
return RETURN_RETURN ;
}
/* 各要素を得る */
static int SysVecElement( ident, args, buf )
int ident ;
int args ;
DataStruct *buf ;
{
VectorClass *v ;
ArgCheck( "Vector", args, buf, TYPE_OBJECT, TYPE_ARRAY, TYPE_NOASN );
if ( buf[1].ad.size < 3 )
ExecError( "引数配列のサイズが不正です。(Vector:element)" );
v = (VectorClass*)buf[0].od.ptr ;
buf = buf[1].ad.ary ;
buf[0].type = buf[1].type = buf[2].type = TYPE_REAL ;
buf[0].rd.r = v->vec.x ;
buf[1].rd.r = v->vec.y ;
buf[2].rd.r = v->vec.z ;
return RETURN_VOID ;
StackPushReal( VecAbs( &v->vec ) );
return RETURN_RETURN ;
}
/* 長さを得る */
static int SysVecAbs( ident, args, buf )
int ident ;
int args ;
DataStruct *buf ;
{
VectorClass *v ;
assert( buf[0].type == TYPE_OBJECT );
v = (VectorClass*)buf[0].od.ptr ;
StackPushReal( VecAbs( &v->vec ) );
return RETURN_RETURN ;
}
/* スカラー積 */
static int SysScalPro( ident, args, buf )
int ident ;
int args ;
DataStruct *buf ;
{
VectorClass *v1, *v2 ;
assert( buf[0].type == TYPE_OBJECT );
v1 = (VectorClass*)buf[0].od.ptr ;
if ( ObjectCheck( &buf[1], VectorClassID ) )
{
v2 = (VectorClass*)buf[1].od.ptr ;
StackPushReal( ScalPro( &v1->vec, &v2->vec ) );
}
else if ( ObjectCheck( &buf[1], MatrixClassID ) )
{
SysVecMultMat( ident, args, buf );
}
else
{
ExecError( "型が不正です。(演算子.)" );
}
return RETURN_RETURN ;
}
/* ベクトル積 */
static int SysVecPro( ident, args, buf )
int ident ;
int args ;
DataStruct *buf ;
{
VectorClass *ret, *v1, *v2 ;
assert( buf[0].type == TYPE_OBJECT );
if ( ObjectCheck( &buf[1], VectorClassID ) )
{
ret = (VectorClass*)ObjectAlloc( sizeof( VectorClass ), VectorClassID );
v1 = (VectorClass*)buf[0].od.ptr ;
v2 = (VectorClass*)buf[1].od.ptr ;
VecPro( &ret->vec, &v1->vec, &v2->vec );
buf = StackAlloc( 1 );
buf->type = TYPE_OBJECT ;
buf->od.ptr = (Object*)ret ;
}
else if ( ObjectCheck( &buf[1], MatrixClassID ) )
{
SysVecMultMat( ident, args, buf );
}
else if ( buf[1].type & (TYPE_INT|TYPE_REAL) )
{
v1 = StackAllocVector( &buf[0] );
VecMult( &v1->vec, &v1->vec, ToDouble( &buf[1] ) );
}
else
{
ExecError( "型が不正です。(演算子*)" );
}
return RETURN_RETURN ;
}
static int SysVecAdd( ident, args, buf )
int ident ;
int args ;
DataStruct *buf ;
{
VectorClass *v1, *v2 ;
assert( buf[0].type == TYPE_OBJECT );
if ( ObjectCheck( &buf[1], VectorClassID ) )
{
v1 = StackAllocVector( &buf[0] );
v2 = (VectorClass*)buf[1].od.ptr ;
switch( ident )
{
case OPE_PLUS:
VecAdd( &v1->vec, &v1->vec, &v2->vec );
break ;
case OPE_MINUS:
VecSub( &v1->vec, &v1->vec, &v2->vec );
break ;
default:
assert( FALSE );
}
}
return RETURN_RETURN ;
}
static int SysVecMultMat( ident, args, buf )
int ident ;
int args ;
DataStruct *buf ;
{
int i ;
VectorClass *v ;
MatrixClass *m ;
float r[3] ;
m = (MatrixClass*)buf[1].od.ptr ;
v = StackAllocVector( &buf[0] );
for( i = 0 ; i < 3 ; i++ )
{
r[i] = v->vec.x * m->mat[0][i] +
v->vec.y * m->mat[1][i] +
v->vec.z * m->mat[2][i] +
m->mat[3][i] ;
}
v->vec.x = r[0] ;
v->vec.y = r[1] ;
v->vec.z = r[2] ;
return RETURN_RETURN ;
}
static int SysMinus( ident, args, buf )
int ident ;
int args ;
DataStruct *buf ;
{
VectorClass *v;
v = StackAllocVector( &buf[0] );
v->vec.x = -v->vec.x;
v->vec.y = -v->vec.y;
v->vec.z = -v->vec.z;
return RETURN_RETURN ;
}
static int SysVecEqual( ident, args, buf )
int ident ;
int args ;
DataStruct *buf ;
{
VectorClass *v1, *v2 ;
int flag;
assert( buf[0].type == TYPE_OBJECT );
if ( ObjectCheck( &buf[1], VectorClassID ) )
{
v1 = (VectorClass*)buf[0].od.ptr;
v2 = (VectorClass*)buf[1].od.ptr ;
flag = (v1->vec.x == v2->vec.x)
&& (v1->vec.y == v2->vec.y)
&& (v1->vec.z == v2->vec.z);
switch( ident )
{
case OPE_EQ:
StackPushBoolean( flag );
break ;
case OPE_NOTEQ:
StackPushBoolean( !flag );
break ;
default:
assert( FALSE );
}
return RETURN_RETURN;
}
return RETURN_VOID;
}