2013年9月25日星期三(demo5_2点法式平面)
来源:互联网 发布:淘宝网怎么盈利 编辑:程序博客网 时间:2024/06/08 09:56
所谓点法式,就是
a(x-x0)+b*(y-y0)+c*(z-z0) =0;
点为直线上一点(x0,y0,z0)
法线为(a,b,c)
初步运行EXE,发现是判断点在平面的哪个区间。
先定义一个3D向量结构体
//3d点和向量
typedefstruct VECTOR3D_TYP
{
union
{
floatM[3];
struct
{
float x, y,z;
};
};
}VECTOR3D ,POINT3D, *VECTOR3D_PTR, * POINT3D_PTR;
并定义了2个变量
VECTOR3D plane_n; //平面法向量
POINT3D plane_p; //在平面上的点
设定了一个点法式平面结构体
//点法式平面
typedefstruct PLANE3D_TYP
{
POINT3D p0; //平面上的点
VECTOR3D n; //平面上的法线
}PLANE3D, * PLANE3D_PTR;
设定了平面
PLANE3D plane;
先输入平面法线
printf("\n输入平面的法线:nx,ny,nz:\n");
scanf("%f,%f,%f", &plane_n.x, &plane_n.y, &plane_n.z );
再输入平面上的点的坐标
printf("\n输入平面上的点:x,y,z\n");
scanf("%f,%f,%f", &plane_p.x, &plane_p.y, &plane_p.z );
3d点拷贝
voidddraw_math::POINT3D_COPY(POINT3D_PTR vdst,POINT3D_PTR vsrc )
{
vdst->x =vsrc->x;
vdst->y =vsrc->x;
vdst->z =vsrc->z;
}
向量拷贝
voidddraw_math::VECTOR3D_COPY(VECTOR3D_PTR vdst,VECTOR3D_PTR vsrc )
{
vdst->x =vsrc->x;
vdst->y =vsrc->y;
vdst->z =vsrc->z;
}
//设为0向量
voidddraw_math::VECTOR3D_ZERO(VECTOR3D_PTR v )
{
v->x = 0;
v->y = 0;
v->z = 0;
}
//向量归一化,va发生变化
voidddraw_math::VECTOR3D_Normalize(VECTOR3D_PTR va )
{
floatlength = sqrtf( va->x *va->x + va->y * va->y +va->z * va->z );
if (length < EPSILON_E5 )
{
return;
}
floatlength_inv = 1 / length;
va->x *=length_inv;
va->y *=length_inv;
va->z *=length_inv;
}
//归一化,向量存储在vn中
voidddraw_math::VECTOR3D_Normalize(VECTOR3D_PTR va,VECTOR3D_PTRvn )
{
VECTOR3D_ZERO(vn );
floatlength = sqrtf( va->x *va->x + va->y * va->y +va->z * va->z );
if (length < EPSILON_E5 )
{
return;
}
floatlength_inv = 1 / length;
va->x *=length_inv;
va->y *=length_inv;
va->z *=length_inv;
}
给定点法式确定平面,并且,若normalize为TRUE,则normalize归一化。
voidddraw_math::PLANE3D_Init(PLANE3D_PTR plane,POINT3D_PTR p0,VECTOR3D_PTR normal,int normalize = 0 )
{
POINT3D_COPY( &plane->p0, p0 );
if ( !normalize )
{
VECTOR3D_COPY( & plane->p0,p0 );
}
else
{
VECTOR3D_Normalize( normal, & plane->n );
}
}
确定点在平面的正面(平面法线的一侧),反面(法线的另一侧),还是平面上,
a(x-x0)*b(y-y0)*c(z-z0)>0->正面
a(x-x0)*b(y-y0)*c(z-z0)<0->反面
a(x-x0)*b(y-y0)*c(z-z0)=0->平面上
floatddraw_math::Compute_Point_In_Plane3D(POINT3D_PTR pt,PLANE3D_PTR plane )
{
floaths = plane->n.x * (pt->x - plane->p0.x ) +
plane->n.y * (pt->y - plane->p0.y ) +
plane->n.z * (pt->z - plane->p0.z );
returnhs;
}
用几个数字检验,OK了
- 2013年9月25日星期三(demo5_2点法式平面)
- 2013年9月25日星期三
- 2004年9月30日星期三
- 2006年9月13日星期三
- 2006年9月27日星期三
- 2007年5月9日 星期三
- 2017年8月9日 星期三
- 2013年9月11日星期三(demo8-7,三角形)
- 11月9日 星期三
- 2006年1月25日 星期三 晴
- webservice(2011年3月16日星期三)
- (2011年4月13、16日星期三、六)
- 2011年12月7日星期三(oracle读书笔记)
- 2011年12月21日 星期三(oracle读书笔记)
- 2013年11月13日星期三(DEMO8_9,三角形光栅化)
- 2013年11月20日星期三(DEMO8_10,BOB引擎)
- Delphia5开发指南->Code/Ch04(2010年9月8、14日星期三、二)
- 2006年10月4日 星期三
- 备忘录模式(Memento)
- 使用批处理脚本(BAT)调用FFMPEG批量编码视频
- 使用新浪微博分享图片文字(实战)
- SVN服务器搭建和使用(四)Svn 设置 修改 日志
- Jquery 实现 “下次自动登录” 记住用户名密码功能
- 2013年9月25日星期三(demo5_2点法式平面)
- EclipseRCP开发3-建立自定义菜单
- javascript面向对象(this)
- Nyoj 790 The More,the Better[基础并查集]
- ImagePreviewd.js 选择图片预览遇到的问题
- ios设计模式读书笔记----Abstract Factory(抽象工厂)
- ios 画图总结
- ant.xml 详解
- 4.2E2