现在很想封装下3D的,将所谓的难度踏在脚下,好,现在准备了
代码到哪里,分析到哪里
首先,包含各种头文件
#include "common.h"
#include "DDraw_Interface.h"
using namespace std;
HWND main_window_handle;
void main()
{
cout<<endl<<"2D Parametrice Line Intersector"<<endl;
接下来,就是
POINT2D p1,p2,p3,p4;
4个2维坐标点,看下定义。
以前是这样定义的
typedef struct VERTEX2DF_TYP
{
float x,y; // the vertex
} VERTEX2DF, *VERTEX2DF_PTR;
现在不但当做点,还当做向量,
//2d点和向量
typedef struct VECTOR2D_TYP
{
union
{
float M[2];
struct
{
float x, y;
};
};
}VECTOR2D ,POINT2D, * VECTOR2D_PTR, * POINT2D_PTR;
//参数化D直线
typedef struct PARMLINE2D_TYP
{
POINT2D p0; //起点
POINT2D p1; //终点
VECTOR2D v; //方向向量p0->p1
}PARMLINE2D, * PARMLINE2D_PTR;
初始化向量,就是把源向量赋值给目标向量
oid ddraw_math::VECTOR2D_INIT( VECTOR2D_PTR vdst, VECTOR2D_PTR vsrc )
{
vdst->x = vsrc->x;
vdst->y = vsrc->y;
}
//从两点直接建立一个向量
void ddraw_math::VECTOR2D_Build( VECTOR2D_PTR init, VECTOR2D_PTR term, VECTOR2D_PTR result )
{
result->x = term->x -init->x;
result->y = term->y - init->y;
}
//计算参数化直线的终点
void ddraw_math::Compute_Parm_Line2D( PARMLINE2D_PTR p, float t, POINT2D_PTR pt )
{
pt->x = p->p0.x+ p->v.x * t;
pt->y = p->p0.y+ p->v.y * t;
}
DEMO5_1是个参数化2D直线,我个人觉得实际上就是参数化线段,2D和3D都一样,不过是2维或者3维的问题。
公式有两种形式
(1)
P=p1+ t * (p2 – p1 ) t在[0,1]之间
当 t = 0时,p=p1;
当t = 1时,p=p2
(2)P=p1+t * v;
其实就是变体,v=(p2-p1)/[p2-p1,|
t取值在[0,|p2-p1|],,
下边又讲了线与线的交点,
是个控制台程序,输入几个值后是正确的,
添加的成员函数如下:
void ddraw_math ::Init_Parm_Line2D( POINT2D_PTR p_init, POINT2D_PTR p_term, PARMLINE2D_PTR p )
{
VECTOR2D_INIT( & ( p->p0 ), p_init );
VECTOR2D_INIT( & ( p->p1), p_term );
VECTOR2D_Build( p_init, p_term, & ( p->v));
}
void ddraw_math::VECTOR2D_INIT( VECTOR2D_PTR vdst, VECTOR2D_PTR vsrc )
{
vdst->x = vsrc->x;
vdst->y = vsrc->y;
}
void ddraw_math::VECTOR2D_Build( VECTOR2D_PTR init, VECTOR2D_PTR term, VECTOR2D_PTR result )
{
result->x = term->x -init->x;
result->y = term->y - init->y;
}
int ddraw_math::Intersect_Parm_Lines2D( PARMLINE2D_PTR p1, PARMLINE2D_PTR p2, float * t1, float * t2 )
{
float del_p1p2 = ( p1->v.x * p2->v.y - p1->v.y * p2->v.x );
if ( fabs(del_p1p2) <= EPSILON_E5 )
{
return PARM_LINE_NO_INTERSECT;
}
* t1 = ( p2->v.x * ( p1->p0.y - p2->p0.y ) - p2->v.y * ( p1->p0.x - p2->p0.x )) / del_p1p2;
* t2 = ( p1->v.x * ( p1->p0.y - p2->p0.y ) - p1->v.y * ( p1->p0.x - p2->p0.x )) / del_p1p2;
if ( ( * t1 >= 0 ) && ( * t1 <= 1 ) && ( * t2 >= 0 ) && ( * t2 <= 1 ))
{
return ( PARM_LINE_INTERSECT_IN_SEGMENT );
}
else
{
return (PARM_LINE_INTERSECT_OUT_SEGMENT );
}
}
void ddraw_math::Compute_Parm_Line2D( PARMLINE2D_PTR p, float t, POINT2D_PTR pt )
{
pt->x = p->p0.x+ p->v.x * t;
pt->y = p->p0.y+ p->v.y * t;
}