Расстояние от данной точки до данного эллипсаC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Расстояние от данной точки до данного эллипса

Сообщение Anonymous »

У меня есть эллипс, определенный центральной точкой, радиусом X и радиусом Y, и у меня есть точка. Я хочу найти точку на эллипсе, ближайшую к данной точке. На рисунке ниже это будет S1.

Изображение


Теперь у меня уже есть код, но где-то в нем есть логическая ошибка, и я, кажется, не могу ее найти. Я разбил проблему на следующий пример кода:

Код: Выделить всё

#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);
}
Он создает следующее изображение:

Изображение


Вы можете видеть, что он действительно находит «ближайшие» точки на эллипсе, но это не самые «ближайшие» точки. Я намеренно хочу следующее: (извините за плохой рисунок)

Изображение


если бы вы расширили линии на последнем изображении, они бы пересекали центр эллипса, но это не относится к линиям на предыдущем изображении.

Надеюсь, вы поняли. Может кто-нибудь сказать мне, что я делаю не так?

Подробнее здесь: https://stackoverflow.com/questions/229 ... en-ellipse
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»