roboforum.ru

Технический форум по робототехнике.

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

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

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 » 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);
}

Myp » 24 авг 2007, 11:39

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

а самое интересное зачем оно тебе надо было ?:)

Digit » 24 авг 2007, 13:00

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

Vooon » 24 авг 2007, 13:19

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

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

а в новички - т.к на мой взгляд этот форум как нельзя лучше подходит

Vooon » 24 авг 2007, 13:20

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

ага, я просто наверн переотдыхал... ниче не помню, просто тупо открыл мучебник и нашел :)

Myp » 24 авг 2007, 17:35

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


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

Vooon » 24 авг 2007, 20:50

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

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

SSG » 25 авг 2007, 14:47

А насколько большая разность между точками и как сильно меняются значения функции, в зависимости от разных параметров? Может выгоднее аппроксимацию замутить, вычислить один раз на большом ПК коэффициенты, например, полинома по уже имеющимся значениям и потом уже с его (полинома или более другой подходящей функции) помощью в контроллере считать?  8)

Myp » 25 авг 2007, 18:59

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

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

а ничё
плюнул на это дело = )))
типа такого, сначала на бумажке посчитать, а потом в мк загнать
если Х от нуля до десяти то У = (2Х)
если Х от 10 до 20 то У = (2Х) - 3
если Х от 20 до 30 то У =  (2Х) - 7

Digit » 26 авг 2007, 14:34

...это называется "табличное представление функции" :)

SSG » 26 авг 2007, 21:41

Ну так если значения в таблице постоянны, конечно лучше какой-нибудь аппроксимирующий полином или другую функцию на ПК рассчитать. Тогда программа для контроллера поэлегантней получится.  :) Кроме того, это позволит находить значения функции и в промежуточных точках, для которых измерения не проводились.

Виталий » 26 авг 2007, 21:51

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

Но она будет медленней =)

SSG » 27 авг 2007, 12:56

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

:shock: Почему?

Digit » 27 авг 2007, 12:57

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

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

ЗЫ
Медленнее будет, т.к. надо будет гораздо больше считать. Мы не берем во внимание линейные функции и другие простые функции. А посчитать полином шестой степени - это относительно много математики. По крайней мере, больше, чем взять число из таблицы и линейно проинтерполировать.


cron
Rambler\'s Top100 Mail.ru counter