Мне очень стыдно писать это сюда. Но это из-за измученности. Прошу помочь мне, я в этом деле не очень... Честно простите! http://pastebin.com/L0e7NqQx - это код. А задача: "Проверить принадлежность точки прямой".
№ | Пользователь | Рейтинг |
---|---|---|
1 | tourist | 4009 |
2 | jiangly | 3823 |
3 | Benq | 3738 |
4 | Radewoosh | 3633 |
5 | jqdai0815 | 3620 |
6 | orzdevinwang | 3529 |
7 | ecnerwala | 3446 |
8 | Um_nik | 3396 |
9 | ksun48 | 3390 |
10 | gamegame | 3386 |
Страны | Города | Организации | Всё → |
№ | Пользователь | Вклад |
---|---|---|
1 | cry | 167 |
2 | Um_nik | 163 |
3 | maomao90 | 162 |
3 | atcoder_official | 162 |
5 | adamant | 159 |
6 | -is-this-fft- | 158 |
7 | awoo | 156 |
8 | TheScrasse | 154 |
9 | Dominater069 | 153 |
9 | nor | 153 |
Название |
---|
double a = (x - x1) / (x2 - x1); double b = (y - y1) / (y2 - y1); // cout << a << " " << b << "\n"; if (a == b)
вещественные числа так обычно не сравнивают.Если у вас прямая задана точками x1,y1 и x2,y2, то найдите atan2(y1-y2, x1-x2) и atan2(y-y2, x-x2). Геометрический смысл - вы получаете азимуты точек x1,y1 и x,y глядя из точки x2,y2. Если они равны, либо противоположны, то точки на одной прямой. Точность ессно тем хуже чем дальше точки.
Можете взять азимуты из x,y на точки, задающие прямую. Догадайтесь, что с ними делать.
Можете тупо взять расстояния между точками (стороны треугольника) - очевидно, если точка на прямой, то треугольник должен быть вырожден и два расстояния должны в сумме давать третье (нужно рассмотреть ессно не только случай когда интересующая точка между двух других, но и когда вне). UPD: А, вы кажется так и сделали... Просто сравнивайте числа не точно, а с точностью например до одной миллионной доли наименьшего из расстояний.
Не готов спорить что это лучшие способы. Зато одни из наиболее легко записываемых программно. Ещё можно посчитать площадь треугольника образуемого точками (найдите формулу с гугла - площадь треугольника по координатам) - ессно она должна быть равна 0.
Извините, конечно, если это не правильно, но точка лежит на прямой, когда расстояние от точки к прямой равно 0.
Находим коофициенты прямой ax + by + c = 0
a = y2 - y1
b = x1 - x2
c = -(a*x1 + b*y1)
Подставляем искомую точку (x0; y0)
Если a * x0 + b * y0 + c = 0, то точка принадлежит прямой, иначе нет.
Да правильно конечно. Только слова про расстояние по-моему лишние. Вы просто определяете коэффициенты уравнения прямой (по двум точкам) и проверяете удовлетворяет ли искомая точка этому уравнению. %)
Думаю, уравнение предложенное выше yahooo отражает эту же идею.
UPD: Кстати, вычисление "ориентированной площади" о которой упоминалось в первом комментарии, по-моему, тоже даст эту же самую формулу. ;-)
Да все эти способы одно и то же, просто рассматривают проблему под разными углами.
:)
Научись сравнивать double используя eps
Пример :
#define eps 1e-9
if (a-b>eps) ...
Как сравнивать по 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.