// 모델 구하기 public void CalcModels() { try { // 난수 발생 용 m_Rand = new Random(); RANSAC_Models = new List <RANSAC_Model>(); for (int i = 0; i < 12; i++) { // Model 구해서 RANSAC_Model Model = new RANSAC_Model(); Model.SelectedPoints = SelectTwoPoint(this.InputPoints); CalcConsensusPoints(Model, this.ConsensusThresholdDistance); // RANSAC_Models에 Add. this.RANSAC_Models.Add(Model); } } catch (Exception) { throw; } }
// 지지 점들 구하기 public void CalcConsensusPoints(RANSAC_Model Model, Double ConsensusThreshold) { try { Model.ConsensusPoints.Clear(); TwoPoints TwoPoints = Model.SelectedPoints; Double distance = 0; Point ptOne = TwoPoints.pt1; Point ptTwo = TwoPoints.pt2; for (int i = 0; i < this.InputPoints.Count; i++) { Double x1 = this.InputPoints[i].X; Double y1 = this.InputPoints[i].Y; // 거리 구하기 if (ptTwo.X == ptOne.X) {//x가 같으면 distance = Math.Abs(x1 - ptOne.X); } else if (ptTwo.Y == ptOne.Y) {//y가 같으면 distance = Math.Abs(y1 - ptOne.Y); } else { // 점(ptOne.X,ptOne.Y)를 지나는 직선의 방정식 : mx-y-m*ptOne.X+ptOne.Y = 0 // =====점(x1,y1)과 직선(ax+by+c=0)의 거리 구하는 공식==== // |ax1+by1+c| // ------------ // 루트(a제곱+b제곱) Double Slope = CalcSlope(TwoPoints); distance = Math.Abs(x1 * Slope + (-y1) + (-Slope * ptOne.X + ptOne.Y)) / (Math.Sqrt(Math.Pow(Slope, 2) + 1)); } if (distance < ConsensusThreshold) { Model.ConsensusPoints.Add(this.InputPoints[i]); } } } catch (Exception) { throw; } }
public void CalcSelectedPoints() { try { // 최대 컨센서스를 갖는 모델은? RANSAC_Model Model = new RANSAC_Model(); foreach (var model in this.RANSAC_Models) { if (Model.ConsensusPoints.Count < model.ConsensusPoints.Count) { Model = model; } } this.SelectedPoints = Model.SelectedPoints; } catch (Exception) { throw; } }
// Coefficient구하기 public void CalcCoefficient() { try { // 최대 컨센서스를 갖는 모델은? RANSAC_Model Model = new RANSAC_Model(); foreach (var model in this.RANSAC_Models) { if (Model.ConsensusPoints.Count < model.ConsensusPoints.Count) { Model = model; } } // a, b 구하기 Point pt1 = Model.SelectedPoints.pt1; Point pt2 = Model.SelectedPoints.pt2; double a, b; if (pt1.X != pt2.X) { a = (pt2.Y - pt1.Y) / (pt2.X - pt1.X); b = (pt2.X * pt1.Y - pt1.X * pt2.Y) / (pt2.X - pt1.X); } else { // X = C 직선 (y축과 평행한 직선) a = -9999; b = -9999; } this.Coefficient = new Point(a, b); } catch (Exception) { throw; } }