Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Точка на отрезке, Находится ли точка на отрезке 
:(
    Опции темы
olegkuzn
Дата 13.11.2007, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 1.10.2007

Репутация: нет
Всего: нет



Есть отрезок определенный точками CPoint ptBeg, ptEnd. Подскажите простенький алгоритм нахождения точки (CPoint ptHit ) на заданном отрезке. 
( Заранее прошу извинения. Вопрос возможно не для этого раздела. ) 
PM MAIL   Вверх
Andrey44
Дата 13.11.2007, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: нет
Всего: 26



Смотри PtInRect(......), PtInRegion(........) smile 


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
DigitSphinx
Дата 13.11.2007, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 28.4.2007
Где: Москва

Репутация: нет
Всего: 3



как я понял ему надо не это !
общая формула для прямой через 2 точки
(x – x1)/(x2 – x1) = (y – y1)/(y2 – y1)
общая формула прямой
y = ax + b
если привести первую формулу в этот вид получим (не уверен проверь)
a = (y2 – y1)/(x2 – x1)
b = x1*(y2 + y1)/(x2 – x1) + y1
где
x1, y1 – x2, y2 это координаты точек ptBeg, ptEnd соответственно
т.е. имея координаты этих точек задаем какой-то x random’ом и по формуле
y = ax + b получаем  y

Добавлено @ 18:01
а для нахождения точки на этом отрезке, надо задать x1 < x < x2
Код

x = rand()%(x2 – x1) + x1;


P.S. вопрос ты не в том разделе задал.

Это сообщение отредактировал(а) DigitSphinx - 13.11.2007, 18:01


--------------------
Чтобы пробить стену лбом нужен или большой разбег, или много лбов.
(Альберт Эйнштейн)
Умен ты или глуп, велик ты или мал, не знаем мы, пока ты слова не сказал.
(Альберт Эйнштейн)
user posted image
PM MAIL ICQ   Вверх
zkv
Дата 13.11.2007, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 1
Всего: 92



Переместил из Visual С++
PM MAIL   Вверх
Dims
Дата 13.11.2007, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 1
Всего: 11



Цитата(olegkuzn @  13.11.2007,  15:47 Найти цитируемый пост)
Есть отрезок определенный точками CPoint ptBeg, ptEnd. Подскажите простенький алгоритм нахождения точки (CPoint ptHit ) на заданном отрезке. 


Можно такую модель предложить: эти две твои точки -- это два вектора B и E. Разница этих векторов H = E-B -- это вектор, который идёт от вычитаемого к уменьшаемому. Разница векторов есть почленная разность координат.

Если взять этот вектор-разницу и умножать его на число от beta = 0 до 1, то этот вектор будет менять длину от 0 до полной. 

То есть, вектора X(beta) = B + H * beta будут бегать по отрезку от B до E при изменении beta от 0 до 1.

PM MAIL   Вверх
marcusmae
Дата 14.11.2007, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: нет
Всего: 39



Весёлая тема  smile

Ну, раз все способы задания уравнения прямой вспомнили (даже векторный!), то позвольте обратить внимание на скалярное произведение или теорему косинусов : для того, чтобы точка лежала на прямой, два различных вектора, образованные концами отрезков и точкой на прямой должны быть коллинеарны, то есть в скалярном произведении давать +/- 1.

Это сообщение отредактировал(а) marcusmae - 14.11.2007, 00:02


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
olegkuzn
Дата 14.11.2007, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 1.10.2007

Репутация: нет
Всего: нет



Формула y = y1 + (x-x1)*[(y2-y1)/(x2-x1)] а также вычисление с помощью коэффицентов k = ( y2 - y1 )/( x2 - x1 ) и b = y2 - k*x2 почему то не работает на вертикальных отрезках ( когда y1 = y2 ).

Нашел тупой способ вычисления длинн :

CSize size1 = ptEnd - ptBeg;
CSize size2 = ptEnd - ptHit;
CSize size3 = ptHit - ptBeg;

double length1 = sqrt((double)(size1.cx * size1.cx + size1.cy * size1.cy ));
double length2 = sqrt((double)(size2.cx * size2.cx + size2.cy * size2.cy ));
double length3 = sqrt((double)(size3.cx * size3.cx + size3.cy * size3.cy ));

double d = length1 - ( length2 + length3 );

if( fabs(d) <= 0.4 ) // число должно быть близко к нулю
return true;
else
return false;

Подскажите пожалуйста более оригинальный способ нахождения точки на ОТРЕЗКЕ. 
Здесь слишком много вычислений. 
PM MAIL   Вверх
Akina
Дата 14.11.2007, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



ptN = pt1 + (pt2 - pt1) * K, где ptZ - любая из координат точки; К = число в диапазоне [0;1].
Само собой, для всех координат при вычислении точки К одинаково.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Dims
Дата 14.11.2007, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 1
Всего: 11



Цитата(olegkuzn @  14.11.2007,  08:54 Найти цитируемый пост)
почему то не работает на вертикальных отрезках ( когда y1 = y2 ).


Так и должно быть, используй векторное представление.
Код


double k = 0.75; // получим точку, находящуются на 75% расстояния отрезка между началом и концом 
CSize diff = ptEnd - ptBeg; // вектор разницы

// домножаем вектор разницы на процент (0 - начальная точка, 1 - конечная, 0.5 -- середина, 1.5 -- на пол отрезка дальше конца и т.д.)
diff.cx *= k;
diff.cy *= k;

CSize res = ptBeg + diff; // искомая точка


PM MAIL   Вверх
Akina
Дата 14.11.2007, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



Цитата(olegkuzn @  14.11.2007,  09:54 Найти цитируемый пост)
 почему то не работает на вертикальных отрезках ( когда y1 = y2 ).

Да потому что делить на ноль (x2-x1) настоятельно не рекомендуется...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0521 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.