Search code examples
c++least-squares

Fit a Circle by Least Square Method


Hi I want to find a circle by least square methhod with lots of point I wrote this code, but it isn't work and no error message (My code has a function which FittingCircle I think my function (FittingCircle) is wrong But I can't find my error)

Thanks your adanced

  #include <iostream>
#include <iostream> 
#include <stdlib.h> 
#include <math.h> 

#define A(i,j) A[i + j * 3] 
using namespace std; 
bool FittingCircle(double* A, double* B) 
{ 

    double Sum; 
    double Diagonal[3]; 
    Sum= A(0,0); 
    if (Sum <= 0.f) return false; 
    Diagonal[0]= sqrt(Sum); 
    Sum= A(0,1); 
    A(1,0)= Sum / Diagonal[0]; 
    Sum= A(0,2); 
    A(2,0)= Sum / Diagonal[0]; 
    Sum= A(1,1) - A(1,0) * A(1,0); 
    if (Sum <= 0.f) return false; 
    Diagonal[1]= sqrt(Sum); 
    Sum= A(1,2) - A(1,0) * A(2,0); 
    A(2,1)= Sum / Diagonal[1]; 
    Sum= A(2,2) - A(2,1) * A(2,1) - A(2,0) * A(2,0); 
    if (Sum <= 0.f) return false; 
    Diagonal[2]= sqrt(Sum); 
    Sum= B[0]; 
    B[0]= Sum / Diagonal[0]; 
    Sum= B[1] - A(1,0) * B[0]; 
    B[1]= Sum / Diagonal[1]; 
    Sum= B[2] - A(2,1) * B[1] - A(2,0) * B[0]; 
    B[2]= Sum / Diagonal[2]; 
    Sum= B[2]; 
    B[2]= Sum / Diagonal[2]; 
    Sum= B[1] - A(2,1) * B[2]; 
    B[1]= Sum / Diagonal[1]; 
    Sum= B[0] - A(1,0) * B[1] - A(2,0) * B[2]; 
    B[0]= Sum / Diagonal[0]; 
    return true; 
} 
int main(int argc, char** argv) { 
    double matris[3]={25,30,50}; 
    double matris2[3]={40,25,50}; 

    FittingCircle(matris,matris2); 
    return 0; 
}  

Solution

  • Strange that your code don't crash.

    The first argument of FittingCircle() is a double pointer but is used as a matrix (via #define A(i,j) A[i + j * 3].

    So, reading in A(2,2), you read in A[2 + 2 * 3], that is A[8].

    But the first argument that you pass to FittingCircle() is

    double matris[3]={25,30,50};
    

    When you read in A[8], you read in matris[8].

    Very, very dangerous and undefined behaviour.

    p.s.: sorry for my bad English.