1、点沿一个方向平移一段距离
代码:
{
pos;//待移动的点
dir;//方向
len;//位移量
result=pos+dir.normalize()*len;
}
2、给定点,与法向画半径为r的圆
代码:
//给定圆心法向半径
//指定输出点集的大小(num)
std::vector<Vec3> test(Vec3 center, Vec3 norm, int num, float radius)
{
float ref_num;
Vec3 dir;
if (!(abs(norm.X() - 0.f) < 0.00001f))
{
ref_num = norm.X();
auto temp= -(norm.Y()+ norm.Z());
dir = { temp / ref_num,1.0f,1.0f };
}
else if (!(abs(norm.Y() - 0.f) < 0.00001f))
{
ref_num = norm.Y();
auto temp = -(norm.X() + norm.Z());
dir = { 1.0f,temp / ref_num,1.0f };
}
else if (!(abs(norm.Z() - 0.f) < 0.00001f))
{
ref_num = norm.Z();
auto temp = -(norm.X() + norm.Y());
dir = { 1.0f,1.0f,temp / ref_num };
}
auto rot_rad = 0.0f;//已经旋转的角度
auto off_rad = 2 * (M_PI / num);//单次偏移角度
auto rot_dir = dir;//旋转后的方向
Vec3Vector result_vec;
while ((rot_rad < 2 * M_PI))
{
Vec3 inter_pos;
// 得到旋转矩阵;
core::Matrix44f spin_mat;
spin_mat.SetRotateRad(rot_rad, norm);
rot_rad += off_rad;
rot_dir = spin_mat * dir;
inter_pos = center + rot_dir.Normalize() * radius;
result_vec.push_back(inter_pos);
}
return result_vec;
}
3、流形网格
{
//三角网格曲面中,大多的算法基于流形网格manifold mesh,其定义如下:
//1)Each edge is incident to only one or two faces;
// 一条网格边为一个或两个网格三角面片共享;
//2)the faces incident to a vertex form a closed or an open fan。
//一个网格顶点的一环邻域三角片构成一个 闭合或者开放的扇面。
}
4、贝塞尔曲线数学公式
贝塞尔曲线是t的多项式,t的值被限制在0和1之间,并且含有a,b等参数。它采用了二次项的形式,听起来很神奇但实际上就是混合不同值的简单描述:
我明白你在想什么:这看起来并不简单,但如果我们拿掉t并让系数乘以1,事情就会立马简单很多,看看这些二次项:
需要注意的是,2与1+1相同,3相当于2+1或1+2,6相当于3+3...如你所见,每次我们增加一个维度,只要简单地将头尾置为1,中间的操作都是“将上面的两个数字相加”。现在就能很容易地记住了。
还有一个简单的办法可以弄清参数项怎么工作的:如果我们将(1-t)重命名为a,将t重命名为b,暂时把权重删掉,可以得到这个:
基本上它就是“每个a和b结合项”的和,在每个加号后面逐步的将a换成b。因此这也很简单。现在你已经知道了二次多项式,为了叙述的完整性,我将给出一般方程:
这就是贝塞尔曲线完整的描述。在这个函数中的Σ表示了这是一系列的加法(用Σ下面的变量,从...=<值>开始,直到Σ上面的数字结束)。
5、求一个方向上的最高点和最低点
Matrix44f newMatrix;
MathUtils::matrixFromNormal(ref_dir, Vec3(), newMatrix);
float max_z = -FLT_MAX;
Vec3 max_point;
for (int i = 0; i < border_points.size(); i++)
{
auto new_z = (Inverse(newMatrix) * border_points[i]).Z();
if (new_z > max_z)
{
max_z = new_z;
max_point = border_points[i];
}
}
//最低点同理求最小值的点即可。