как определить точку вверх или вниз по линии в C # - PullRequest
0 голосов
/ 10 мая 2018

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

    public static PointToLineSituation WhereIsPoint(Line l, Point p)
    {
        var x = p.X;
        var y = p.Y;
        var x1 = l.X1;
        var x2 = l.X2;
        var y1 = l.Y1;
        var y2 = l.Y2;

        var d = (x - x1) * (y1 - y2) - (y - y1) * (x2 - x1);

        if (d > 0)
            return PointToLineSituation.Up;

        if (d < 0)
            return PointToLineSituation.Down;

        return PointToLineSituation.OnLine;
    }

Я хочу использовать в графической координации. Это моя проблема? Любая помощь будет оценена.

Вот пример системы координации, точки вверх и точки вниз, как показано ниже:

enter image description here

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Подход к нескольким продуктам не говорит нам - находится ли точка вверх или вниз, он просто определяет ориентацию триплета P1-P2-P. Чтобы получить необходимую информацию, вы также должны быть уверены в направлении линии. Самый простой способ - отменить знак результата, когда X2 < X1 (обратите внимание, что регистр вертикальной линии X1=X2 для вас особенный или недопустимый).

Также обратите внимание, что различия в точках линий должны быть согласованы

var d = (x - x1) * (y2 - y1) - (y - y1) * (x2 - x1);
if (x2 < x1)
        d = -d;
0 голосов
/ 10 мая 2018

Ваша формула почти (вы поменялись местами y1, y2) верна.Важен не результат этой формулы, а знак результата.

Точность результата зависит от типа данных, предпочитайте double.

Этого

double d = (x - x1) * (y2 - y1) - (y - y1) * (x2 - x1);

должно быть достаточно ... но числовые проблемы могут привести кнеправильный результат.

Подробнее о плавающей точке в Что должен знать каждый компьютерщик об арифметике с плавающей точкой

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...