Блог пользователя Light_Yagami

Автор Light_Yagami, 13 лет назад, По-русски
Мне очень стыдно писать это сюда. Но это из-за измученности. Прошу помочь мне, я в этом деле не очень... Честно простите! http://pastebin.com/L0e7NqQx - это код. А задача: "Проверить принадлежность точки прямой".
  • Проголосовать: нравится
  • +3
  • Проголосовать: не нравится

13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Видимо, проще всего посчитать ориентированную площадь треугольника
13 лет назад, # |
  Проголосовать: нравится +4 Проголосовать: не нравится
  1.     double a = (x - x1) / (x2 - x1);
  2.     double b = (y - y1) / (y2 - y1);
  3. //    cout << a << " " << b << "\n";
  4.     if (a == b)
вещественные числа так обычно не сравнивают.
13 лет назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

Если у вас прямая задана точками x1,y1 и x2,y2, то найдите atan2(y1-y2, x1-x2) и atan2(y-y2, x-x2). Геометрический смысл - вы получаете азимуты точек x1,y1 и x,y глядя из точки x2,y2. Если они равны, либо противоположны, то точки на одной прямой. Точность ессно тем хуже чем дальше точки.

Можете взять азимуты из x,y на точки, задающие прямую. Догадайтесь, что с ними делать.

Можете тупо взять расстояния между точками (стороны треугольника) - очевидно, если точка на прямой, то треугольник должен быть вырожден и два расстояния должны в сумме давать третье (нужно рассмотреть ессно не только случай когда интересующая точка между двух других, но и когда вне). UPD: А, вы кажется так и сделали... Просто сравнивайте числа не точно, а с точностью например до одной миллионной доли наименьшего из расстояний.

Не готов спорить что это лучшие способы. Зато одни из наиболее легко записываемых программно. Ещё можно посчитать площадь треугольника образуемого точками (найдите формулу с гугла - площадь треугольника по координатам) - ессно она должна быть равна 0.

13 лет назад, # |
  Проголосовать: нравится -10 Проголосовать: не нравится
(x2-x1)*(y-y1)-(x-x1)*(y2-y1) == 0 - точка лежит на прямой
13 лет назад, # |
  Проголосовать: нравится +5 Проголосовать: не нравится
Во-первых, Вы явно пытаетесь проверить, что точка принадлежит отрезку. В любом случае, вполне очевидно, что сравнивать числа round-ом не стоит. Правильно проверять, что модуль разности не превосходит какого-нибудь маленького числа, например 1e-9.
13 лет назад, # |
  Проголосовать: нравится +6 Проголосовать: не нравится

Извините, конечно, если это не правильно, но точка лежит на прямой, когда расстояние от точки к прямой равно 0.

Находим коофициенты прямой ax + by + c = 0

a = y2 - y1

b = x1 - x2

c = -(a*x1 + b*y1)

Подставляем искомую точку (x0; y0)

Если a * x0 + b * y0 + c = 0, то точка принадлежит прямой, иначе нет.

  • 13 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится -6 Проголосовать: не нравится

    Да правильно конечно. Только слова про расстояние по-моему лишние. Вы просто определяете коэффициенты уравнения прямой (по двум точкам) и проверяете удовлетворяет ли искомая точка этому уравнению. %)

    Думаю, уравнение предложенное выше yahooo отражает эту же идею.

    UPD: Кстати, вычисление "ориентированной площади" о которой упоминалось в первом комментарии, по-моему, тоже даст эту же самую формулу. ;-)

    • 13 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

      Да все эти способы одно и то же, просто рассматривают проблему под разными углами.

13 лет назад, # |
  Проголосовать: нравится +4 Проголосовать: не нравится
Как я рад!))))) Спасибо всем!!!
13 лет назад, # |
  Проголосовать: нравится +13 Проголосовать: не нравится
System.out.println(new Line2D.Double(x1, y1, x2, y2).ptLineDist(x,y)<1e-9 ? "YES" : "NO");

:)
13 лет назад, # |
  Проголосовать: нравится +5 Проголосовать: не нравится
Блин, со своими "надо просить так, сяк" довели человека до такой степени, что он боится написать в блог! Наверное, думает, что опять какие-то "красные" начнут ляляля.
13 лет назад, # |
  Проголосовать: нравится +1 Проголосовать: не нравится

Научись сравнивать double используя eps

Пример  :

#define eps 1e-9

if (a-b>eps) ... 

13 лет назад, # |
  Проголосовать: нравится +4 Проголосовать: не нравится

Как сравнивать по eps?

Вообще, что такое eps?

eps - это какое-то очень маленькое число, обозначается оно как ε. Обычно ε бывает  ≈ 10 - 9.  Конечно, смотря на задачу, это значение может варьировать. 10 - 9 по-другому можно писать как 1е-9. 

Не всегда на языках программирования, 5 равен 5 (то есть (5 == 5) = false), если они вещественные(double, float, ...) То есть, для примерного вычисления мы ДОЛЖНЫ использовать ε.  

Как это использовать?

1) Проверка равности двух чисел:

if (abs(a - b) <= eps) then EQUAL; else NOTEQUAL.

2) Максимум из a и b:

if (a - b > eps) then a; else b.