• 大小: 4KB
    文件类型: .cpp
    金币: 1
    下载: 0 次
    发布日期: 2021-05-28
  • 语言: C/C++
  • 标签: Bezier  

资源简介

通过多个三维控制点 实现生成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++)//贝赛尔曲线上的点

评论

共有 条评论