Страницы

Поиск по вопросам

пятница, 5 июля 2019 г.

Алгоритм попадания точки в кривую

Есть класс для отрисовки кривой:
class Curve { // Набор точек. public List Points {get; set;}
// Толщина кривой. public int Thinkness {get; set;}
public void Draw(Graphics g) { using (var pen = new Pen(Color.Black, Thinkness)) { g.DrawCurve(pen, Points); } } }
Отрисовка выполняется методом Graphics.DrawCurve. Нужно добавить метод, который будет определять, принадлежит ли произвольная точка этой кривой:
public bool Contains(Point pt);
Кто-нибудь может подсказать алгоритм, с помощью которого можно решить данную задачу? Может быть, каким-то образом можно использовать Matrix или сам Graphics?


Ответ

Придумал следующее решение. В методе Draw рисуем не закругление (DrawCurve), а Path (DrawPath). Способ получения Path и пера выносим в отдельные методы. После этого используем метод IsOutlineVisible для получения информации о вхождении точки в Path.
class Curve { // Набор точек. public List Points {get; set;}
// Толщина кривой. public int Thinkness {get; set;}
private GraphicsPath GetPath() { var path = new GraphicsPath(); path.AddCurve(Points.ToArray()); return path; }
private Pen GetPen() { return new Pen(Color.Black, Thinkness); }
public void Draw(Graphics g) { using (var pen = GetPen()) using (var path = GetPath()) { g.DrawPath(pen, path); } }
public bool Contains(Point p) { using (var pen = GetPen()) using (var path = GetPath()) { return path.IsOutlineVisible(p, pen); } } }

Комментариев нет:

Отправить комментарий