![]() |
|
|
![]()
|
|
| olegkuzn |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 1.10.2007 Репутация: нет Всего: нет |
Есть отрезок определенный точками CPoint ptBeg, ptEnd. Подскажите простенький алгоритм нахождения точки (CPoint ptHit ) на заданном отрезке.
( Заранее прошу извинения. Вопрос возможно не для этого раздела. ) |
|||
|
||||
| Andrey44 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1501 Регистрация: 4.12.2006 Где: На работе Репутация: нет Всего: 26 |
Смотри PtInRect(......), PtInRegion(........)
-------------------- ????? ??, ??????? ?????. |
|||
|
||||
| DigitSphinx |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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
P.S. вопрос ты не в том разделе задал. Это сообщение отредактировал(а) DigitSphinx - 13.11.2007, 18:01 |
|||
|
||||
| zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 1 Всего: 92 |
Переместил из Visual С++
|
|||
|
||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 1 Всего: 11 |
Можно такую модель предложить: эти две твои точки -- это два вектора B и E. Разница этих векторов H = E-B -- это вектор, который идёт от вычитаемого к уменьшаемому. Разница векторов есть почленная разность координат. Если взять этот вектор-разницу и умножать его на число от beta = 0 до 1, то этот вектор будет менять длину от 0 до полной. То есть, вектора X(beta) = B + H * beta будут бегать по отрезку от B до E при изменении beta от 0 до 1. |
|||
|
||||
| marcusmae |
|
|||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: нет Всего: 39 |
Весёлая тема
Ну, раз все способы задания уравнения прямой вспомнили (даже векторный!), то позвольте обратить внимание на скалярное произведение или теорему косинусов : для того, чтобы точка лежала на прямой, два различных вектора, образованные концами отрезков и точкой на прямой должны быть коллинеарны, то есть в скалярном произведении давать +/- 1. Это сообщение отредактировал(а) marcusmae - 14.11.2007, 00:02 -------------------- ἀπὸ μηχανῆς θεός |
|||
|
||||
| olegkuzn |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 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; Подскажите пожалуйста более оригинальный способ нахождения точки на ОТРЕЗКЕ. Здесь слишком много вычислений. |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
ptN = pt1 + (pt2 - pt1) * K, где ptZ - любая из координат точки; К = число в диапазоне [0;1].
Само собой, для всех координат при вычислении точки К одинаково. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| Dims |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 1 Всего: 11 |
Так и должно быть, используй векторное представление.
|
||||
|
|||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
Да потому что делить на ноль (x2-x1) настоятельно не рекомендуется... -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
![]()
|
| Правила форума "Алгоритмы" | |
|
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Алгоритмы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |