Ho un'ellisse, definita da Punto centrale, raggioX e raggioY, e ho un punto. Voglio trovare il punto sull'ellisse più vicino al punto specificato. Nell'illustrazione seguente, sarebbe S1.distanza dal punto dato a un'ellisse dato
Ora ho già il codice, ma c'è un errore logico da qualche parte in esso, e mi sembra di essere in grado di trovarlo. Ho rotto il problema verso il basso per il seguente esempio di codice:
#include <vector>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <math.h>
using namespace std;
void dostuff();
int main()
{
dostuff();
return 0;
}
typedef std::vector<cv::Point> vectorOfCvPoints;
void dostuff()
{
const double ellipseCenterX = 250;
const double ellipseCenterY = 250;
const double ellipseRadiusX = 150;
const double ellipseRadiusY = 100;
vectorOfCvPoints datapoints;
for (int i = 0; i < 360; i+=5)
{
double angle = i/180.0 * CV_PI;
double x = ellipseRadiusX * cos(angle);
double y = ellipseRadiusY * sin(angle);
x *= 1.4;
y *= 1.4;
x += ellipseCenterX;
y += ellipseCenterY;
datapoints.push_back(cv::Point(x,y));
}
cv::Mat drawing = cv::Mat::zeros(500, 500, CV_8UC1);
for (int i = 0; i < datapoints.size(); i++)
{
const cv::Point & curPoint = datapoints[i];
const double curPointX = curPoint.x;
const double curPointY = curPoint.y * -1; //transform from image coordinates to geometric coordinates
double angleToEllipseCenter = atan2(curPointY - ellipseCenterY * -1, curPointX - ellipseCenterX); //ellipseCenterY * -1 for transformation to geometric coords (from image coords)
double nearestEllipseX = ellipseCenterX + ellipseRadiusX * cos(angleToEllipseCenter);
double nearestEllipseY = ellipseCenterY * -1 + ellipseRadiusY * sin(angleToEllipseCenter); //ellipseCenterY * -1 for transformation to geometric coords (from image coords)
cv::Point center(ellipseCenterX, ellipseCenterY);
cv::Size axes(ellipseRadiusX, ellipseRadiusY);
cv::ellipse(drawing, center, axes, 0, 0, 360, cv::Scalar(255));
cv::line(drawing, curPoint, cv::Point(nearestEllipseX,nearestEllipseY*-1), cv::Scalar(180));
}
cv::namedWindow("ellipse", CV_WINDOW_AUTOSIZE);
cv::imshow("ellipse", drawing);
cv::waitKey(0);
}
Produce la seguente immagine:
Si può vedere che trova in realtà punti "vicino" sul ellisse, ma non sono i punti "più vicini". Quello che intenzionalmente voglio è questa: (scusate il mio povero disegno)
sarebbe si misura le righe l'ultima immagine, che avrebbe attraversato il centro dell'ellisse, ma questo non è il caso per le linee nell'immagine precedente.
Spero che tu abbia la foto. Qualcuno può dirmi cosa sto facendo di sbagliato?
sarà più facile se Basta descrivere il tuo metodo per trovare il punto che il codice vero e proprio – rank1