sylvain231 a écrit:et si vous cherchiez la distance d'un point avec la parabole d'équation 0 = a * (cos(theta) * (x-sommet.x) + sin(theta) * (y-sommet.y))^2- sin(theta) * (x - sommet.x) - cos(theta) * (y - sommet.y) ?
sylvain231 a écrit:et le a (l'ouverture de la parabole) il est égal à quoi ?
sylvain231 a écrit:une équation du troisième degré ça se résout facilement avec les équations de Cardan
https://fr.wikipedia.org/wiki/M%C3%A9thode_de_Cardan
double E(vector <Point2d> points, int a, int b) {
double res = 0;
int n = points.size();
for (int i = 0; i < n; i++) {
res += pow(points[i].x, a) * pow(points[i].y, b);
}
return res / n;
}
void Parabole::fit(std::vector<cv::Point2d> points, cv::Point2d sommet) {
this->sommet = sommet;
int n = points.size();
cout << "sommet = " << sommet << endl;
points = translatePoint2ds(points, sommet);
double E40 = E(points, 4, 0);
double E31 = E(points, 3, 1);
double E22 = E(points, 2, 2);
double E13 = E(points, 1, 3);
double E04 = E(points, 0, 4);
double E21 = E(points, 2, 1);
double E30 = E(points, 3, 0);
double E12 = E(points, 1, 2);
double E03 = E(points, 0, 3);
double E02 = E(points, 0, 2);
double E11 = E(points, 1, 1);
double E20 = E(points, 2, 0);
double minimum = std::numeric_limits<double>::infinity();
for (double theta = 0; theta <= CV_PI; theta += CV_PI / 1000) {
double c = cos(theta);
double s = sin(theta);
double alpha = E40 * pow(c, 4) - 4 * E31 * pow(c, 3) * s + 6 * E22 * pow(c, 2) * pow(s, 2)
- 4 * E13 * c * pow(s, 3) + E04 * pow(s, 4);
double beta = E21 * pow(c, 3) + (E30 - 2 * E12) * pow(c, 2) * s +
(E03 - 2*E21) * c * pow(s, 2) + E12 * pow(s, 3);
double gamma = E02 * pow(c, 2) + 2 * E11 * c * s + E20 * pow(s, 2);
double Mmin = 0.5 * (alpha + gamma - sqrt(pow(alpha - gamma, 2) + 4 * pow(beta, 2)));
if (Mmin < minimum) {
minimum = Mmin;
this->theta_radians = theta;
}
}
double c = cos(this->theta_radians);
double s = sin(this->theta_radians);
double alpha = E40 * pow(c, 4) - 4 * E31 * pow(c, 3) * s + 6 * E22 * pow(c, 2) * pow(s, 2)
- 4 * E13 * c * pow(s, 3) + E04 * pow(s, 4);
double beta = E21 * pow(c, 3) + (E30 - 2 * E12) * pow(c, 2) * s +
(E03 - 2*E21) * c * pow(s, 2) + E12 * pow(s, 3);
double gamma = E02 * pow(c, 2) + 2 * E11 * c * s + E20 * pow(s, 2);
this->a = (1 / (2 * beta)) * (alpha - gamma - sqrt(pow(alpha - gamma, 2) + 4 * pow(beta, 2)));
this->theta = 180 * theta_radians / CV_PI;
}
leon1789 a écrit:sylvain231 a écrit:une équation du troisième degré ça se résout facilement avec les équations de Cardan
https://fr.wikipedia.org/wiki/M%C3%A9thode_de_Cardan
Ces formules passent par les nombres complexes, ensuite on aura 3 candidats possibles, il faudra retenir le bon (cf le message de Ben juste avant), puis chercher à minimiser une somme de façon brute (sans formule pour éliminer des inconnues), avec un ou plusieurs inconnues dans un domaine réel non borné, etc. C'est difficilement envisageable.
Ben314 a écrit:Bon, sinon, la méthode ci dessus, au niveau implémentation, ça donnerais ça :
A minimiser sous contrainte (en considérant theta connu) :
avec, (comme précédemment),
Sauf erreur, le minimum (sous contrainte) de est alors
qui est une fonction de theta qu'il faut minimiser (avec une boucle par exemple).
Et il est obtenu pour un rapport (la parabole ayant alors pour équation
Tout à fait, si !!!!leon1789 a écrit:Est-ce que ce n'est pas l'opposé pour p = a/b ?
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 55 invités
Tu pars déja ?
Identification
Pas encore inscrit ?
Ou identifiez-vous :