1.數(shù)據(jù)輸入
cin遇到空格或回車結(jié)束讀取。
#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.隨機(jī)數(shù)產(chǎn)生器
參考資料:
[1]C++隨機(jī)數(shù)函數(shù)庫(kù)
#include<iostream>
#include<random>
using namespace std;
int main()
{
//隨機(jī)數(shù)產(chǎn)生需要生成器和分布器
default_random_engine rng;
uniform_int_distribution<int> uniform(1,10);
rng.seed(10);
int nCnt = 10;
while (nCnt--)
{
cout << uniform(rng) <<" ";
}
system("pause");
}
基本思想是對(duì)的
#include<iostream>
#include<random>
#include<vector>
#include<memory.h>
#include<set>
using namespace std;
struct stPoint {
double x;
double y;
};
//基于RANSAC算法的直線擬合
//pstData:指向數(shù)據(jù)的指針
//nDataCnt:數(shù)據(jù)點(diǎn)個(gè)數(shù)
//nMinCnt:模型參數(shù)估計(jì)所需要的數(shù)據(jù)點(diǎn)的個(gè)數(shù)
//nMaxIterCnt:最大迭代次數(shù)
//nConsesusCntThreshold:模型一致性判斷準(zhǔn)則
//dModelMeanError:模型誤差
//返回值:返回0表示獲取最優(yōu)模型,否則表示未獲取最優(yōu)模型
void RansacLinear(stPoint* pPoints,int nCnt,double& dAA,double& dBB,double& dCC,int nIterCnt,double dMaxErrorThreshold)
{
//對(duì)于每一次迭代
//1.隨機(jī)選擇2個(gè)點(diǎn)
//2.得到模型參數(shù)
//3.計(jì)算內(nèi)點(diǎn)數(shù)量
//4.更新內(nèi)點(diǎn)數(shù)量最多的模型
//隨機(jī)數(shù)需要生成器和分布器
default_random_engine rng;
uniform_int_distribution<int> uniform(0,nCnt);
rng.seed(10);
int nBestRightCnt = 0;
while (nIterCnt)
{
//1.隨機(jī)選擇兩個(gè)點(diǎn)
set<int> sIndexs;
sIndexs.clear();
while (1)
{
sIndexs.insert(uniform(rng));
if (sIndexs.size() == 2)
break;
}
//2.得到模型參數(shù)
//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.統(tǒng)計(jì)內(nèi)點(diǎn)個(gè)數(shù)
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.保存內(nèi)點(diǎn)個(gè)數(shù)最多的模型
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);
}