NAME: DEFINITION: RETURN: DESCRIPTION: MEMBERVARIABLE: MEMBERFUNCTION: OPERATOR: REFERENCE:
NAME:SRF-FORMAT DESCRIPTION: SRF format is a simple polygon model format. Actually, when I designed this format, I thought that I should call it PLG format because it's polygon data. But I decided not to use PLG because it may be too general. I'm sure there are many different kinds of PLG formats. I've never seen SRF. I think my decision was right. In SRF file, you have to write SURF at the top. (Without preceeding spaces. I put four spaces just for indentation). You can define a vertex by writing V x y z or V x y z R If you put R, it means that the object must be drawn smoothly over this vertex. But, YsClass library simply ignore R option. Each vertices has IDs. Id begin with 0. First appeared vertex has an ID of 0. Next one has an ID of 1. Then, 2,3,4.... After defining vertices, polygons must be defined. A polygon is defined as follows. F C col N cx cy cz nx ny nz V vtId vtId vtId vtId ..... E F tells that a definition of polygon begins with this line. C defines color. The parameter <col> is a 15 bit color. If you have 8 bit scale RGB color (each component is 0 through 255), <col> is calculated as col=(((G>>3)<<10)|((R>>3)<<5)|(B>>3)); or col=((G/8)*1024)+((R/8)*32)+(B/8); Green component comes to the top most bits. N defines the gravity center of the polygon and the normal of the polygon. (cx,cy,cz) is the gravity center of the polygon (average of vertices). (nx,ny,nz) is the normal of the polygon. The normal vector must go toward the outside of the object. If the normal is zero, the polygon is two sided polygon. But, if the object has one or more two sided polygon, boolean operation becomes invalid. V defines the vertices by IDs. After defining polygons, you should put one more E at the end of the file. eg.) Cube SURF V -6.0 -6.0 -6.0 R V 6.0 -6.0 -6.0 R V -6.0 6.0 -6.0 R V 6.0 6.0 -6.0 R V -6.0 -6.0 6.0 R V 6.0 -6.0 6.0 R V -6.0 6.0 6.0 R V 6.0 6.0 6.0 R F C 31 N 0.0 0.0 -6.0 0.0 0.0 -1.0 V 0 1 3 2 E F C 31 N 0.0 0.0 6.0 0.0 0.0 1.0 V 6 7 5 4 E F C 31 N 0.0 -6.0 0.0 0.0 -1.0 0.0 V 4 5 1 0 E F C 31 N 6.0 0.0 0.0 1.0 0.0 0.0 V 5 7 3 1 E F C 31 N 0.0 6.0 0.0 0.0 1.0 0.0 V 7 6 2 3 E F C 31 N -6.0 0.0 0.0 -1.0 0.0 0.0 V 6 4 0 2 E E REFERENCE:
NAME:YSBOOL NAME:YSTRUE NAME:YSFALSE DEFINITION: typedef enum { YSFALSE, YSTRUE } YSBOOL; DESCRIPTION: Macro represents boolean, true or false. REFERENCE:
NAME:YSBOOLEANOPERATION NAME:YSBOOLBLEND NAME:YSBOOLAND NAME:YSBOOLOR NAME:YSBOOLMINUS DEFINITION: typedef enum { YSBOOLBLEND, YSBOOLAND, YSBOOLOR, YSBOOLMINUS } YSBOOLEANOPERATION; DESCRIPTION: Macro represents boolean operation type. REFERENCE:
NAME:YSCONVEXNIZESTRATEGY NAME:YSCONVEXNIZEDEFAULT NAME:YSCONVEXNIZENOSMALLANGLE NAME:YSCONVEXNIZE90DEGREE NAME:YSCONVEXNIZEFASTEST DEFINITION: typedef enum { YSCONVEXNIZEDEFAULT, YSCONVEXNIZENOSMALLANGLE, YSCONVEXNIZE90DEGREE, YSCONVEXNIZEFASTEST } YSCONVEXNIZESTRATEGY; DESCRIPTION: Macro represents convexnize/tessellation(trianglize) strategy. YSCONVEXNIZENOSMALLANGLE Try to maximize the smallest angle YSCONVEXNIZE90DEGREE Try to make all angles close to 90 degree. YSCONVEXNIZEFASTEST Just care the calculation speed. This macro is used in some member functions of YsSword class. YsSword is used to cut a polygon into pieces, into triangles or into convex polygons. (See also YsSword) REFERENCE:
NAME:YSCOORDSYSMODEL NAME:YSLEFT_ZPLUS_YPLUS NAME:YSRIGHT_ZMINUS_YPLUS NAME:YSBLUEIMPULSE NAME:YSOPENGL DEFINITION: typedef enum { YSLEFT_ZPLUS_YPLUS, YSRIGHT_ZMINUS_YPLUS } YSCOORDSYSMODEL; #define YSBLUEIMPULSE YSLEFT_ZPLUS_YPLUS #define YSOPENGL YSRIGHT_ZMINUS_YPLUS DESCRIPTION: Macro represents Coordinate System Model. YSLEFT_ZPLUS_YPLUS means left hand coordinate system, Z positive direction as forward and Y positive direction as upward. This is Blue Impulse 3DG-SDK standard. (http://member.nifty.ne.jp/ysdynamics/impulse/impulse.html) YSRIGHT_ZMINUS_YPLUS means right hand coordinate system, Z negative direction as forward and Y positive direction as upward. This is OpenGL standard. You can also use YSBLUEIMPULSE instead of YSLEFT_ZPLUS_YPLUS and YSOPENGL instead of YSRIGHT_ZMINUS_YPLUS. You can switch left hand coordinate system or right hand coordinate system by setting one of these values into the global variable, YsCoordSysModel. This will affect coordinate system dependent functions/classes like YsAtt3 and YsCheckFlipDirection3. REFERENCE:
NAME:YSFLIPDIRECTION NAME:YSFLIPCW NAME:YSFLIPCCW NAME:YSLIPUNKNOWN DEFINITION: typedef enum { YSFLIPCCW, YSFLIPCW, YSFLIPUNKNOWN } YSFLIPDIRECTION; DESCRIPTION: This macro is used to return a flip direction of a polygon. YSFLIPCCW Conterclockwise YSFLIPCW Clockwise YSFLIPUNKNOWN Unknown (Failed to calculate.) YsCheckFlipDirection3 is coordinate system dependent. (See YsCoordSysModel and YSCOORDSYSMODEL for more information) REFERENCE:
NAME:YSINTERSECTION NAME:YSINTERSECT NAME:YSOVERLAP NAME:YSTOUCH NAME:YSSHAREPOINT NAME:YSAPART DEFINITION: typedef enum { YSINTERSECT, YSOVERLAP, YSTOUCH, YSSHAREPOINT, YSAPART } YSINTERSECTION; DESCRIPTION: Macro represents intersection. The meaning of the macro is: YSINTERSECT Two objects are intersecting YSOVERLAP Two objects are overlapped YSTOUCH Two objects are touching YSSHAREPOINT Two objects are sharing more than one point YSAPART Two objects are apart REFERENCE:
NAME:YSRESULT NAME:YSOK NAME:YSERR DEFINITION: typedef enum { YSOK, YSERR } YSRESULT; DESCRIPTION: Macro represents No-error or error. If the function returnes YSRESULT, the function will return YSOK when no error, or will return YSERR when error occured. REFERENCE:
NAME:YSSIDE NAME:YSINSIDE, NAME:YSOUTSIDE, NAME:YSBOUNDARY, NAME:YSUNKNOWNSIDE DEFINITION: typedef enum { YSINSIDE, YSOUTSIDE, YSBOUNDARY, YSUNKNOWNSIDE } YSSIDE; DESCRIPTION: Macro represents inside,outside or on boundary. Inside/Outside checking functions will return one of YSINSIDE,YSOUTSIDE,YSBOUNDARY or YSUNKNOWNSIDE. Sometimes those calculation fails because of invalid geometry. Typical invalid geometry is self-intersection or twisted polygon. In such cases, a function will return YSUNKNOWNSIDE. REFERENCE:
NAME:YsAbs DEFINITION: #define YsAbs(A) ((A)>=0 ? (A) : -(A)) DESCRIPTION: Get an absolute value. REFERENCE:
NAME:YsArguments DEFINITION: YSRESULT YsArguments(int *AC,char *AV[],int MXAC,char SRC[]); RETURN: YSOK Successfully separated a string into arguments YSERR Failed DESCRIPTION: This function will separate an input string SRC into a sequence of command arguments. The string SRC is not conserved. This function cares double quote. Specify the length of AV to MXAC. Number of arguments will set to *AC. Arguments can be refered by AV[0...]. For example, char str[256]; strcpy(str,"My bicycle runs about Mach 0.03"); int ac; char *av[16]; YsArguments(&ac,av,16,str); This case, av[0] through av[5] will point to: av[0] -> "My" av[1] -> "bicycle" av[2] -> "runs" av[3] -> "about" av[4] -> "Mach" av[5] -> "0.03" The string str is not conserved. REFERENCE:
NAME:YsArray DEFINITION: template <class T> class YsArray DESCRIPTION: A template class to maintain an array. This function is considered better for small class T. If T is a large class, I recommend to use YsList. MEMBERFUNCTION: YsArray(); Constructor. Number of item is set to zero. YsArray(int NI,const T I[]); Constructor with setting number of items and items. YsArray(const YsArray <T> &FROM); Copy constructor. virtual ~YsArray(); Destructor. Allocated memory block is automatically deleted. YSRESULT Set(int NV,const T V[]); Set an array. Previous array is automatically discarded. inline YSRESULT SetItem(int IDX,const T &ITEM) Set an item to an array. IDX must be: 0 <= IDX < NITEM {NITEM : The number of item contained in this array.} inline const int GetNumItem(void) const Get the number of item contained in this array. inline const T &v(int IDX) const inline const T &GetItem(int IDX) const Get an item in this array. IDX must be: 0 <= IDX < NITEM {NITEM : The number of item contained in this array.} inline const T *GetArray(void) const Get a pointer to the array. CAUTION:The pointer may become invalid after you added a new item to the array. YSRESULT AppendItem(const T &dat); Add an item to the end of this array. OPERATOR: const YsArray <T> &operator=(const YsArray <T> &FROM); Copy operator from different array. You can use operator= safely. (As long as there're enough memory space.) const YsArray <T> &operator=(YsList <T> *FROM); Copy operator from a YsList class. This operator automatically converts a list object FROM into an array. REFERENCE:
NAME:YsAtt3 DESCRIPTION: Attitude class. An attitude is described with three angles which consists of Heading,Pitching and Bank angles. Or the other way to describe an attitude is use two vectors, forward vector and up vector. (Forward vector is also called as eye vector or viewing vector). The former is Euler angle representation, and the latter is vector representation. Using this class, you can go back and forth between Euler angle representation and vector representation. This capability has big power to control an attitude (eg. camera angle). This class will also calculate a rotation matrix corresponds to this attitude. This class is coordinate system dependent. The coordinate system model is specified by macro YSCOORDSYSMODEL and the global variable YsCoordSysModel. MEMBERFUNCTION: YsAtt3(); Constructor WITHOUT initialization YsAtt3(double H,double P,double B); Constructor WITH initialization. inline double h(void) const Return heading angle. inline double p(void) const Return pitching angle inline double b(void) const Return bank angle void Set(double H,double P,double B); Set an attitude by Heading,Pitching and Bank angle. void SetH(double H); Set Heading angle only. void SetP(double P); Set Pitching angle only. void SetB(double B); Set Bank anle only. YsVec3 GetForwardVector(void) const; Get Forward Vector. YsVec3 GetUpVector(void) const; Get Up Vector. YSRESULT SetTwoVector(const YsVec3 &FWD,const YsVec3 &UP); Set an attitude by forward vector and up vector. YSRESULT SetForwardVector(const YsVec3 &VEC); Set an attitude by foward vector only. Can specify Heading and Pitching angles only. Bank angle will become zero. YSRESULT SetUpVector(const YsVec3 &VEC); Modify the attitude by up vector. This function will affect Bank angle only. (This function just modify Bank angle. It is available after Heading and Pitching angles are set). void NoseUp(double D); Nose up by the angle of d. (Imagine that you are pulling a joystick of an airplane). Nose down to specify d as negative value. void YawLeft(double D); Turn Left by the angle of d. (Imagine that you are applying left rudder of an airplane). Turn right to specify d as negative value. const YsMatrix4x4 &GetMatrix(void) const; Get an matrix corresponds to this attitude. (This matrix will transform a YsVec3 from local coordinate system to global coordinate system. If you have to convert from global coordinate system to local coordinate system, take inverse matrix.) OPERATOR: REFERENCE:
NAME:YsBlendShell DEFINITION: YSRESULT YsBlendShell (YsShell &NEWSHELL, const YsShell &SH0, const YsShell &SH1, YSBOOLEANOPERATION BOOL=YSBOOLBLEND); RETURN: YSOK Successfully blended YSERR Failed DESCRIPTION: This function blends two shells, SH0 and SH1. Not only blending, this function also can perform boolean operations, OR(UNION), MINUS(DIFFERENCE) and AND(INTERSECTION). You can specify the type of boolean operation by the parameter BOOL. The value of BOOL can be chosen from: YSBOOLBLEND YSBOOLAND YSBOOLOR YSBOOLMINUS YSBOOLBLEND just blends two shells. All intersecting polygons are slashed along intersecting lines. YSBOOLAND takes the intersecting part of two shells. YSBOOLOR adds two shells into one shell. All unnecessary polygons ,those are inside the new shell, are eliminated. YSBOOLMINUS will subtract SH1 from SH0. All operations other than YSBOOLBLEND does not work if one or both of two shells are not solid. The result is set to NEWSHELL. This function does not inherit freeAttributes of SH0 and Sh1 to NEWSHELL. Instead, you can know which polygons/vertices are come from which shell by refering to freeAttributes. YsShellPolygon in NEWSHELL has following attributes. freeAttribute0 zero freeAttribute1 zero freeAttribute2 Which shell it is from freeAttribute3 Id in the original shell freeAttribute4 Id in the original shell(if overlapping polygon) If freeAttribute2 is 0, this polygon is from SH0. If freeAttribute2 is 1, this polygon is from SH1. Polygon ID in the original shell (SH0 or Sh1) is retrieved by freeAttribute3. Or, if freeAttribute2 is 2, this polygon is from both. This case (freeAttribute2=2) is a special case. This case occurs when one or more polygons were overlapping with the other shell's polygon. The polygon of freeAttribute2=2 was ID=freeAttribute3 in SH0, ID=freeAttribute4 in SH1. YsShellVertex in NEWSHELL has following attributes. freeAttribute0 zero freeAttribute1 zero freeAttribute2 Which shell it is from freeAttribute3 Id in the original shell (Negative means newly created) freeAttribute4 zero If freeAttribute2 is 0, this vertex is from SH0. If freeAttribute2 is 1, this vertex is from SH1. Vertex ID in the original shell (SH0 or Sh1) is retrieved by freeAttribute3. If this vertex is a newly created vertex, freeAttribute3 is a negative value. REFERENCE:
NAME:YsBound DEFINITION: #define YsBound(X,A,B) ((X)<(A) ? (A) : ((X)>(B) ? (B) : (X))) DESCRIPTION: If X is between A and B, return X. If X is smaller than A, return A. If X is greater than B, return B. REFERENCE:
NAME:YsBoundingBoxMaker2 DESCRIPTION: A class to make a bounding box. You can tell the vertices list to this class one by one, by an array or by a list of vertices. Making a bounding box is a simple program. But, if there are some bug inside the bounding box making function, many other part are affected. And, since the bounding box making function is simple, it is suspected at last. Resulting huge amount of time wasted. You can use this class instead of writing your bounding box making function. MEMBERFUNCTION: void Begin(const YsVec2 &VEC); void Add(const YsVec2 &VEC); Add vertices one by one. First, use Begin() to begin adding vertices. Then use Add(). void Make(int NV,const YsVec2 V[]); Make a bounding box from vertices. NV is number of vertices. V[] are vertices of interest. void Make(YsList <YsVec2> *LST); Make a bounding box from a list of vertices. void Make(const YsArray <YsVec2> &ARY); Make a bounding box from an array of vertices. void Get(YsVec2 &min,YsVec2 &MAX) const; Get the result. REFERENCE:
NAME:YsBoundingBoxMaker3 DESCRIPTION: A class to make a bounding box. You can tell the vertices list to this class one by one, by an array or by a list of vertices. Making a bounding box is a simple program. But, if there are some bug inside the bounding box making function, many other part are affected. And, since the bounding box making function is simple, it is suspected at last. Resulting huge amount of time wasted. You can use this class instead of writing your bounding box making function. MEMBERFUNCTION: void Begin(const YsVec3 &VEC); void Add(const YsVec3 &VEC); Add vertices one by one. First, use Begin() to begin adding vertices. Then use Add(). void Make(int NV,const YsVec3 V[]); Make a bounding box from vertices. NV is number of vertices. V[] are vertices of interest. void Make(YsList <YsVec3> *LST); Make a bounding box from a list of vertices. void Make(const YsArray <YsVec3> &ARY); Make a bounding box from an array of vertices. void Get(YsVec3 &min,YsVec3 &MAX) const; Get the result. REFERENCE:
NAME:YsCapitalize DEFINITION: void YsCapitalize(char l[]); DESCRIPTION: Convert all alphabetical letters into capital letter. REFERENCE:
NAME:YsCheckBoundingBoxCollision2 NAME:YsCheckBoundingBoxCollision3 DEFINITION: YSBOOL YsCheckBoundingBoxCollision3 (const YsVec3 &MIN1,const YsVec3 &MAX1,const YsVec3 &MIN2,const YsVec3 &MAX2) YSBOOL YsCheckBoundingBoxCollision2 (const YsVec2 &MIN1,const YsVec2 &MAX1,const YsVec2 &MIN2,const YsVec2 &MAX2) RETURN: YSTRUE Two bounding boxes are colliding YSFALSE Two bounding boxes are not colliding DESCRIPTION: Check if two bounding boxes defined by (MIN1,MAX1) is colliding with the other bounding box defined by (MIN2,MAX2). REFERENCE:
NAME:YsCheckConvex2 NAME:YsCheckConvex3 DEFINITION: YSBOOL YsCheckConvex2(int NP,const YsVec2 P[],YSBOOL STRICTCHECK=YSFALSE); YSBOOL YsCheckConvex3(int NP,const YsVec3 P[],YSBOOL STRICTCHECK=YSFALSE); RETURN: YSTRUE The polygon is convex. YSFALSE The polygon is concave. DESCRIPTION: This function checks if the polygon (NP,P) is convex or not. The polygon is convex if: Condition 1. Pick up 3 conseqtive vertices v1,v2,v3. Let's say e1=e2-v1 and e2=v3-v1 Calculate the outer product (cross product) of e1 and e2. The result is pv. pv=e1^c2 For convex polygon, pv for all 3 conseqtive vertices must have same direction. (Neglecting the vertex that is an intermediate point of the straight edge) Condition 2. Every combination of two vertices is separatable pair, except conseqtive vertices. This condition automatically includes no edges are intersecting each other. (Neglecting the vertex that is an intermediate point of the straight edge) By default, YsCheckConvex2 and YsCheckConvex3 does NOT perform the condition 2 by default. (It means, these functions assumes there are no self intersection). If you need strict check, you can specify YSTRUE for the parameter STRICTCHECK. REFERENCE:
NAME:YsCheckConvexByAngle2 NAME:YsCheckConvexByAngle3 DEFINITION: YSBOOL YsQuickCheckConvex2(int NP,const YsVec2 P[]); YSBOOL YsQuickCheckConvex3(int NP,const YsVec3 P[]); RETURN: YSTRUE The polygon is convex. YSFALSE The polygon is concave. DESCRIPTION: Check if a polygon (NP,P[]) is convex or concave just angle criteria. This function does not check self-intersection. REFERENCE:
NAME:YsCheckFlipDirection2 NAME:YsCheckFlipDirection3 DEFINITION: YSFLIPDIRECTION YsCheckFlipDirection2 (int NP,const YsVec2 P[]); YSFLIPDIRECTION YsCheckFlipDirection3 (int NP,const YsVec3 P[],const YsVec3 &N); RETURN: YSFLIPCCW Counter clockwise YSFLIPCW Clockwise YSFLIPUNKNOWN Failed to calculate DESCRIPTION: Check the flip direction of the polygon (for 3D case, with respect to the normal vector). YsCheckFlipDirection3 is coordinate system dependent. (See YsCoordSysModel and YSCOORDSYSMODEL for more information) MEMBERFUNCTION: OPERATOR: REFERENCE:
NAME:YsCheckInBetween2 NAME:YsCheckInBetween3 DEFINITION: YSBOOL YsCheckInBetween2(const YsVec2 &Q,const YsVec2 &P1,const YsVec2 &P2); YSBOOL YsCheckInBetween3(const YsVec3 &Q,const YsVec3 &P1,const YsVec3 &P2); RETURN: YSTRUE if Q is between P1 and P2 YSFALSE if Q is not between P1 and P2 DESCRIPTION: Check if Q is between P1 and P2 or not. The point Q does not have to be exactly on the line segment P1 and P2. The point Q is considered between P1 and P2 if Q is in between the plane (or line) that: 1.Has P1 as passing point and parpendicular to the line segment and 2.Has P2 as passing point and parpendicular to the line segment REFERENCE:
NAME:YsCheckInsideBoundingBox2 NAME:YsCheckInsideBoundingBox3 DEFINITION: YSBOOL YsCheckInsideBoundingBox3 (const YsVec3 &REF,const YsVec3 &MIN,const YsVec3 &MAX); YSBOOL YsCheckInsideBoundingBox2 (const YsVec2 &REF,const YsVec2 &MIN,const YsVec2 &MAX); RETURN: YSTRUE REF is inside or boundary of the bounding box YSFALSE REF is outside the bounding box DESCRIPTION: Check if point REF is inside or boundary of the bounding box. The bounding box is specified by MIN and MAX. REFERENCE:
NAME:YsCheckInsidePolygon2 NAME:YsCheckInsidePolygon3 DEFINITION: YSSIDE YsCheckInsidePolygon2(const YsVec2 &REF,int NP,const YsVec2 P[]); YSSIDE YsCheckInsidePolygon3(const YsVec3 &REF,int NP,const YsVec3 P[]); RETURN: YSINSIDE The point of interest is inside the polygon YSOUTSIDE The point of interest is outside the polygon YSBOUNDARY The point of interest is on the boundary of the polygon YSUNKNOWNSIDE Calculation failed. DESCRIPTION: Check if the point REF is inside the polygon (NP,P). If the polygon is too much twisted (not exactly on a plane, or on a single line or having zero area), the result will be YSUNKNOWNSIDE. REFERENCE:
NAME:YsCheckLineOverlap2 NAME:YsCheckLineOverlap3 DEFINITION: YSBOOL YsCheckLineOverlap2 (const YsVec2 &O1,const YsVec2 &V1,const YsVec2 &O2,const YsVec2 &V2); YSBOOL YsCheckLineOverlap3 (const YsVec3 &O1,const YsVec3 &V1,const YsVec3 &O2,const YsVec3 &V2) RETURN: YSTRUE Two lines are identical YSFALSE Two lines are not on the same line DESCRIPTION: Check if two lines (O1,V1) and (O2,V2) are identical (lying on the same straight line). REFERENCE:
NAME:YsCheckSeparatability2 NAME:YsCheckSeparatability3 DEFINITION: YSBOOL YsCheckSeparatability2(int NP,const YsVec2 P[],int IDX1,int IDX2); YSBOOL YsCheckSeparatability3(int NP,const YsVec3 P[],int IDX1,int IDX2); RETURN: YSTRUE The polygon is saparatable by a new edge P[IDX1] and P[IDX2]. YSFALSE The polygon is not saparatable by a new edge P[IDX1] and P[IDX2]. DESCRIPTION: Check if the polygon is separatable by a new edge P[IDX] and P[IDX2] by the criteria: 1.A line segment defined by P[IDX1] and P[IDX2] does not penetrate with any other edge that does not contain P[IDX1] and P[IDX2]. 2.The center of line segment P[IDX1],P[IDX2] is inside the polygon. In 3D case, YsCheckSeparatability3 is a slow function. It is recommended to transform all points into 2D plane by YsGetPolygonProjectionMatrix, then use YsCheckSeparatability2 function. REFERENCE:
NAME:YsCheckShellCollision DEFINITION: YSBOOL YsCheckShellCollision(YsShell &SH0,YsShell &SH1); RETURN: YSTRUE Two shells are colliding YSFALSE Two shells are not colliding DESCRIPTION: Check collision between two shells. For performance reason, THIS FUNCTION USES freeAttribute3 of polygons in both shells. REFERENCE:
NAME:YsCollisionOfPolygon DESCRIPTION: A class to check collision of two polygons. To use this class, you have to set two polygons using SetPolygon1 and SetPolygon2 member functions. After setting two polygons, you can call other functions. MEMBERFUNCTION: void SetPolygon1(int NV1,const YsVec3 V1[]); void SetPolygon2(int NV2,const YsVec3 V2[]); Set polygons of interest. YSBOOL YsCollisionOfPolygon::CheckOnTheSamePlane(void) const; This function returns YSTRUE if two polygons are on the same plane. otherwise, this function will return YSFALSE. YSBOOL CheckCollision(void) const; This function returns YSTRUE if two polygons are intersecting or touching more than one point. Otherwise, this function will return YSFALSE. YSINTERSECTION CheckPenetration(void) const; This function returns YSTRUE if two polygons are penetrating each other. This function is identical to YsGetPolygonPenetration. Please refer to YsGetPolygonPenetration for the detail. YSBOOL OneEdgeLiesOnTheOtherPlane(void) const; This function returns YSTRUE if at least one edge is touching to the other polygon. Otherwise, this function will return YSFALSE. REFERENCE:
NAME:YsColor DEFINITION: class YsColor; DESCRIPTION: Color class. MEMBERFUNCTION: void Set(int C15BIT); Set a color by 15 bit color. (GGGGGRRRRRBBBBB). void Set(int R,int G,int B); Set a color. R,G and B must be between 0 to 255. void Set(double r,double g,double b); Set a color. R,G and B must be between 0.0 to 1.0. int Get15BitColor(void); Get a color by 15 bit color. void GetIntRGB(int &r,int &g,int &b); Get a color by int. (0 to 255 for each component); void GetDoubleRGB(double &r,double &g,double &b); Get a color by double. (0.0 to 1.0 for each component); REFERENCE:
NAME:YsCommandNumber DEFINITION: YSRESULT YsCommandNumber(int *N,char C[],char *LST[]); RETURN: YSOK The command was in the command list YSERR The command was not in the command list DESCRIPTION: Find a command id of the command C with respect to the command list LST. The command id will be set to *N. The command list LST must be terminated by NULL. For example, char str[256]; strcpy(str,"VERTEX"); char *lst[]= { "POLYGON", "VERTEX", "END", NULL }; int id; YsCommandNumber(&id,str,lst); Then, id will become 1. REFERENCE:
NAME:YsCoordSysModel DEFINITION: extern YSCOORDSYSMODEL YsCoordSysModel; DESCRIPTION: A global variable representing the coordinate system model. Initial value is YSLEFT_ZPLUS_YPLUS. REFERENCE:
NAME:YsDegToRad NAME:YsRadToDeg DEFINITION: inline double YsDegToRad(double DEG) { return DEG*YsPi/180.0; } inline double YsRadToDeg(double RAD) { return RAD*180.0/YsPi; } DESCRIPTION: YsDegToRad converts an angle from degree to radian. YsRadToDeg converts an angle from radian to degree. REFERENCE:
NAME:YsDrawLineByDDA DESCRIPTION: This class helps drawing a line on a pixel map usint DDA (Digital Differential Analysis) method. DDA is a quick way to trace pixels on the line one pixel by one pixel. MEMBERFUNCTION: void Set(int x1,int y1,int x2,int y2); Set both end point of the line segment. YSRESULT MoveOneStep(void); Move one pixel. void GetPosition(int &x,int &y); Get current position. YSBOOL ReachedToTheEnd(void); This function will return YSTRUE if the point reached to the end. REFERENCE:
NAME:YsE DEFINITION: const double YsE=2.71828; DESCRIPTION: Natural log REFERENCE:
NAME:YsEqual DEFINITION: #define YsEqual(A,B) (YsAbs(A-B)<=YsTolerance ? YSTRUE : YSFALSE) DESCRIPTION: Check if A equals to B. If the difference is less than YsTolerance, this macro will return YSTRUE. Otherwise YSFALSE. REFERENCE:
NAME:YsFileExist DEFINITION: YSBOOL YsFileExist(char FN[]); RETURN: YSTRUE The file FN exists. YSFALSE The file FN does not exist. DESCRIPTION: Check if the file FN exists. REFERENCE:
NAME:YsFileSize DEFINITION: unsigned long YsFileSize(char FNAME[]); RETURN: File size in bytes. DESCRIPTION: This function will return the length of the file FNAME in bytes. REFERENCE:
NAME:YsGetArbitraryInsidePointOfPolygon2 NAME:YsGetArbitraryInsidePointOfPolygon3 DEFINITION: YSRESULT YsGetArbitraryInsidePointOfPolygon2 (YsVec2 &A,int NP,const YsVec2 P[],YSBOOL STRICTCHECKOFCONVEXITY=YSFALSE); YSRESULT YsGetArbitraryInsidePointOfPolygon3 (YsVec3 &A,int NP,const YsVec3 P[],YSBOOL STRICTCHECKOFCONVEXITY=YSFALSE); RETURN: YSOK Found one inside point YSERR Could not find a inside point DESCRIPTION: Find an arbitrary inside point of the polygon. The polygon must be set to (NP,P). The result is set to A. If the function failed to find an inside point, the function return YSERR. If the polygon is convex, this function will return the center of gravity of the polygon. The polygon's convexity is checked by YsCheckConvex2 and YsCheckConvex3. The parameter STRICTCHECKCONVEXITY is passed to YsCheckConvex2 and YsCheckConvec3. Please refer to YsCheckConvex2 and YsCheckConvex3 for the details. (By default, STRICTCHECKCONVEXITY is YSFALSE) REFERENCE:
NAME:YsGetAverageNormalVector DEFINITION: YSRESULT YsGetAverageNormalVector(YsVec3 &NOM,int NP,const YsVec3 P[]); DESCRIPTION: Find an average normal vector based on a triangle calculated by YsGetLargestTriangleFromPolygon2 or YsGetLargestTriangleFromPolygon3 If the coordinate system is left hand, the polygon will be counter clockwise with respect to the normal. If the coordinate system is right hand, the polygon will be clockwise with respect to the normal. REFERENCE:
NAME:YsGetCenterOfPolygon2 NAME:YsGetCenterOfPolygon3 DEFINITION: YSRESULT YsGetCenterOfPolygon2(YsVec2 &CEN,int NP,const YsVec2 PLG[]); YSRESULT YsGetCenterOfPolygon3(YsVec3 &CEN,int NP,const YsVec3 PLG[]); RETURN: YSOK Successfully calculated YSERR Calculation failed DESCRIPTION: Find a center of the polygon based on the largest triangle calculated by YsGetLargestTriangleFromPolygon2/3. Note that, it is different from the center of gravity. MEMBERFUNCTION: OPERATOR: REFERENCE:
NAME:YsGetLargestTriangleFromPolygon3 NAME:YsGetLargestTriangleFromPolygon3 NAME:YsGetLargestTriangleFromPolygon2 NAME:YsGetLargestTriangleFromPolygon2 DEFINITION: YSRESULT YsGetLargestTriangleFromPolygon3 (YsVec3 *V[3],int NP,const YsVec3 P[]); YSRESULT YsGetLargestTriangleFromPolygon3 (const YsVec3 V[3],int NP,const YsVec3 P[]); YSRESULT YsGetLargestTriangleFromPolygon2 (YsVec2 *V[3],int NP,const YsVec2 P[]); YSRESULT YsGetLargestTriangleFromPolygon2 (const YsVec2 V[3],int NP,const YsVec2 P[]); DESCRIPTION: Get the largest triangle that is made by a combination of 3 vertices of (NP,P[]). REFERENCE:
NAME:YsGetLineIntersection2 DEFINITION: YSRESULT YsGetLineIntersection2 (YsVec2 &CRS, const YsVec2 &P1,const YsVec2 &P2,const YsVec2 &Q1,const YsVec2 &Q2); RETURN: YSOK Two lines are intersecting YSERR Two lines are parallel or identical. DESCRIPTION: Get an intersecting point of a line segment P1,P2 and a line segment Q1,Q2. If you want to get a nearest point of two 3D lines, use YsGetNearestPointOfTwoLine. If the point must be in between line segment, you can use YsCheckInBetween2 function after finding a intersection. REFERENCE:
NAME:YsGetLinePenetration2 NAME:YsGetLinePenetration3 DEFINITION: YSINTERSECTION YsGetLinePenetration2 (const YsVec2 &P1,const YsVec2 &P2,const YsVec2 &P3,const YsVec2 &P4); YSINTERSECTION YsGetLinePenetration3 (const YsVec3 &P1,const YsVec3 &P2,const YsVec3 &Q1,const YsVec3 &Q2); RETURN: YSINTERSECT Two lines are penetrating YSOVERLAP Two lines are overlapped YSTOUCH Two lines are touching YSSHAREPOINT Two lines are sharing more than one point YSAPART Two lines are apart DESCRIPTION: Find penetrating point between two lines (P1,P2) and (P3,P4). In 3D case, YsGetLinePenetration3 will use nearest point between two lines, instead of exact intersecting point. REFERENCE:
NAME:YsGetNearestPointOfTwoLine DEFINITION: YSRESULT YsGetNearestPointOfTwoLine (YsVec3 &NP,YsVec3 &NQ, const YsVec3 &P1,const YsVec3 &P2,const YsVec3 &Q1,const YsVec3 &Q2); RETURN: YSOK Successfully calculated YSERR Calculation failed. (Two lines are parrarel or identical). DESCRIPTION: Find a nearest point of two 3D line defined by (P1,P2) and (Q1,Q2). The result will be set to NP and NQ. This function is also used to find a intersecting points of two 3D lines. REFERENCE:
NAME:YsGetNearestPointOnLine2 NAME:YsGetNearestPointOnLine3 DEFINITION: YSRESULT YsGetNearestPointOnLine3 (YsVec3 &NP,const YsVec3 &P1,const YsVec3 &P2,const YsVec3 &REF); YSRESULT YsGetNearestPointOnLine2 (YsVec3 &NP,const YsVec3 &P1,const YsVec3 &P2,const YsVec3 &REF); RETURN: YSOK Success YSERR Calculation failed DESCRIPTION: Find a point that is on the line defined by (P1,P2) and that is closest to REF. The result will be set to NP. REFERENCE:
NAME:YsGetPolygonPenetration DEFINITION: YSINTERSECTION YsGetPolygonPenetration (int NP,const YsVec3 P[],int NQ,const YsVec3 Q[]); RETURN: YSINTERSECT Two objects are penetrating YSOVERLAP Two objects are overlapped YSTOUCH Two objects are touching YSAPART Two objects are apart DESCRIPTION: This function will check if two polygons (NP,P) and (NQ,Q) are penetrating each other. This function will return: YSINTERSECT If one edge is penetrating the other polygon. Or, two polygons are touching at more than two points. (* Note: for concave polygon, this condition can be satisfied even two polygons are just touching). YSOVERLAP Two polygons are on the same plane. YSTOUCH Two polygons are touching to each other at only one point. YSAPART Two polygons are apart from each other. REFERENCE:
NAME:YsGetPolygonProjectionMatrix DEFINITION: YSRESULT YsGetPolygonProjectionMatrix (YsMatrix4x4 &MAT,int NP,const YsVec3 P[]); RETURN: YSOK Success YSERR Feiled DESCRIPTION: This function calculates the matrix that transfers points on a plane into XY plane. Flip direction will be inverted in left-hand coordinate system. The matrix works so that the center of the polygon will come to origin, and the average normal vector will become (0,0,1). REFERENCE:
NAME:YsGetTriangleArea3 NAME:YsGetTriangleArea2 DEFINITION: double YsGetTriangleArea3(const YsVec3 &P1,const YsVec3 &P2,const YsVec3 &P3) double YsGetTriangleArea2(const YsVec2 &P1,const YsVec2 &P2,const YsVec2 &P3) DESCRIPTION: Get an area of the triangle defined by cootdinate P1,P2 and P3. REFERENCE:
NAME:YsGetTwoPlaneCrossLine DEFINITION: YSRESULT YsGetTwoPlaneCrossLine (YsVec3 &LNORG,YsVec3 &LNVEC,const YsPlane &PL1,const YsPlane &PL2); RETURN: YSOK Successfully calculated YSERR Two planes are parallel or identical. DESCRIPTION: Find a line that two planes are intersecting. This function will return one passing point to LNORG and return a direction to LNVEC. REFERENCE:
NAME:YsGreater DEFINITION: #define YsGreater(A,B) ((A)>(B) ? (A) : (B)) DESCRIPTION: Macro returns larger one of A and B. REFERENCE:
NAME:YsList DEFINITION: template <class T> class YsList DESCRIPTION: A template class to maintain a list. You have direct access to the item by refering to a member variable {dat}. The top object in the list represents entire list. When you finished editing the list, it is recommended to call a member function Encache() to speed up future access to the list object. MEMBERVARIABLE: T dat; An item kept in the list. MEMBERFUNCTION: YsList(); When an instance is created, it is a complete list with only one list object. inline YsList <T> *Next(void); inline const YsList <T> *Next(void) const; Get a pointer to next list object. If there's no more next object, this will return NULL. inline YsList <T> *Prev(void); inline const YsList <T> *Prev(void) const; Get a pointer to previous list object. If there's no more previous object, this will return NULL. inline YsList <T> *SeekTop(void); inline const YsList <T> *SeekTop(void) const; Get a pointer to the top object of the list. inline YsList <T> *SeekEnd(void); inline const YsList <T> *SeekEnd(void) const; Get a pointer to the last object of the list. inline YsList <T> *Seek(int N); inline const YsList <T> *Seek(int N) const; Get a pointer to the Nth object of the list. YSBOOL IsTop(void) const; If this object is the top object, this will return YSTRUE. Otherwise this will return YSFALSE. YSBOOL IsEnd(void) const; If this object is the last object, this will return YSTRUE. Otherwise this will return YSFALSE. int GetNumObject(void) const; Get the number of list object in this list. // {a0,a1,a2,...,aN)} // return N+1; int GetPositionInList(void) const; Get the position of this list object in this list. If the object is Nth object, this function will return N. (N begin with zero). If this pointer is NULL, this function will return -1. // {a0,a1,a2,...,(this=an),...,(aN)} // return n; // If called by NULL pointer, // return -1; YsList <T> *Append(YsList <T> *follow); Add a list object to the end. Then return a pointer to the list. This function returnes a pointer to the list because, an empty list (NULL) plus a newly created object is not an empty list (not NULL). So the top member will change. // {(this==a0),(a1),...,(aN)} // + // {(follow==b0),(b1),...,(bN)} // to // return {(a0),(a1),...,(aN),(b0),(b1),...,(bN)} Eg. YsList <int> *lst; lst=NULL; // Empty list is created. for(something) { YsList <int> *toAppend; toAppend=new YsList <int> // Create a new list object. toAppend->dat=something; lst=lst->Append(toAppend); // New object is appended to the list. } YsList <T> *DeleteFromList(void); Delete this object from the list. This function will return a pointer to the list (same as a pointer to the top object) after deleting, because the pointer to the list must change, if this object was a top object. // {(a0),(a1),(a2),...,(a n-1),(an=this),(a n+1),...,(aN)} // to // return {(a0),(a1),(a2),...,(a n-1),(a n+1),...,(aN)} Eg. lst=obj->DeleteFromList(); YsList <T> *Delete(int N); Delete Nth object in the list. (N begin with zero). This function will return a pointer to the list after deleting. // {(this=a0),(a1),(a2),...,(a n-1),(an),(a n+1),...,(aN)} // to // return {(a0),(a1),(a2),...,(a n-1),(a n+1),...,(aN)} YSRESULT DeleteList(void); Delete entire list. This function must be used by only top object. YsList <T> *Insert(int N,YsList <T> *TOINSERT); Insert a list TOINSERT between N-1th and Nth object, then returns a pointer to a new list. After this function, TOINSERT is no longer a independent list. // {(this=a0),(a1),...,(a n-1),(an),...,(aN)} // {(toInsert=b0),(b1),(b2),....,(bN)} // to // return {(a0),(a1),...,(a n-1),(b0),...,(bN),(an),...,(aN)} // // if this==NULL // return toInsert; YsList <T> *InsertOnTheLeft(YsList <T> *TOINSERT); Insert a list TOINSERT between this object and the previous object, then return a pointer to a new list. // {(a0),(a1),...,(a n-1),(an=this),(a n+1),...,(aN)} // to // {(a0),(a1),...,(a n-1),{toInsert},(an=this),(a n+1),...,(aN)} YsList <T> *InsertOnTheRight(YsList <T> *TOINSERT); Insert a list TOINSERT between this object and the next object, then return a pointer to a new list. // {(a0),(a1),...,(a n-1),(an=this),(a n+1),...,(aN)} // to // {(a0),(a1),...,(a n-1),(an=this),{toInsert},(a n+1),...,(aN)} YsList <T> *Split(YsList <T> *SPLITPOINT); Split a list at SPLITPOINT. After this function, the pointer SPLITPOINT can be used as a independent list. This function will return the pointer to remaining part of the original list. Eg. lst=lst->Split(split); (At this point, lst and split can be used as a independent list). // {(a0),(a1),...,(a n-1),(an=splitPoint),...,(aN)} // to // return {(a0),(a1),...,(a n-1)} // // {(an=splitPoint),...,(aN)} can be used as an independent list. YsList <T> *Duplicate(void) const; This function will duplicate the list and return the pointer to the duplicated list. If the class T's operator= is not properly written, the result is unexpected. void Test(void) const; Diagnostic itself. void Encache(void) const; Re-calculate a cache buffer to speed up accessing list objects. Cache buffer is cleared when the list is modified. void Decache(void) const; Clear the cache buffer. REFERENCE:
NAME:YsMath DESCRIPTION: Base class of some math class. You don't have to worry about this class. REFERENCE:
NAME:YsMatrix DESCRIPTION: General n*m matrix class. Row and column begins with 1, NOT zero. If you want to retrieve left top element, use v(1,1). MEMBERFUNCTION: inline double v(int ROW,int COLUMN) const; Get an element at (ROW,COLUMN). inline int nr(void) const Get number of rows. inline int nc(void) const Get number of columns. inline YSRESULT Set(int ROW,int COLUMN,double V); Set an element at (ROW,COLUMN) to the value of V. void Create(int NR,int NC); Create a matrix of NR*NC. All elements are initialized to zero. void Create(int NR,int NC,double D[]); Create a matrix of NR*NC. Elements are initialized by D[]. (1,1) <- D[0] (1,2) <- D[2] (1,3) <- D[3] : (2,1) <- D[NC] (r,c) <- D[NC*(r-1)+(c-1)] void CreateWithoutClear(int NR,int NC); Create a matrix of NR*NC. All elements are NOT initialized. void LoadIdentity(void); Set an identity matrix. YSRESULT GetSubMatrix(YsMatrix &MAT,int R,int C) const; Get a submatrix. A submatrix is a matrix that is made by eliminating row R and column C from the original matrix. The resulting matrix is set to MAT. YSRESULT GetDeterminantMatrix(YsMatrix &MAT) const; Get a determinant matrix. YSRESULT GetDeterminant(double &DET) const; Get a determinant. If the matrix is not n*n matrix, this function will return YSERR. YSRESULT Transpose(void); Transpose the matrix. YSRESULT Invert(void); Invert the matrix. If inverse matrix is not available, this function will return YSERR. YSRESULT SwapRow(int R1,int R2); Swap row R1 and R2. YSRESULT MulRow(int R,double M); Multiply each elements contained in row R by the factor of M. YSRESULT DivRow(int R,double D); Divide each elements contained in row R by the factor of M. YSRESULT Row1MinusRow2Mul(int R1,int R2,double M); Subtract each element contained in row R1 by the elements in row R2 times M. OPERATOR: const YsMatrix &operator=(const YsMatrix &); Copy the matrix. inline const YsMatrix &operator*(const YsMatrix &A,const YsMatrix &B) Multiply matrices. inline const YsMatrix &operator+(const YsMatrix &A,const YsMatrix &B) Add matrices. inline const YsMatrix &operator-(const YsMatrix &A,const YsMatrix &B) Subtract matrices. inline const YsMatrix &operator-(const YsMatrix &A) Return a negative of A. inline const YsMatrix &operator^(const YsMatrix &A,const YsMatrix &B) Calculate an outer product (cross product) of A and B. A and B must be n*1 matarices. inline const YsMatrix &operator*(const YsMatrix &A,double B) inline const YsMatrix &operator*(double B,const YsMatrix &A) Return a matrix A*B. inline const YsMatrix &operator/(const YsMatrix &A,double B) Return a matrix A/B. REFERENCE:
NAME:YsMatrix4x4 DESCRIPTION: 4x4 matrix class. Row and column begin with 1, NOT zero. So, if you want to get top-left element, use v(1,1). Or to get bottom-right element, use v(4,4) MEMBERFUNCTION: inline YsMatrix4x4(); Constructor WITHOUT initialization. To initialize (to identity matrix), use Initialize(). inline double v(int R,int C) const Get a value of an element at (Row=R,Column=C). void Initialize(void); Load the identity matrix. void RotateZY(double A); Multiply a matrix of rotation in Z-Y plane by an angle of A. void RotateXZ(double A); Multiply a matrix of rotation in X-Z plane by an angle of A. void RotateXY(double A); Multiply a matrix of rotation in X-Y plane by an angle of A. void Rotate(double X,double Y,double Z,double ANG); Multiply a matrix of rotation about (X,Y,Z) by the angle of ANG. void Rotate(const YsRotation &ROT); Multiply a matrix of rotation ROT. void Rotate(const YsAtt3 &ATT); Multiply a matrix of rotation ATT. (Local to global rotation). void Translate(double X,double Y,double Z); Multiply a matrix of translation (X,Y,Z); void Translate(const YsVec3 &VEC); Multiply a matrix of translation by VEC. void Scale(double SX,double SY,double SZ); Multiply a matrix of scaling in x,y and z component. newX=oldX*SX newY=oldY*SY newZ=oldZ*SZ void Scale(const YsVec3 &SCA); Multiply a matrix of scaling in x,y and z component. newX=oldX*SCA.x() newY=oldY*SCA.y() newZ=oldZ*SCA.z() void Mul(double RESULT[4],const double VEC[4]) const; void Mul(YsVec3 &RESULT,const YsVec3 &VEC,double TRANSLATE) const; Multiply this matrix and VEC. The result will be set to RESULT. If VEC[3]==1.0 or TRANSLATE==1.0, the vector is rotated and translated. If VEC[3]==0.0 or TRANSLATE==0.0, the vector is rotated but is not translated. void MulInverse(double RESULT[4],const double VEC[4]) const; void MulInverse(YsVec3 &RESULT,const YsVec3 &ORG,double TRANSLATE) const; Multiply inverse matrix of this matrix and VEC. The result will be set to RESULT. If VEC[3]==1.0 or TRANSLATE==1.0, the vector is rotated and translated. If VEC[3]==0.0 or TRANSLATE==0.0, the vector is rotated but is not translated. YSRESULT Invert(void); Invert this matrix. If the inverse matrix is valid (means the matrix is not singular), this function will return YSOK, otherwise return YSERR. void GetArray(double BUF[16]) const; Copy elements to buf. Row,Column 1 1 to BUF[0] 1 2 to BUF[1] 1 3 to BUF[2] 1 4 to BUF[3] 2 1 to BUF[4] 2 2 to BUF[5] : YSRESULT GetInverseArray(double BUF[16]) const; Get the inversed matrix value to BUF. Order of the element is same as GetArray function. If the inverse matrix is valid (means the matrix is not singular), this function will return YSOK, otherwise return YSERR. YSRESULT GetRotation(double &X,double &Y,double &Z,double &RAD) const; YSRESULT GetRotation(YsRotation &ROT) const; Extract a rotation from this matrix. YSRESULT GetTranslation(double &X,double &Y,double &Z) const; YSRESULT GetTranslation(YsVec3 &TRS) const; Extract a translation from this matrix. OPERATOR: friend YsMatrix4x4 operator*(const YsMatrix4x4 &A,const YsMatrix4x4 &B); Multiply A and B. And return the resultant. friend YsVec3 operator*(const YsMatrix4x4 &A,const YsVec3 &B); Multiply A and B. And return the resultant. REFERENCE:
NAME:YsOneMemoryBlock DEFINITION: template <class T,const int minimum> class YsOneMemoryBlock DESCRIPTION: If you want to use an array in a function, and the side of the array is usually less than some value but unbounded, you may tend to use new and delete operator. For example, let's say you want to have an array to keep vertices of a polygon. Typically, the number of vertices of a polygon is less than 64. Even mostly 3 or 4. But, it could be more than 256 vertices. But, new/delete operator (also malloc/free function) are extre----mly slow function. (Regardless of which operating system you are using, Win or UNIX). They are functions which you may want to avoid as much as possible to improve the performance. One more problem using new/delete is memory leak. If you forget deleting the memory block, your program will run out of memory, then crash some time. Typically, void Someclass::function(void) { int n; YsVec3 *vec; n=GetNumberOfVertices(); vec=new YsVec3[n]; GetVertices(vec); DoSomething(); if(Error Occured) { // Stop everything. It's an emergency. return; } DoSomethingElse(); delete [] vec; return; // Happy! } You may notice if(Erro Occured), vec is not deleted. This class will allow you to stop worrying about these performance problems and memory leaks. Instead of writing like, int *vec; vec=new int[requiredSize]; write as follows. YsOneMemoryBlock <int,256> memBlock; int *vec; vec=memBlock.GetMemoryBlock(requiredSize); You must specify 256 as a typical safe size of the array. YsOneMemoryBlock class hold this size of array by default. It is obtained from stack area, no performance loss. So, you must not specify huge number here. This must be a reasonable number. When GetMemoryBlock function is called, if requiredSize is less than typical safe size, YsOneMemoryBlock class just returnes an array that is kept inside the class. Otherwise, this class just establish operator new to allocate a new memory block. If requiredSize is usually less than typical safe size, operator new is rarely used. Very little performance loss. And even if YsOneMemoryBlock class used operator new, the memory block is automatically released in the destructor of YsOneMemoryBlock. So, no memory leak. Note that, this class is only for a local array. The array allocated by this class is automatically deleted when the function exits. MEMBERFUNCTION: T *GetMemoryBlock(int requiredSize); Get Memory Block. REFERENCE:
NAME:YsPi DEFINITION: const double YsPi=3.14159265358979323; DESCRIPTION: PI. REFERENCE:
NAME:YsPlane DESCRIPTION: A class represents a plane. MEMBERFUNCTION: YsPlane(); Constructor WITHOUT initialization. YsPlane(const YsVec3 &O,const YsVec3 &N); Constructor with initialization. Specify one passing point or origin by O, normal vector by N. inline void Set(const YsVec3 &O,const YsVec3 &N) Set origin O and normal vector N. inline void SetOrigin(const YsVec3 &O) Set origin (one passing point of the plane). inline void SetNormal(const YsVec3 &N) Set normal vector. inline void GetOrigin(YsVec3 &O) const Get origin. inline void GetNormal(YsVec3 &N) const Get normal vector. YSBOOL CheckOnPlane(const YsVec3 &POS) const; If POS is on the plane, return YSTRUE. Otherwise return YSFALSE. YSRESULT GetIntersection (YsVec3 &CRS,const YsVec3 &LNORG,const YsVec3 &LNVEC); Calculate an intersecting point between a line and the plane. The line is specified by originating point LNORG and the direction LNVEC. Intersecting point is returned to CRS. If the line intersects the plane, this function will return YSTRUE, otherwise return YSFALSE. (No intersection means the line is parallel to or on the plane.) YSRESULT GetPenetration (YsVec3 &CRS,const YsVec3 &P1,const YsVec3 &P2) const; Calculate a penetrating point between a line segment and the plane. The line is specified by two end points, P1 and P2. Penetrating point is returned to CRS. If the line segment penetrates the plane this function will return YSOK, otherwise return YSERR. YSRESULT GetNearestPoint(YsVec3 &NP,const YsVec3 &REFP) const; Return a point on the plane that is closest to REFP. The result will be set to NP. Usually this function will return YSOK, but if the function failed to calculate (Eg. eveutually normal vector has the length of zero), return YSERR. YSRESULT MakeBestFitPlane(int NP,const YsVec3 P[]); Make a plane that best fit to the point sets (NP,P[]). If the calculation failed, this function will return YSERR. Otherwise return YSOK. OPERATOR: REFERENCE:
NAME:YsPrintf DESCRIPTION: A class that offeres the same function as printf. You can write a subclass of YsPrintf, overriding the function Output member function. Output member function accepts final output string. You can output the string to a file, a MessageBox or anything you want. MEMBERVARIABLE: static YsPrintf *def; YsPrintf::def is a pointer to the default YsPrintf object. At the beginning, YsPrintf::def->Printf(something); will work same as printf of the standard C-library. MEMBERFUNCTION: virtual void Output(char str[]); You cannot call this function directly. But you can override this function to output a final string to anything. int Printf(const char *fom,...); You can use this function same as printf of the standard C-library. void SetDefault(void); Make this instance default. REFERENCE:
NAME:YsPutExt DEFINITION: void YsPutExt(char FNAME[],char EXT[]); DESCRIPTION: Put an extension EXT to the filename FNAME, if the filename FNAME does not have an extension. The extension EXT must be in one of following forms. *.EXT .EXT EXT REFERENCE:
NAME:YsRelativePath DEFINITION: YSRESULT YsRelativePath(char RELATIVE[],char FULL[],char ORIGIN[]); RETURN: YSOK Successfully converted YSERR Given fullpathname cannot be converted to relative path DESCRIPTION: Convert a full path name FULL into relative path with respect to the path name ORIGIN. This function may fail if (1)The target file FULL is not in a same drive as ORIGIN. (2)Case of driver letter is different between FULL and ORIGIN. (Eg. FULL -> "C:/src/ysclass/document/ysclass.txt ORIGIN -> "c:/src/ysclass/" ^ Case mismatch ) REFERENCE:
NAME:YsRotation DESCRIPTION: Class that represent a rotation about an arbitrary vector. MEMBERFUNCTION: YsRotation(); Constructor WITHOUT initialization. YsRotation(double X,double Y,double Z,double ANG); Constructor WITH initialization. (X,Y,Z) as axis of rotation. "ANG" as an angle of rotation. YsRotation(const YsVec3 &AX,double ANG); Constructor WITH initialization. AX as axis of rotation. ANG as an angle of rotation. inline void Set(double X,double Y,double Z,double A) inline void Set(const YsVec3 &AX,double A) Set an axis of rotation {(X,Y,Z) or AX} and an angle of rotation A. inline void SetAxis(const YsVec3 &AXS; Set an axis of rotation. inline void SetAngle(double A); Set an angle of rotation. inline void Get(double &X,double &Y,double &Z,double &A) const inline void Get(YsVec3 &AX,double &A) const Get an axis of rotation and an angle of rotation. inline const YsVec3 &GetAxis(void) const Get an axis of rotation. inline const double GetAngle(void) const Get an angle of rotation. YSRESULT RotatePositive(YsVec3 &RESULT,const YsVec3 &START) const; Rotate the vector START to the right(in right hand coordinate system) or to the left(in left hand coordinate system). The result is set to RESULT. YSRESULT RotateNegative(YsVec3 &RESULT,const YsVec3 &START) const; Rotate the vector START to the left(in right hand coordinate system) or to the right(in left hand coordinate system). The result is set to RESULT. OPERATOR: REFERENCE:
NAME:YsScreenPolygon DEFINITION: template <const int MAXNXBUF,const int HEI> class YsScreenPolygon DESCRIPTION: This class provide an easy way to draw a polygon on a pixel map. When drawing a polygon on a pixel map, the program trace edges of the polygon and find intersection between each edge and a line y=k {k:constant 0<=k<y resolution}. After findint intersection, the program draws horizontal lines that fills between intersecting points. The template parameter MAXNXBUF takes the maximum number of horizontal intersecting points. If there are more than MAXNXBUF of intersection at y=k, this class will ignore some of intersecting points. The intersecting point at righthand side has more priority. The other template parameter HEI takes the resolution in y direction. Y component of screen coordinate must be between 0 through HEi-1. User MakeHorizontalIntersectionBuffer member function to find intersecting points. Then, use GetRangeOfY,GetNumIntersectionAtY, and GetIntersectionBufferAtY to use retrieve intersecting points at y=k. Then, draw horizontal lines. MEMBERFUNCTION: YSRESULT MakeHorizontalIntersectionBuffer(int NP,int P[]); Track edges, make the intersection buffer. If NP is less than 3, this function will return YSERR and do nothing. The format of the array P is: P[0]=x1 P[1]=y1 P[2]=x2 P[3]=y2 P[4]=x3 P[5]=y3 ..... void GetRangeOfY(int &ymin,int &ymax); Get range of Y component. This function does not return valid value. int GetNumIntersectionAtY(int Y); Return the number of intersection between the polygon and a horizontal line y=Y. int *GetIntersectionBufferAtY(int Y); Return the pointer to a intersection buffer of y=Y. You can draw a polygon by, // It's better to check errors and NULL pointers. (I omitted for this) // This code is ad lib code :-) So, it may contain errors, // Please read it as a schematic code :-) int i,n,*buf,x,x1,x2,y,y1,y2; YsScreenPolygon plg; plg.MakeHorizontalIntersectionBuffer(somepolygon); plg.GetRangeOfY(y1,y2); for(y=y1; y<=y2; y++) { n=GetNumIntersectionAtY(y); buf=GetIntersectioNBufferAtY(y); for(i=0; i<n-1; i+=2) { for(x=buf[i]; x<=buf[i+1]; x++) { PutPixel(x,y); } } } YSRESULT YsShell::BeginReadSrf(void) Initialize the shell. Prepare for reading SRF-FORMAT data. YSRESULT YsShell::ReadSrfOneLine(char str[]) Read a single line of SRF-FORMAT data. YSRESULT YsShell::EndReadSrf(void) Terminate reading SRF-FORMAT data. YSRESULT YsShell::LoadSrf(char fn[]) Read SRF-FORMAT file. Automatically run BeginReadSRF,ReadSrfOneLine, EndReadSrf functions. REFERENCE:
NAME:YsSeparatePathFile DEFINITION: YSRESULT YsSeparatePathFile(char DIR[],char FIL[],char FUL[]); RETURN: YSOK Successfully separated directory name and file name. YSERR Failed to separate directory name and file name. DESCRIPTION: This function will separate directory name part and file name part of the path name FUL. The directory part will be set to DIR. The file name part will be set to FIL. REFERENCE:
NAME:YsSeparateShell DEFINITION: YSRESULT YsSeparateShell (YsShell &SH0,YsShell &SH1,YsShell &ORG,YsShell &REF); RETURN: YSOK Succesfully calculated YSERR Failed DESCRIPTION: Split a shell ORG into SH0 and SH1 with respect to REF. This function is equivalent to following two lines of code. YsBlendShell(SH0,ORG,REF,YSBOOLMINUS); YsBlendShell(SH1,ORG,REF,YSBOOLAND); REFERENCE:
NAME:YsShell DESCRIPTION: A polygon shell class. The polygon shell consists of a list of vertices and a list of polygons. Various operations are available for this class such as boolean operations, inside/outside determination, collision detection etc. Boolean operatiosn and inside/outside determination are available only when the shell satisfies the condition to be a solid. YsShell has an operator=. You can copy shell instances safely with the operator=. YsShell keeps all polygons on memory. YsShell itself doesn't have features swapping in/out some polygons from/into HDD. So, maybe if you try to use this class to take care of more than 10,000 polygons, I don't know it works or doesn't work. It could work. In these days, many machines have more than 64MB RAM. Hmmm.... Currently, Maximum 256 vertices per polygon. MEMBERFUNCTION: void CleanUp(void); Initialize the instance. void Encache(void) const; Calculate cache table of vertices and polygons to accelerate access. int AddVertex(const YsVec3 &POS); Add a vertex. POS is a vertex position. This function returns an ID of newly created vertex. int AddPolygon(int NV,const int V[]); Add a polygon. NV is the number of vertices. V is an array of vertex IDs. This function returns an ID of newly created polygon. Note that this function does not check if all the vertices are on the same plane or not. int AddPolygonVertex(int NV,const YsVec3 V[]); Add a polygon. NV is the number of vertices. V is an array of vertex positions. This function returns an ID of newly created polygon. Note that this function does not check if all the vertices are on the same plane or not. YSRESULT ModifyVertexPosition(int vtId,const YsVec3 &newPos) Modify Vertex's position. YSRESULT ModifyPolygon(int PLID,int NV,const int V[]); Modify a polygon that is specified by PLID. NV,V is a new number of vertices and an array of new vertex IDs. Note that this function does not check if all the vertices are on the same plane or not. YSRESULT SetNormalOfPolygon(int PLID,const YsVec3 &NOM); Set a normal vector to a polygon. YSRESULT SetColorOfPolygon(int PLID,const YsColor &COL); Set a color to a polygon. YSRESULT GetNormalOfPolygon(YsVec3 &NOM,int PLID); Get a normal vector to a polygon. YSRESULT GetColorOfPolygon(YsColor &COL,int PLID); Get a color to a polygon. YSRESULT ValidateVtId(int NVTID,const int VTID[]); YSRESULT ValidatePlId(int NPLID,const int PLID[]); Check if VTIDs or PLIDs are valid or invalid. If all of VTIDs or PLIDs are valid, this function return YSOK. Otherwise this function returns YSERR. YSRESULT DeletePolygon(int PLID); Delete a polygon. YSRESULT DeleteVertex(int VTID); Delete a vertex. If the vertex is used by one or more polygons, this function will return YSERR and the vertex will not be deleted. YSRESULT DeleteVertexAtTheSamePosition(void); YSRESULT DeleteVertexAtTheSamePosition(int &NDELETED); If there are more than one vertex at the same position, this function will delete unnecessary vertices. Vertex ID list of polygons are automatically corrected. The number of vertices deleted is returned to NDELETED. void GetBoundingBox(YsVec3 &min,YsVec3 &max); Get bouding box of the shell. int GetNumPolygon(void) const; Get the number of polygons in this shell. int GetNumVertex(void) const; Get the number of vertices in this shell. int GetMaxNumVertexOfPolygon(void) const; Get the maximum number of vertices of a polygon contained in this shell. YSRESULT GetVertexPosition(YsVec3 &POS,int VTID) const; Get the position of the vertex of VTID. int GetNumVertexOfPolygon(int PLID) const; Get the number of vertices of the polygon of PLID. YSRESULT GetVertexListOfPolygon(int VTID[],int MAXCOUNT,int PLID) const; Get the vertex ID list of the polygon PLID. You must specify the length of the array VTID to MAXCOUNT. YSRESULT GetVertexListOfPolygon(YsVec3 VTX[],int MAXCOUNT,int PLID) const; Get the vertex positions of the polygon PLID. You must specify the length of the array VTID to MAXCOUNT. void SetMatrix(const YsMatrix4x4 &MAT); Set a transformation matrix. GetVertexPosition, GetVertexListOfPolygon functions are affected by this matrix. void GetMatrix(YsMatrix4x4 &MAT) const; Get the transformation matrix set by SetMatrix function. YsShellPolygon *GetPolygon(int ID); const YsShellPolygon *GetPolygon(int ID) const; Get a pointer to YsShellPolygon class. YsShellVertex *GetVertex(int ID); const YsShellVertex *GetVertex(int ID) const; Get a pointer to YsShellVertex class. YSSIDE CountRayIntersection (int &COUNTER,const YsVec3 &ORG,const YsVec3 &VEC,int PLIDSKIP=-1) const; Shoot a ray from ORG to the direction of VEC. This function counts how many times the ray penetrates polygons. The result is set to COUNTER. You can set PLIDSKIP to exclude a particular polygon from intersection check. If the ray hits the boundary of a polygon, this function stops and return YSBOUNDARY. Or if the function failed to calculate intersection, this function returns YSUNKNOWNSIDE. If this function returned YSBOUNDARY or YSUNKNOWNSIDE, COUNT becomes invalid. YSSIDE CheckInsideSolid(const YsVec3 &PNT) const; Check if PNT is inside,outside or boundary of this shell. The return value is valid only when the shell satisfies the condition of solid. If the calculation is failed, this function will return YSUNKNOWNSIDE. Note that if the shell is not a solid (particularly, not closed or having independent polygon etc.), this function may not return YSUNKNOWNSIDE but return false value. YSRESULT InvertPolygon(int PLID); Invert the flip direction of the polygon PLID. int ShootRay(YsVec3 &INTERSECT,const YsVec3 &ORG,const YsVec3 &VEC) const; Shoot a ray from ORG to the direction of VEC. Find a polygon that the ray hits first. (The polygon that has closest intersecting point with ORG will be chosen). This function will set intersecting point to INTERSECT. The return value is the polygon that the ray hit first. If the distance between the point ray hit and ORG is larger than the length of VEC, that point is ignored. If no intersection, this function will return negative value. void ShootRay (YsArray <YsVec3> &LST,const YsVec3 &ORG,const YsVec3 &VEC) const; Shoot a ray from ORG to the direction of VEC. Make a list of intersection to LST. If the distance between the point ray hit and ORG is larger than the length of VEC, that point is ignored. If no intersection, LST will be an empty array. OPERATOR: const YsShell &operator=(const YsShell &from); You can use operator= to safely copy a shell. REFERENCE:
NAME:YsShellPolygon DESCRIPTION: Polygon class used in YsShell class. You can access to this class only to read/write free attributes. MEMBERVARIABLE: int freeAttribute0; int freeAttribute1; int freeAttribute2; int freeAttribute3; int freeAttribute4; These variables do not have any particular meaning. An application program can use these variables for any purpose. REFERENCE:
NAME:YsShellVertex DESCRIPTION: Vertex class used in YsShell class. You can access to this class only to read/write free attributes. MEMBERVARIABLE: int freeAttribute0; int freeAttribute1; int freeAttribute2; int freeAttribute3; int freeAttribute4; These variables do not have any particular meaning. An application program can use these variables for any purpose. REFERENCE:
NAME:YsSmaller DEFINITION: #define YsSmaller(A,B) ((A)<(B) ? (A) : (B)) DESCRIPTION: Macro returns smaller one of A and B. REFERENCE:
NAME:YsSolveThreeLinearEquation DEFINITION: YSRESULT YsSolveThreeLinearEquation (double *X,double *Y,double *Z, double A1,double B1,double C1,double D1, double A2,double B2,double C2,double D2, double A3,double B3,double C3,double D3); RETURN: YSOK Successfully calculated YSERR No solution for this three linear simultaneous equation. DESCRIPTION: Solve a three linear simultaneous equation. Equations are descibed as: A1 x +B1 y +C1 z +D1=0 A2 x +B2 y +C2 z +D2=0 A3 x +B3 y +C3 z +D3=0 REFERENCE:
NAME:YsSolveTwoLinearEquation DEFINITION: YSRESULT YsSolveTwoLinearEquation (double *X,double *Y, double A,double B,double C, double P,double Q,double R); RETURN: YSOK Successfully calculated YSERR No solution for this two linear simultaneous equation. DESCRIPTION: Solve a two linear simultaneous equation. Equations are descibed as: Ax+By+C=0 Px+Qy+R=0 REFERENCE:
NAME:YsStringHead DEFINITION: void YsStringHead(char **STR); DESCRIPTION: Seek a pointer STR to first letter of the string. REFERENCE:
NAME:YsStringTail DEFINITION: void YsStringTail(char *STR); DESCRIPTION: Delete control codes at the end of the string. If there are more than one conseqtive control codes at the end, this function will eliminate all of them. REFERENCE:
NAME:YsSword DESCRIPTION: A class to slash a 3D polygon by planes or polygons. This class can also slash 2D polygon by lines. Also you can use this function for triangulate (tesselate) a polygon. Or cut a concave polygon into piecewise convex polygons. This function accepts both convex and concave polygons (without notification, this class library works for both convex and concave polygons). For this class, copy constructor and operator= are not allowed. To use this class, you have to set an initial polygon to this class using SetInitialPolygon member function. The initial polygon is the polygon that you want to cut into pieces. Then, you can call Slash functions. You can call Slash function more than once. For example, you can slash a rectangle twice to make it into four pieces. Then, finally, you can get GetNumPolygon() member function to get how many pieces the initial polygon became. MEMBERFUNCTION: YSRESULT SetInitialPolygon(int NP,const YsVec3 P[],const int ID[]=NULL); YSRESULT SetInitialPolygon(int NP,const YsVec2 P[],const int ID[]=NULL); Set an initial polygon. The initial polygon is the polygon that you want to cut into pieces. You can also specify an array of IDs of vertices. If you set vertices, this class will track which new vertex is created between which vertices. YSRESULT Slash(const YsPlane &PLN); YSRESULT Slash(int NV,const YsVec3 V[]); YSRESULT SlashByOverlappingPolygon3(int NP,YsVec3 P[],int NOTE=0); Slash the target polygon by a plane PLN, by a polygon (NV,V) or by a overlapping polygon (NP,P). An overlapping polygon is a polygon that lies on the same plane as the target polygon. SlashByOverlappingPolygon3 will slash the target polygon by polygons that is parallel to each edge of the overlapping polygon, and is parpendicular to the overlapping polygon. You can specify NOTE when you slash a polygon by a overlapping polygon. NOTE is copied to pieces of polygons that were overlapping with slasher polygon. YSRESULT Slash(const YsVec2 &ORG,const YsVec2 &VEC); Slash the target polygon by a 2D line specivied by ORG and VEC. This is for only 2D polygon slashing. int GetNumPolygon(void) const; Get the number of piecewise polygons generated by slashing. int GetNumVertexOfPolygon(int N) const; Get the number of vertices of Nth piece of polygon. (N begins with zero). YSRESULT GetVertexListOfPolygon(YsVec3 VEC[],int MAXCOUNT,int N); YSRESULT GetVertexListOfPolygon(const YsVec3 *VEC[],int MAXCOUNT,int N); YSRESULT GetVertexListOfPolygon(YsVec2 VEC[],int MAXCOUNT,int N); Get vertex list of the Nth piece of polygon. The vertex list is returned to VEC[]. You must specify the available length of the VEC to MAXCOUNT. const YsArray <YsVec3> *GetPolygon(int N) const; Get a pointer to an array that contains vertices of Nth piece of polygon. const YsArray <int> *GetVertexIdList(int N) const; Get a pointer to an array that contains vertex IDs of Nth piece of polygon. This function is available only when you set vertex IDs as well as initial polygon. int GetNumNewVertex(void) const; Get the number of newly created vertices. This could be zero even when the polygon is slashed into more than two pieces. The numver of newly created vertices will become zero when: 1.The polygon is not slashed into more than one pieces. 2.The polygon is slashed into more than two pieces, but slashing line was lying on existing vertices (within YsTolerance). const YsSwordNewVertexLog *GetNewVertexLog(int N) const; Get Nth newly created vertex log. See YsSwordNewVertexLog for more information. This function is available only when you specified vertex IDs as well as initial polygon. YSBOOL IsFromOverlappingPolygon3(int N) const; This function will return YSTRUE if Nth piece of polygon was created by a SlashByOverlappingPolygon3 function, and was overlapping part. YSBOOL IsFromOverlappingPolygon3(int N,int &NOTE) const; This function will return YSTRUE if Nth piece of polygon was created by a SlashByOverlappingPolygon3 function, and was overlapping part. You also can retrieve NOTE value that is specified when SlashByOverlappingPolygon3 is called. YSRESULT Triangulate(YSCONVEXNIZESTRATEGY STRATEGY=YSCONVEXNIZEDEFAULT); YSRESULT Convexnize(YSCONVEXNIZESTRATEGY STRATEGY=YSCONVEXNIZEDEFAULT); Cut the target polygon into piecewise triangles or convex-polygons. See YSCONVEXNIZESTRATEGY for details of the parameter. OPERATOR: REFERENCE:
NAME:YsSwordNewVertexLog DESCRIPTION: A class that keeps an information of newly created vertices in YsSword. MEMBERVARIABLE: int freeAttribute; You can use this attribute freely for any purpose. int betweenVt1,betweenVt2; The vertex is created between these two vertices. int idCreated; The ID number of this vertex. YsVec3 pos; The position of the vertex. REFERENCE:
NAME:YsTolerance DEFINITION: extern double YsTolerance; DESCRIPTION: A global variable representing tolerance. (Very small number. If the difference between a number A and a number B is smaller than the tolerance, these two numbers are considered same.) Initial value is 0.000001. Since it is a global variable, you can change tolerance just by substitute new tolerance value into YsTolerance. REFERNECE: YsCoordSysModel REFERENCE:
NAME:YsUncapitalize DEFINITION: void YsUncapitalize(char l[]); RETURN: Convert all alphabetical letters into small letters. REFERENCE:
NAME:YsVec2 DESCRIPTION: 2D Vector class. MEMBERFUNCTION: inline YsVec2() Constructor. Note that does NOT clear (x,y) to zero. inline YsVec2(double X,double Y); Constructor with initialization. inline double x(void) const; Get x value. inline double y(void) const; Get y value. inline const double *GetValue(void) const; Return a pointer to an array that contains x and y; inline void Get(double &X,double &Y) const; Get x and y. inline double GetSquareLength(void) const; Return x*x+y*y inline double GetLength(void) const; Return sqrt(x*x+y*y); YSBOOL IsNormalized(void) const; Return YSTRUE if the vector is normalized (having length of 1.0). Otherwise return YSFALSE. inline YSRESULT Normalize(void); Normalize the vector. If the length of the vector is equal to zero, this function will return YSERR. If no error, this function will return YSOK. inline void Set(double X,double Y) Set x and y value. inline void SetX(double X) Set x value. inline void SetY(double Y) Set y value. inline void Set(double V[2]) Set x and y by array. inline void Rotate(double ANG); Rotate x and y by ANG(radian). OPERATOR: inline YsVec2 operator-(const YsVec2 &A) Return -1.0*A inline YsVec2 operator-(const YsVec2 &A,const YsVec2 &B) Return A-B inline YsVec2 operator+(const YsVec2 &A,const YsVec2 &B) Return A+B inline YsVec2 operator/(const YsVec2 &A,double B) Return A/B inline YsVec2 operator*(const YsVec2 &A,double B) inline YsVec2 operator*(double B,const YsVec2 &A) Return A*B inline double operator*(const YsVec2 &A,const YsVec2 &B) Return inner product (dot product) of A and B inline double operator^(const YsVec2 &A,const YsVec2 &B) Return outer product (cross product) of A and B. Since A and B are both 2D vectors, this function will return only z value. (Outer products is always going to be (0,0,z); inline int operator==(const YsVec2 &A,const YsVec2 &B) inline int operator!=(const YsVec2 &A,const YsVec2 &B) Compare two vectors. REFERENCE:
NAME:YsVec3 DESCRIPTION: 3D Vector class MEMBERFUNCTION: inline YsVec3(); Constructor. Does NOT initialize x,y and z to zero. inline YsVec3(double X,double Y,double Z); Constructor with initialization. inline double x(void) const Get x value. inline double y(void) const Get y value inline double z(void) const Get z value inline const double *GetValue(void) const Get a pointer to the array of x,y and z. inline void Set(double X,double Y,double Z) Set x,y and z value inline void SetX(double X) Set x value. inline void SetY(double Y) Set y value. inline void SetZ(double Z) Set z value. inline void Set(double V[3]) Set x,y and z value by an array. inline void Get(double &X,double &Y,double &Z) const Get x,y and z value. inline double GetSquareLength(void) const Get x*x+y*y+z*z inline double GetLength(void) const Get sqrt(x*x+y*y+z*z) YSBOOL IsNormalized(void) const; Return YSTRUE if this vector is normalized (having length of 1.0). Otherwise, return YSFALSE. YSRESULT Normalize(void); Normalize this vector. If the vector length is equal to zero, this function will return YSERR. If there's no err, return YSOK. YsVec3 GetArbitraryParpendicularVector(void); Get an arbitrary vector that is parpendicular to this vector. inline void RotateXY(double ANG); Rotate in XY plane. newX=x*cos(ANG)-y*sin(ANG); newY=x*sin(ANG)+y*cos(ANG); inline void RotateXZ(double ANG); Rotate in XZ plane. newX=x*cos(ANG)-z*sin(ANG); newZ=x*sin(ANG)+z*cos(ANG); inline void RotateYZ(double ANG); Rotate in YZ plane. newY=y*cos(ANG)-z*sin(ANG); newZ=y*sin(ANG)+z*cos(ANG); OPERATOR: inline YsVec3 operator-(const YsVec3 &A) Return -A inline YsVec3 operator-(const YsVec3 &A,const YsVec3 &B) Return A-B inline YsVec3 operator+(const YsVec3 &A,const YsVec3 &B) Return A+B inline YsVec3 operator/(const YsVec3 &A,double B) Return A/B inline YsVec3 operator*(const YsVec3 &A,double B) inline YsVec3 operator*(double B,const YsVec3 &A) Return A*B inline double operator*(const YsVec3 &A,const YsVec3 &B) Return inner product(dot product) of A and B inline YsVec3 operator^(const YsVec3 &A,const YsVec3 &B) Return outer product(cross product) of A and B inline int operator==(const YsVec3 &A,const YsVec3 &B) inline int operator!=(const YsVec3 &A,const YsVec3 &B) Compare A and B. REFERENCE:
NAME:YsZero DEFINITION: #define YsZero(A) YsEqual((A),0.0) DESCRIPTION: Check if A is equal to zero. If the absolute of A is smaller than YsTolerance, this macro will return YSTRUE. Otherwise YSFALSE. REFERENCE: