Abstand von einem gegebenen Punkt zu einer gegebenen EllipseC++

Programme in C++. Entwicklerforum
Anonymous
 Abstand von einem gegebenen Punkt zu einer gegebenen Ellipse

Post by Anonymous »

Ich habe eine Ellipse, definiert durch Mittelpunkt, RadiusX und RadiusY, und ich habe einen Punkt. Ich möchte den Punkt auf der Ellipse finden, der dem angegebenen Punkt am nächsten liegt. In der Abbildung unten wäre das S1.

Image


Jetzt habe ich bereits Code, aber irgendwo darin ist ein logischer Fehler, und ich kann ihn anscheinend nicht finden. Ich habe das Problem auf das folgende Codebeispiel heruntergebrochen:

Code: Select all

#include 
#include 
#include 
#include 

using namespace std;

void dostuff();

int main()
{
dostuff();
return 0;
}

typedef std::vector 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 erzeugt das folgende Bild:

Image


Sie können sehen, dass es tatsächlich „nahe“ Punkte auf der Ellipse findet, aber es sind nicht die „nächsten“ Punkte. Was ich absichtlich möchte, ist Folgendes: (Entschuldigen Sie meine schlechte Zeichnung)

Image


Würden Sie die Linien im letzten Bild verlängern, würden sie die Mitte der Ellipse kreuzen, aber das ist bei den Linien im vorherigen Bild nicht der Fall.

Das hoffe ich Du verstehst das Bild. Kann mir jemand sagen, was ich falsch mache?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post