- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
2011noi冬令营讲稿刘汝佳
空间几何:概念、算法与应用;一、基本概念;点和向量(2D/3D);point + vector = point (2D/3D);vector + vector = vector (2D/3D);point - point = vector (2D/3D);point + point: 没有定义!!!;坐标系(2D/3D);二、点积;点积(dot product, 2D/3D);用坐标运算实现点积(2D);垂直向量(2D/3D);两点之间的距离;直线的参数方程(2D/3D);射线的参数方程(2D/3D);点到直线的距离(代数推导,2D/3D);;直线的一般式(2D);直线和线段相交判定(2D);平面的点法式(3D);点到平面的距离(3D);点到平面的距离(代数推导,3D);点到平面的距离(几何推导,3D);平面的一般式(3D);直线和平面的交点(3D);空间二直线的距离(3D);空间二直线的距离(3D);空间二直线的距离(3D);空间二直线的距离(3D);小结;练习1:点在平面上的投影;练习2:向量在平面上的投影;练习3:过定点垂直于定直线的平面;练习4:直线和平面的夹角;练习5:两平面的夹角;练习6:两直线的夹角;三、叉积;二维叉积(回顾);三维叉积;练习7:过三点的平面;练习8:两平面交线(参数式);练习9:三平面的位置关系;四、网格和多面体;多边形网格(Polymesh);多面体;四面体的体积;混合积(Scalar Triple Product);多面体的体积;空间两三角形相交(Uva 11275:3D Triangles);算法;两个四面体的最短距离(UVa11836:Star War);Paperweight (WF 2010, LA 4795);需要计算当压纸器处于稳定位置时芯片离电脑顶部的最近距离和最远距离。一个位置被认为是稳定的当且仅当重心向任意方向移动不超过0.2米压纸器都处于平衡,你可以认为压纸器密度统一,并且芯片体积足够小可以被认为是一个点。;Fairies’ Defence (Xi’an 2006, LA 3786);平面切割多面体;平面切割多面体(续);题外话:网格和3D游戏模型;课间休息 + Blender练习;五、凸包(难!);二维凸包(回顾);64 / 41;Aerodynamics (NEERC 2008, LA 4371);Asteroids (NEERC 2009, LA 4589);算法们;暴力法;for (int i = 0; i n; i++)
for (int j = i+1; j n; j++)
for (int k = j+1; k n; k++){
point direction = (X[j]-X[i]).cross(X[k]-X[i]);
int sign = 0;
bool good = true;
for (int m = 0; good m n; m++) if (m != i m != j m != k){
double dot = direction.dot(X[m]-X[i]);
int newsign = 0;
if (dot 0) newsign = 1; else if (dot 0) newsign = -1; else continue;
if (sign == 0) sign = newsign; else if (newsign != sign) good = false;
}
if (good) area += direction.length()/2;
};卷包裹法;void wrap(int i, int j) {
int k = i, l, m;
for(m = 0; m h; m++)
if ((I[m] == i J[m] == j) ||
(J[m] == i K[m] == j) ||
(K[m] == i I[m] == j))
return;
for(l = 0; l n; l++)
if(k == i || SignedVolume(P[i],P[j],P[k],P[l]) EPS)
k = l;
if(k == j) return;
I[h] = i; J[h] = j; K[h] = k;
h++;
a += Area(P[i], P[j], P[k]);
v += Volume (P[0], P[i], P[j], P[k]);
printf(“Found face:
原创力文档


文档评论(0)