Как узнать, находиться ли точка внутри эллипса?
Так вот, пишу курсовую и встал. Взял класс ellipseShape c страницы sfml. Все рисует все работает
Но вот попадание внутрь не могу реализовать. Совет использовать каноническую уравнение эллипса не подходит потому, что не могу найти a и b. Если можно же все таки, найти посоветуйте. Может, как-то с помощью библиотечных методов?
Хедер файл:
#include <SFML/Graphics/Shape.hpp>
#pragma once
#include <iostream>
using namespace sf;
class EllipseShape : public sf::Shape
{
private:
Vector2f m_radius;
public:
EllipseShape* ellipse;
explicit EllipseShape(const Vector2f& radius = Vector2f(0.f, 0.f)) : m_radius(radius){
update();
}
void setRadius(const Vector2f& radius);
const Vector2f& getRadius() const;
virtual size_t getPointCount() const;
virtual Vector2f getPoint(size_t index) const;
};
cpp файл:
#include "EllipseShape.h"
#include <iostream>
using namespace std;
void EllipseShape::setRadius(const Vector2f& radius)
{
m_radius = radius;
update();
}
const Vector2f& EllipseShape::getRadius() const
{
return m_radius;
}
size_t EllipseShape::getPointCount() const
{
return 30; // fixed, but could be an attribute of the class if needed
}
Vector2f EllipseShape::getPoint(std::size_t index) const
{
static const float pi = 3.141592654f;
float angle = index * 2 * pi / getPointCount() - pi / 2;
float x = cos(angle) * m_radius.x;
float y = sin(angle) * m_radius.y;
return Vector2f(m_radius.x + x, m_radius.y + y);
}
Ответы (1 шт):
Автор решения: Kromster
→ Ссылка
- Переносим начало координат в центр эллипса (так проще). Т.е. от положения точки отнимаем положение эллипса, а положение эллипса делаем 0:0.
- Узнаем ширину w и высоту d эллипса (он же у вас ориентирован по осям?).
- Рассчитываем коэффициент f растяжения по высоте (w / d).
- Умножаем положение проверяемой точки по высоте на этот коэффициент f.
- Теперь у нас типовая задачка на попадание точки в круг радиуса w/2. Решаете.