华科机卓实验 平面截三角形拟合的立体图形

朋友给我的一个题目,让我写写看。
具体的题目可以见代码后附,这里简单描述一下。

就跟PS里可以用画多边形来抠曲线图形一样,三维的任意形状的物体也可以用很多个三维空间的三角形来拟合,只要拟合的单位足够多,最后的效果会不错。
用拟合的图形代替原图形,再用一个给定的平面去截,截到三角形的边上时会得到很多交点,全部连起来就可以得到截面图形。

给出一系列三角形,再输入一个平面,求该平面与每个三角形每条边的交点。如果无交点或者交点不在线段上,都算作没有。
至于重合的情况,暂时算作不计,但是后期要修改的话依然可以改。

输入格式
第一行:点的数量
第二行开始:点的 X Y Z坐标
在这里插入图片描述
点的坐标最后一行之后:三角形的数量
下一行开始:三角形三个顶点的编号,编号按照上面的顺序(从零开始计数)
在这里插入图片描述
输出格式
他没跟我讲,我就随便输出了。
根据线段和平面的关系,有四种输出。
相交->交点坐标
平行但不包含->Paraell
包含->Included
相交但交点不在线段上->Exceed

编辑器为UTF-8格式,如果用devcpp等打开乱码,请先用记事本打开后,存储为ANSI。

#include <stdio.h>
typedef struct _coor
{
   
	double x,y,z;
}Coor;//单个点坐标
typedef Coor Vector;//向量和点的存储形式是一样的,但是还是区分一下
typedef struct _triangle
{
   
	int pid1,pid2,pid3;
}Triangle;//由于单个点已经存入了,为了减少存储负担,这里只存储点的序号

Coor* cList;int coorCnt;
//点的数组,由于输入数据可能非常大,采用手动在堆里申请的策略防止爆栈
Triangle* tList;int triangleCnt;
//三角形的数组
double A,B,C,D;
//最后输入的平面的参数
Vector normalVec;
//平面的法向量
int isCommandOutput=1;//命令行输出开关
int isFileOutput=1;//文件输出开关

double innerProduct(Vector a,Vector b);
//计算两向量的内积
Vector calVector(Coor from,Coor to);
//返回从from指向to的向量
void TSintersect(Triangle t);
//Triangle and Surface Intersect
//处理单个三角形
int LSintersect(Coor p1,Coor p2,Coor *r);
//Line and Surface Intersect
//处理单条线段
int isBetween(double n1,double n2,double candi);
//检测数candi是否在n1和n2之间,配合isOnTheLine使用来检测交点是否在线段上
int isOnTheLine(Coor p1,Coor p2,Coor c);
//检测点c是否在线段p1p2上

int main(int argc, char const *argv[])
{
   
	//测试数据从当前目录的Res01.txt读入
	//结果将同时在命令行和文件output.txt输出,可以自行修改
	FILE *f=fopen("Res01.txt","r");int i;
	if
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值