Найти вторую координату точки принадлежащей отрезку

Раздел создан специально для людей которым интересна робототехника, но в силу разных причин они не знают с чего начать.
Задавайте ваши вопросы, какими бы простыми они не казались, постоянные посетители форума постараются ответить на них по мере своих сил.
Робот своими руками. Самодельный робот.

Найти вторую координату точки принадлежащей отрезку

Сообщение Vooon » 23 авг 2007, 19:05

вобщем нуна ф-ция
которая выполнит сабжевую проблему.

есть некий график нелинейный, я его разбиваю на отрезки - с этим все ок
(сглаживание ненать)
а вот как потом узнать скажем Y точки лежащей на каком-то отрезке, если известен X...
(как найти нужный отрезок и сам потом "придумаю" а вот точку на отрезке чтот никак - видать переотдыхал   :? )

что-то пока думаю об итерациях... :oops:

Добавлено:

массив точек навроде такого:
Код: Выделить всё
const float dat_alfa0[][2] = {
   /* x       , y           */
   { 0        , 0           },
   { 10.245517, 0.035386632 },
   { 20.147485, 0.072188729 },
   { 30.049453, 0.10969856  },
   { 40.157712, 0.14579292  },
   { 50.05968 , 0.18047182  },
   { 60.167939, 0.21656619  },
   { 70.069907, 0.25195282  }
};
Аватара пользователя
Vooon
Site Admin
 
Сообщения: 3339
Зарегистрирован: 09 фев 2006, 15:36
Откуда: Москва
Skype: vooon341
прог. языки: Python, C, Bash, JavaScript, C++, PHP
ФИО: Владимир Ермаков

Сообщение Vooon » 23 авг 2007, 23:50

все... побил стены лбом, очухался... вспомнил чуток геометрию  :lol:
написал так:
Код: Выделить всё
/**
* вычисляет вторую координату точки на графике.
* точка ДОЛЖНА быть на графике!
*/

/**
* Вычисляет абсциссу
*/
float graph_get_x (const float graph, float y)
{
 unsigned int i;
 for (i = 0; i <= (sizeof(graph)/(2*sizeof(graph[0][0]))); i++)
 {
   if (graph[i][1] <= y && y <= graph[i+1][1]) break;
 }
 return graph_get_coord_x(graph[i][0], graph[i][1], graph[i+1][0], graph[i+1][1], y);
}

/**
* Вычисляет ординату
*/
float graph_get_y (const float graph, float x)
{
   unsigned int i;
   for (i = 0; i <= (sizeof(graph)/(2*sizeof(graph[0][0]))); i++)
   {
     if (graph[i][0] <= x && x <= graph[i+1][0]) break;
   }
   return graph_get_coord_y(graph[i][0], graph[i][1], graph[i+1][0], graph[i+1][1], x);
}

/**
* A (x1; y1) - start
* B (x2; y2) - stop
* x (y)      - one of C
*/
#define graph_get_coord_x (      x1,       y1,       x2,       y2,       y) \
       graph_get_coord_y (      y1,       x1,       y2,       x2,       y)
float   graph_get_coord_y (float x1, float y1, float x2, float y2, float x)
{
 return (((y2 - y1)*(x - x1))/(x2 - x1)+ y1);
}
Аватара пользователя
Vooon
Site Admin
 
Сообщения: 3339
Зарегистрирован: 09 фев 2006, 15:36
Откуда: Москва
Skype: vooon341
прог. языки: Python, C, Bash, JavaScript, C++, PHP
ФИО: Владимир Ермаков

Сообщение Myp » 24 авг 2007, 11:39

а я вобще ничерта не понял
ни то чё ты хотел не то чё ты сделал...
какой же это тогда вопрос для начинающих ?

а самое интересное зачем оно тебе надо было ?:)
Аватара пользователя
Myp
скрытый хозяин вселенной :)
 
Сообщения: 18018
Зарегистрирован: 18 сен 2006, 12:26
Откуда: Тверь по прозвищу Дверь
прог. языки: псевдокод =) сила в алгоритме!
ФИО: глубокоуважаемый Фёдор Анатольевич

Сообщение Digit » 24 авг 2007, 13:00

Я тож не сильно понял, чего надо было... Но если есть начало отрезка и конец (координаты), то найти одну из координат точки на отрезке - это класс 6-7 геометрии  :lol:  Так что точно для начинающих  :P
Аватара пользователя
Digit
 
Сообщения: 3339
Зарегистрирован: 27 ноя 2004, 00:42
Откуда: совсем Москва
ФИО: Григорий

Сообщение Vooon » 24 авг 2007, 13:19

зачем - есть датчик, и его выходное напряжение идет не линейно с измеряемым параметром.
в ДШ например есть график показывающий изменение напряжения на выходе от изменения входного параметра.
так вот - я этот график оцифровываю - получается много отрезков.
так вот зная входное напряжение (АЦП) мне нужно было преобразовать в ту величину
=> по извесной одной координате найти вторую...

всеравно наверн непонятно написал...

а в новички - т.к на мой взгляд этот форум как нельзя лучше подходит
Аватара пользователя
Vooon
Site Admin
 
Сообщения: 3339
Зарегистрирован: 09 фев 2006, 15:36
Откуда: Москва
Skype: vooon341
прог. языки: Python, C, Bash, JavaScript, C++, PHP
ФИО: Владимир Ермаков

Сообщение Vooon » 24 авг 2007, 13:20

Digit писал(а):Я тож не сильно понял, чего надо было... Но если есть начало отрезка и конец (координаты), то найти одну из координат точки на отрезке - это класс 6-7 геометрии  :lol:  Так что точно для начинающих  :P

