1.数据输入
cin遇到空格或回车结束读取。
#include<iostream>
#include<vector>
using namespace std;
struct stPoint
{
double x;
double y;
};
int main()
{
int nNum;
cin >> nNum;
vector<stPoint> vecPoints(nNum);
for (int i = 0; i < nNum; i++)
{
cin >> vecPoints[i].x >> vecPoints[i].y;
}
for (int i = 0; i < nNum; i++)
{
cout << vecPoints[i].x << " " << vecPoints[i].y << endl;
}
system("pause");
}
2.随机数产生器
参考资料:
[1]C++随机数函数库
#include<iostream>
#include<random>
using namespace std;
int main()
{
//随机数产生需要生成器和分布器
default_random_engine rng;
uniform_int_distribution<int> uniform(1,10);
rng.seed(10);
int nCnt = 10;
while (nCnt--)
{
cout << uniform(rng) <<" ";
}
system("pause");
}
基本思想是对的
#include<iostream>
#include<random>
#include<vector>
#include<memory.h>
#include<set>
using namespace std;
struct stPoint {
double x;
double y;
};
//基于RANSAC算法的直线拟合
//pstData:指向数据的指针
//nDataCnt:数据点个数
//nMinCnt:模型参数估计所需要的数据点的个数
//nMaxIterCnt:最大迭代次数
//nConsesusCntThreshold:模型一致性判断准则
//dModelMeanError:模型误差
//返回值:返回0表示获取最优模型,否则表示未获取最优模型
void RansacLinear(stPoint* pPoints,int nCnt,double& dAA,double& dBB,double& dCC,int nIterCnt,double dMaxErrorThreshold)
{
//对于每一次迭代
//1.随机选择2个点
//2.得到模型参数
//3.计算内点数量
//4.更新内点数量最多的模型
//随机数需要生成器和分布器
default_random_engine rng;
uniform_int_distribution<int> uniform(0,nCnt);
rng.seed(10);
int nBestRightCnt = 0;
while (nIterCnt)
{
//1.随机选择两个点
set<int> sIndexs;
sIndexs.clear();
while (1)
{
sIndexs.insert(uniform(rng));
if (sIndexs.size() == 2)
break;
}
//2.得到模型参数
//set取值要注意
vector<stPoint> vecPoints;
vecPoints.clear();
for (auto iter = sIndexs.begin(); iter != sIndexs.end(); iter++)
{
vecPoints.push_back(pPoints[*iter]);
}
double dDeltaY = vecPoints[0].y-vecPoints[1].y;
double dDeltaX = vecPoints[0].x-vecPoints[1].y;
double dA = -dDeltaY;
double dB = dDeltaX;
double dC = dDeltaY*vecPoints[0].x - dDeltaX*vecPoints[0].y;
//3.统计内点个数
int nRightCnt = 0;
for (int i = 0; i < nCnt; i++)
{
double distance = abs(dA*pPoints[i].x + dB*pPoints[i].y + dC) / sqrt(dA*dA+dB*dB);
if (distance < dMaxErrorThreshold)
nRightCnt++;
}
//4.保存内点个数最多的模型
if (nRightCnt > nBestRightCnt)
{
nBestRightCnt = nRightCnt;
dAA = dA;
dBB = dB;
dCC = dC;
}
nIterCnt--;
}
}
int main()
{
int nNum;
cin >> nNum;
vector<stPoint> v(nNum);
for (int i = 0; i < nNum; i++)
{
cin >> v[i].x >> v[i].y;
}
int nCount = v.size();
double dA, dB, dC, dMeanError;
dA = dB = dC = 0;
RansacLinear(v.data(),v.size(),dA,dB,dC,35,0.1);
}