资源简介
通过多个三维控制点 实现生成Bezier样条曲线 并通过输入值(按照百分比 输入0-100即可) 得到曲线上的三维坐标。
代码片段和文件信息
/*
20171130 通过多个三维控制点 实现生成样条曲线 并通过输入值(按照百分比 输入0-100即可) 得到曲线上的三维坐标
*/
#include
#include
#include
typedef struct
{
float x;
float y;
float z;
} POINT3D;
/*
myOutXYZ()
第一个参数为输入的KeyPoints
第二个参数为输入点的数量
第三个参数为输入要想找到的样条曲线上点的位置(0 - 100)
第四个参数为输出的点的三维坐标
第五个参数为输入生成的样条曲线由多少个点构成 缺省默认为10000个
*/
void myOutXYZ(float *_InputAllDataPointer int _NumOfKeyPoint float _Input_Proportion/*百分比*/ float * &_OutputXYZ int _NumOfLinePts = 10000);
void myOutVec(std::vector &_InputPoints int _NumOfKeyPoint float _Proportion POINT3D &_Output3DPt int _NumOfLinePts);
//贝塞尔曲线
void drawCurve(int _n float _t std::vector _InputKeyPoints POINT3D &_Pt3D int _line_pts_num);
int main() {
// 5 为 点的数量 3 为 三维
float arr[5 * 3] = { 1 1 1
2 2 2
3 1 3
0 0 4
4 4 4};
float * result = new float[3];
//
myOutXYZ(arr 5 30.0 result);
std::cout << result[0] << std::endl;
std::cout << result[1] << std::endl;
std::cout << result[2] << std::endl;
delete[] result;
result = NULL;
return 0;
}
void myOutXYZ(float *_InputAllDataPointer int _NumOfKeyPoint float _Input_Proportion float * &_OutputXYZ int _NumOfLinePts) {
std::vector InputPoints;
POINT3D tempMyPt3D;
for (int i = 0; i < _NumOfKeyPoint * 3;) {
tempMyPt3D.x = _InputAllDataPointer[i++];
tempMyPt3D.y = _InputAllDataPointer[i++];
tempMyPt3D.z = _InputAllDataPointer[i++];
InputPoints.push_back(tempMyPt3D);
}
int g_pts_nums = InputPoints.size();
POINT3D OUTPUT_3DPT;
myOutVec(InputPoints g_pts_nums _Input_Proportion OUTPUT_3DPT _NumOfLinePts);
_OutputXYZ[0] = OUTPUT_3DPT.x;
_OutputXYZ[1] = OUTPUT_3DPT.y;
_OutputXYZ[2] = OUTPUT_3DPT.z;
}
void myOutVec(std::vector &_InputPoints int _NumOfKeyPoint float _Proportion POINT3D &_Output3DPt int _NumOfLinePts)
{
if (_Proportion > 100 && _Proportion < 0) {
// 报错
return;
}
POINT3D Start_3DPt;
POINT3D End_3DPt;
float Totallylength = 0.0;
std::vector OutputLinePoints;
if (_NumOfKeyPoint >= 3) {
for (int i = 0; i < _NumOfLinePts; i++)//贝赛尔曲线上的点
评论
共有 条评论