ага, я просто наверн переотдыхал... ниче не помню, просто тупо открыл мучебник и нашел :)
Аватара пользователя
Vooon
Site Admin
 
Сообщения: 3339
Зарегистрирован: 09 фев 2006, 15:36
Откуда: Москва
Skype: vooon341
прог. языки: Python, C, Bash, JavaScript, C++, PHP
ФИО: Владимир Ермаков

Сообщение Myp » 24 авг 2007, 17:35

Vooon писал(а):всеравно наверн непонятно написал...


вот как раз теперь понятно :)
сам когдато над этим вопросом думал, для применения датчикой с нелинейными хар-ками
Аватара пользователя
Myp
скрытый хозяин вселенной :)
 
Сообщения: 18018
Зарегистрирован: 18 сен 2006, 12:26
Откуда: Тверь по прозвищу Дверь
прог. языки: псевдокод =) сила в алгоритме!
ФИО: глубокоуважаемый Фёдор Анатольевич

Сообщение Vooon » 24 авг 2007, 20:50

Myp писал(а):вот как раз теперь понятно :)
сам когдато над этим вопросом думал, для применения датчикой с нелинейными хар-ками

и че надумал?  :)
Аватара пользователя
Vooon
Site Admin
 
Сообщения: 3339
Зарегистрирован: 09 фев 2006, 15:36
Откуда: Москва
Skype: vooon341
прог. языки: Python, C, Bash, JavaScript, C++, PHP
ФИО: Владимир Ермаков

Сообщение SSG » 25 авг 2007, 14:47

А насколько большая разность между точками и как сильно меняются значения функции, в зависимости от разных параметров? Может выгоднее аппроксимацию замутить, вычислить один раз на большом ПК коэффициенты, например, полинома по уже имеющимся значениям и потом уже с его (полинома или более другой подходящей функции) помощью в контроллере считать?  8)
Аватара пользователя
SSG
 
Сообщения: 1058
Зарегистрирован: 15 янв 2007, 19:23
Откуда: Беларусь, Барановичи
прог. языки: С для МК, Delphi для ПК

Сообщение Myp » 25 авг 2007, 18:59

Vooon писал(а):
Myp писал(а):вот как раз теперь понятно :)
сам когдато над этим вопросом думал, для применения датчикой с нелинейными хар-ками

и че надумал?  :)

а ничё
плюнул на это дело = )))
типа такого, сначала на бумажке посчитать, а потом в мк загнать
если Х от нуля до десяти то У = (2Х)
если Х от 10 до 20 то У = (2Х) - 3
если Х от 20 до 30 то У =  (2Х) - 7
Аватара пользователя
Myp
скрытый хозяин вселенной :)
 
Сообщения: 18018
Зарегистрирован: 18 сен 2006, 12:26
Откуда: Тверь по прозвищу Дверь
прог. языки: псевдокод =) сила в алгоритме!
ФИО: глубокоуважаемый Фёдор Анатольевич

Сообщение Digit » 26 авг 2007, 14:34

...это называется "табличное представление функции" :)
Аватара пользователя
Digit
 
Сообщения: 3339
Зарегистрирован: 27 ноя 2004, 00:42
Откуда: совсем Москва
ФИО: Григорий

Сообщение SSG » 26 авг 2007, 21:41

Ну так если значения в таблице постоянны, конечно лучше какой-нибудь аппроксимирующий полином или другую функцию на ПК рассчитать. Тогда программа для контроллера поэлегантней получится.  :) Кроме того, это позволит находить значения функции и в промежуточных точках, для которых измерения не проводились.
Аватара пользователя
SSG
 
Сообщения: 1058
Зарегистрирован: 15 янв 2007, 19:23
Откуда: Беларусь, Барановичи
прог. языки: С для МК, Delphi для ПК

Сообщение Виталий » 26 авг 2007, 21:51

Тогда программа для контроллера поэлегантней получится

Но она будет медленней =)
Все новости о моих проектах http://savethebest.ru
Аватара пользователя
Виталий
 
Сообщения: 2114
Зарегистрирован: 08 окт 2004, 16:43
Откуда: St. Petersburg
Skype: quark-bot
ФИО: Клебан Виталий

Сообщение SSG » 27 авг 2007, 12:56

Виталий писал(а):Но она будет медленней =)

:shock: Почему?
Аватара пользователя
SSG
 
Сообщения: 1058
Зарегистрирован: 15 янв 2007, 19:23
Откуда: Беларусь, Барановичи
прог. языки: С для МК, Delphi для ПК

Сообщение Digit » 27 авг 2007, 12:57

SSG писал(а):Кроме того, это позволит находить значения функции и в промежуточных точках, для которых измерения не проводились.

...а кроме того, что прога будет тормознутее, за пределами рассчитанного полинома могут быть редкостные косяки ;-) Скажем так, за пределами табличных значений можно найти результат с приемлемой точностью только для относительно простых функций. А между точками таблицы можно и линейную апроксимацию иметь - точность будет зависеть от количества точек в таблице...
А вообще, это традиционный спор из разряда "размер кода VS быстрота"  :lol:

ЗЫ
Медленнее будет, т.к. надо будет гораздо больше считать. Мы не берем во внимание линейные функции и другие простые функции. А посчитать полином шестой степени - это относительно много математики. По крайней мере, больше, чем взять число из таблицы и линейно проинтерполировать.
Аватара пользователя
Digit
 
Сообщения: 3339
Зарегистрирован: 27 ноя 2004, 00:42
Откуда: совсем Москва
ФИО: Григорий

След.

Вернуться в Новичкам или основы основ роботостроения.

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 33