2016-05-18 5 views
0

Hallo Ich möchte einen Kreis von kleinsten quadratischen method mit viel Punkt finden Ich schrieb diesen Code, aber es ist nicht funktionieren und keine Fehlermeldung (Mein Code hat eine Funktion, die FittingCircle I glaube, meine Funktion (FittingCircle) falsch ist, aber ich kann meine Fehler nicht finden)Fit einen Kreis von Least Square Methode

Dank Ihrer 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; 
} 

Antwort

0

Seltsam, dass der Code nicht abstürzen.

Das erste Argument von FittingCircle() ist ein double Zeiger, sondern als Matrix (via #define A(i,j) A[i + j * 3] verwendet.

Also, in A(2,2) Lesen Sie in A[2 + 2 * 3] lesen, dass A[8] ist.

Aber das erste Argument dass Sie FittingCircle() passieren

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

ist Wenn Sie in A[8] lesen, lesen Sie in matris[8].

Sehr, sehr gefährliches und undefiniertes Verhalten.

ps.entschuldigung für mein schlechtes Englisch.

+0

Ok! Vielen Dank Jetzt bin ich verwirrt Was sollte in Matris stattdessen schreiben Zum Beispiel – aspodap

+0

Ich schrieb diese, aber ich kann kein Ergebnis erhalten Doppel-Matris [8] = {25,30,50,40,20,71,43,78 }; double matris2 [8] = {40,25,50,42,35,74,53,24}; FittingCircle (Matris, Matris2); Rückgabe 0; – aspodap

+0

@aspodap - Ich kenne Ihren Algorithmus nicht, also weiß ich nicht, was Sie genau machen müssen. Aber wenn Sie 'A [8]' (also 'matris [8] ') lesen, muss' mastris' ** ** mindestens 9-stellig sein, also' doppelte matris [9] = {/ * neun Werte * /}; '. Über 'matris2' sehe ich, dass man nur in den Positionen 0, 1 und 2 liest und schreibt. Also sollte 'double matris2 [3] = {/ * drei valuse * /}; 'genug sein. – max66