Abstand vom gegebenen Punkt zur gegebenen ellipse

Ich habe eine ellipse, definiert durch Mittelpunkt, radiusX und radiusY, und ich habe einen Punkt. Ich möchte finden den Punkt auf der ellipse, die am nächsten zu den gegebenen Punkt. In der Abbildung unten, das wäre S1.

Abstand vom gegebenen Punkt zur gegebenen ellipse

Nun ich habe schon code, aber es ist ein logischer Fehler irgendwo, und ich scheinen nicht in der Lage sein, um es zu finden. Ich brach das problem auf die folgende code-Beispiel:

#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);
}

Es ergibt sich folgende Bild:

Abstand vom gegebenen Punkt zur gegebenen ellipse

Können Sie sehen, dass es tatsächlich findet "in der Nähe" der Punkte auf der ellipse, aber es sind nicht die "nächste" Punkte. Was ich bewusst will, ist diese: (entschuldigt meine schlechte Zeichnung)

Abstand vom gegebenen Punkt zur gegebenen ellipse

würden Sie, soweit Sie die Zeilen in dem letzten Bild, Sie würde durch die Mitte der ellipse, aber dies ist nicht der Fall für die Linien in der vorherigen Abbildung.

Ich hoffe, Sie bekommen das Bild. Kann mir jemand sagen was ich falsch mache?

  • es wird einfacher sein, wenn Sie nur beschreiben, Ihre Methode für die Suche nach dem Punkt, als der eigentliche code
InformationsquelleAutor user2950911 | 2014-04-09
Schreibe einen Kommentar