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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
sooqua
15 / 9 / 0
Регистрация: 23.02.2012
Сообщений: 135
#1

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

22.09.2014, 18:10. Просмотров 287. Ответов 5
Метки нет (Все метки)

Помогите, в гугле ничего не нашел. Только расстояние, которое получилось измерить вот так:
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#
Люди добрые помогите! Разработать приложение позволяющее с помощью командных кнопок (вверх вниз в право влево) перемещать линию в...

Как анимировать точку или линию в VB 2008 - Visual Basic .NET
Я раньше немного работал на VB6, но недавно поставил себе Visual Studio 2008, а он поддерживает VB 2008. Как я не искал элемент...

Как переместить рисунок в заданную точку? - PascalABC.NET
Здраствуйте, помните игру танчики? я пишу такую прогу гду ты управляешь танком(который я нарисовал на пэйнте) и я не знаю какая процедура...

Найти уравнение плоскости, проходящей через точку M(7;0;0) и линию пересечения плоскостей 2x + y + 2z - 7 = 0 и x + y = 0 - Геометрия
Найти уравнение плоскости, проходящей через точку M(7;0;0) и линию пересечения плоскостей 2x + y + 2z - 7 = 0 и x + y = 0 .

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Scrooge McDuck
Заблокирован
22.09.2014, 18:45 #2
Где координаты Х и У точки? Где уравнение прямой ?

Добавлено через 19 минут
Молчишь? Ну и молчи В общем тебе надо искать единственную точку пересечения прямой и окружности
sooqua
15 / 9 / 0
Регистрация: 23.02.2012
Сообщений: 135
22.09.2014, 18:54  [ТС] #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 #4
Цитата Сообщение от sooqua Посмотреть сообщение
А при чем здесь окружность?
притом, что если у прямой и окружности, проведённой из определённой точки не на прямой, имеется только одна точка пересечения - значит радиус, проведённый в точку пересечения и будет перпендикуляром, то есть кратчайшим расстоянием, то есть той точкой, куда ты и хочешь свою перенести. Решай систему уравнений из уравнения твоей прямой и уравнением окружности и пробивай на наличие одного решения и бери координаты.
sooqua
15 / 9 / 0
Регистрация: 23.02.2012
Сообщений: 135
23.09.2014, 19:04  [ТС] #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
215 / 160 / 45
Регистрация: 17.07.2012
Сообщений: 587
23.09.2014, 19:23 #6
кажеся так можно сделать. у прямой есть нормальный вектор(вектор, перпендикулярный этой прямой). нормализуешь этот вектор(делаешь длины 1). прикладываешь этот вектор к точке и удлиняешь(умножаешь) его на расстояние от точки до прямой. и тут проблема в том, что ты можешь удлинить его не в ту сторону. так вот если конец вектора после удлинения не попал на прямую, то значит ты не в ту сторону пошел, поэтому надо 2 раза по этому вектору сходить обратно.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.09.2014, 19:23
Привет! Вот еще темы с ответами:

Переместить курсор в заданную точку экрана (графический режим) - Assembler
Доброе время суток! Подскажите, как переместить курсор в заданную точку на экране, для последующего вывода текста в данной точке. ...

Pascal Turbo: Найти линию в экранной плоскости, которая вращается через одну точку - Turbo Pascal
Найти линию в экранной плоскости, которая вращается через одну точку. Цвет линии должен изменяться когда линиия переходит из одного...

Можно ли при помощи Java Script поставить точку на сайте или прочертить линию? - JavaScript
А можно ли при помощи Java Script поставить точку на сайте или прочертить линию( не горизонтальную)

Переместить курсор в точку координатами (80,180) с помощью процедуры MoveTo - Turbo Pascal
Помогите мне пожалуйста, мне надо в Pascal переместить курсор в точку координатами (80,180) с помощью процедуры MoveTo и затем в точку...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
23.09.2014, 19:23
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru