Merge pull request #5649 from hoangviet1985:solve_pow(x,3)=0_opencv300
This commit is contained in:
commit
ddf293a081
@ -44,6 +44,7 @@
|
|||||||
#include "precomp.hpp"
|
#include "precomp.hpp"
|
||||||
#include "opencl_kernels_core.hpp"
|
#include "opencl_kernels_core.hpp"
|
||||||
#include <limits>
|
#include <limits>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
namespace cv
|
namespace cv
|
||||||
{
|
{
|
||||||
@ -1998,10 +1999,10 @@ int cv::solveCubic( InputArray _coeffs, OutputArray _roots )
|
|||||||
double Qcubed = Q * Q * Q;
|
double Qcubed = Q * Q * Q;
|
||||||
double d = Qcubed - R * R;
|
double d = Qcubed - R * R;
|
||||||
|
|
||||||
if( d >= 0 )
|
if( d > 0 )
|
||||||
{
|
{
|
||||||
double theta = acos(R / std::sqrt(Qcubed));
|
double theta = acos(R / sqrt(Qcubed));
|
||||||
double sqrtQ = std::sqrt(Q);
|
double sqrtQ = sqrt(Q);
|
||||||
double t0 = -2 * sqrtQ;
|
double t0 = -2 * sqrtQ;
|
||||||
double t1 = theta * (1./3);
|
double t1 = theta * (1./3);
|
||||||
double t2 = a1 * (1./3);
|
double t2 = a1 * (1./3);
|
||||||
@ -2010,11 +2011,27 @@ int cv::solveCubic( InputArray _coeffs, OutputArray _roots )
|
|||||||
x2 = t0 * cos(t1 + (4.*CV_PI/3)) - t2;
|
x2 = t0 * cos(t1 + (4.*CV_PI/3)) - t2;
|
||||||
n = 3;
|
n = 3;
|
||||||
}
|
}
|
||||||
|
else if( d == 0 )
|
||||||
|
{
|
||||||
|
if(R >= 0)
|
||||||
|
{
|
||||||
|
x0 = -2*pow(R, 1./3) - a1/3;
|
||||||
|
x1 = pow(R, 1./3) - a1/3;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
x0 = 2*pow(-R, 1./3) - a1/3;
|
||||||
|
x1 = -pow(-R, 1./3) - a1/3;
|
||||||
|
}
|
||||||
|
x2 = 0;
|
||||||
|
n = x0 == x1 ? 1 : 2;
|
||||||
|
x1 = x0 == x1 ? 0 : x1;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
double e;
|
double e;
|
||||||
d = std::sqrt(-d);
|
d = sqrt(-d);
|
||||||
e = std::pow(d + fabs(R), 0.333333333333);
|
e = pow(d + fabs(R), 1./3);
|
||||||
if( R > 0 )
|
if( R > 0 )
|
||||||
e = -e;
|
e = -e;
|
||||||
x0 = (e + Q / e) - a1 * (1./3);
|
x0 = (e + Q / e) - a1 * (1./3);
|
||||||
|
@ -2330,6 +2330,17 @@ void Core_SolvePolyTest::run( int )
|
|||||||
pass = pass && div < err_eps;
|
pass = pass && div < err_eps;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//test x^3 = 0
|
||||||
|
cv::Mat coeffs_5623(4, 1, CV_64FC1);
|
||||||
|
cv::Mat r_5623(3, 1, CV_64FC2);
|
||||||
|
coeffs_5623.at<double>(0) = 1;
|
||||||
|
coeffs_5623.at<double>(1) = 0;
|
||||||
|
coeffs_5623.at<double>(2) = 0;
|
||||||
|
coeffs_5623.at<double>(3) = 0;
|
||||||
|
double prec_5623 = cv::solveCubic(coeffs_5623, r_5623);
|
||||||
|
pass = pass && r_5623.at<double>(0) == 0 && r_5623.at<double>(1) == 0 && r_5623.at<double>(2) == 0;
|
||||||
|
pass = pass && prec_5623 == 1;
|
||||||
|
|
||||||
if (!pass)
|
if (!pass)
|
||||||
{
|
{
|
||||||
ts->set_failed_test_info(cvtest::TS::FAIL_INVALID_OUTPUT);
|
ts->set_failed_test_info(cvtest::TS::FAIL_INVALID_OUTPUT);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user