Форум программистов, компьютерный форум CyberForum.ru

Переместить точку на линию в 2D - C++

Восстановить пароль Регистрация
 
sooqua
15 / 9 / 0
Регистрация: 23.02.2012
Сообщений: 135
22.09.2014, 18:10     Переместить точку на линию в 2D #1
Помогите, в гугле ничего не нашел. Только расстояние, которое получилось измерить вот так:
C++
1
2
3
4
5
int A = px - x1;
int B = py - y1;
int C = x2 - x1;
int D = y2 - y1;
int dist = abs(A * D - C * B) / sqrt(C * C + D * D);
Мне нужно переместить точку на ближайшую часть линии (перпендикулярно).

Добавлено через 1 час 3 минуты
бамп
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.09.2014, 18:10     Переместить точку на линию в 2D
Посмотрите здесь:

Как закрасить линию? C++
C++ Найти точку D, симметричную точку A относительно стороны BC.
Заменить линию кода C++
Как нарисовать линию? C++
Сколько автобусов вышло на линию? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Scrooge McDuck
Заблокирован
22.09.2014, 18:45     Переместить точку на линию в 2D #2
Где координаты Х и У точки? Где уравнение прямой ?

Добавлено через 19 минут
Молчишь? Ну и молчи В общем тебе надо искать единственную точку пересечения прямой и окружности
sooqua
15 / 9 / 0
Регистрация: 23.02.2012
Сообщений: 135
22.09.2014, 18:54  [ТС]     Переместить точку на линию в 2D #3
Координаты точки меняются, так что это значения иметь не должно.
А при чем здесь окружность? :/

Добавлено через 6 минут
Нашел вот такой код, работает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#define dot(u,v)   ((u).x * (v).x + (u).y * (v).y)
vector2i distance_Point_to_Segment(vector2i P, vector2i SP0, vector2i SP1)
{
    vector2i v = SP1 - SP0;
    vector2i w = P - SP0;
 
    double c1 = dot(w, v);
    double c2 = dot(v, v);
 
    double b = c1 / c2;
    vector2i Pb = SP0 + vector2i(v.x * b, v.y * b);
    return vector2i(P.x - Pb.x, P.y - Pb.y);
}
Но по Y координате плохо считает, и если точка не перпендикулярна отрезку, он ее считает как прямую (а не возвращает точку на ближайший край отрезка)
Scrooge McDuck
Заблокирован
22.09.2014, 19:05     Переместить точку на линию в 2D #4
Цитата Сообщение от sooqua Посмотреть сообщение
А при чем здесь окружность?
притом, что если у прямой и окружности, проведённой из определённой точки не на прямой, имеется только одна точка пересечения - значит радиус, проведённый в точку пересечения и будет перпендикуляром, то есть кратчайшим расстоянием, то есть той точкой, куда ты и хочешь свою перенести. Решай систему уравнений из уравнения твоей прямой и уравнением окружности и пробивай на наличие одного решения и бери координаты.
sooqua
15 / 9 / 0
Регистрация: 23.02.2012
Сообщений: 135
23.09.2014, 19:04  [ТС]     Переместить точку на линию в 2D #5
Нашел код попроще (не требует класса vector2i), но он только возвращает расстояние.
C++
1
2
3
4
5
6
7
8
9
10
11
double dis(double x1, double y1, double x2, double y2){
    return sqrt((x2 - x1)*(x2 - x1) + (y2 - y1)*(y2 - y1));
}
double point_to_segment(double px, double py, double x1, double y1, double x2, double y2){
    double d1 = dis(x1, y1, x2, y2);
    double d2 = dis(x1, y1, px, py);
    double d3 = dis(x2, y2, px, py);
    if (d1*d1 + d2*d2 < d3*d3) return d2;
    if (d1*d1 + d3*d3 < d2*d2) return d3;
    return fabs((x2 - x1)*(py - y1) - (px - x1)*(y2 - y1)) / d1;
}
Как заставить его возвращать вектор?..
SlavaSSU
213 / 158 / 44
Регистрация: 17.07.2012
Сообщений: 580
23.09.2014, 19:23     Переместить точку на линию в 2D #6
кажеся так можно сделать. у прямой есть нормальный вектор(вектор, перпендикулярный этой прямой). нормализуешь этот вектор(делаешь длины 1). прикладываешь этот вектор к точке и удлиняешь(умножаешь) его на расстояние от точки до прямой. и тут проблема в том, что ты можешь удлинить его не в ту сторону. так вот если конец вектора после удлинения не попал на прямую, то значит ты не в ту сторону пошел, поэтому надо 2 раза по этому вектору сходить обратно.
Yandex
Объявления
23.09.2014, 19:23     Переместить точку на линию в 2D
Ответ Создать тему
Опции темы

Текущее время: 13:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru