Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.12.2014, 14:17   #11
zvygin1964
Старожил
 
Аватар для zvygin1964
 
Регистрация: 19.06.2013
Сообщений: 2,463
По умолчанию

Цитата:
Сообщение от phomm Посмотреть сообщение
Аналитика же вполне простая, как и с арктангенсами.
Идея замечательная! но не получается передвинуть центр вращения в другое место. Исходник и .exe положил в http://rghost.ru/59505952 .
Изображения
Тип файла: jpg Image1Click по центру вращения.JPG (92.4 Кб, 108 просмотров)
Репутация: полный "0"
zvygin1964 вне форума Ответить с цитированием
Старый 10.12.2014, 18:03   #12
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

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

Hahn.zip
Движения отслеживаются при нажатой ЛКМ. Длина отрезка = 16 пикселей.

Занятно, что когда bmp-файл делаешь фоном окна через RC-файл, старый Avast! делает стойку на exe-шник
Vago вне форума Ответить с цитированием
Старый 12.12.2014, 10:06   #13
zvygin1964
Старожил
 
Аватар для zvygin1964
 
Регистрация: 19.06.2013
Сообщений: 2,463
Сообщение

Цитата:
Сообщение от Vago Посмотреть сообщение
Когда bmp-файл делаешь фоном окна через RC-файл, старый Avast! делает стойку на exe-шник
Это вредоносно? В моей программе или в вашей?

В "Hahn.zip" Вы продемонстрировали ваши возможности и изменили центр вращения штурвала задвижки, но в .exe не видно, как это делается. Покажете?
Репутация: полный "0"
zvygin1964 вне форума Ответить с цитированием
Старый 12.12.2014, 17:00   #14
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Цитата:
Сообщение от zvygin1964 Посмотреть сообщение
Это вредоносно? В моей программе или в вашей?
В моей, конечно Вредоносно ли? Шут его знает! У меня больше никто не ругается.

Цитата:
Сообщение от zvygin1964
В "Hahn.zip" Вы продемонстрировали ваши возможности и изменили центр вращения штурвала задвижки
Честно говоря, ГДЕ ЦЕНТР ВРАЩЕНИЯ - меня вообще не интересует Я просто пытаюсь анализировать, куда уходит траектория, "влево" или "вправо".

Цитата:
Сообщение от zvygin1964
Покажете?
Да, конечно. Только это - чистый C и вызовы Win32 API. Чтобы Вам не забивать голову незнакомым синтаксисом, я выдернул только то, что относится к алгоритму.

Декларации.
Код:
#define L_VECTOR   16        // Длина вектора (отрезка) кусочно-линейного сглаживания

struct VECTOR2D {
   int x ;
   int y ;
} ;

POINT               pt0,                        // начало вектора
                    ptF ;			// конец вектора
struct VECTOR2D     v1,                         // предыдущий вектор
                    v2 ;                        // последующий вектор
BOOL                isFirstPoint ,		// TRUE, если это самая первая точка отслеживаемой траектории
                    isFirstVector ,		// TRUE, если вектор - первый в отслеживаемой траектории
                    isTracing = FALSE ;		// TRUE, если отслеживаем траекторию
Собственно анализ.
Код:
case WM_LBUTTONDOWN:
   hCurs = LoadCursor( NULL, IDC_HAND ) ;
   SendMessage( hStatus, SB_SETTEXT, 0, (LPARAM)"Взяли!..") ;
   isTracing = isFirstPoint = isFirstVector = TRUE ;
   break ;
case WM_MOUSEMOVE:
   if ( isTracing ) {
      SetCursor( hCurs ) ;
      if ( isFirstPoint ) {                           // Самая первая точка отслеживаемой траектории
         pt0.x = LOWORD( lParam ) ;
         pt0.y = HIWORD( lParam ) ;
         isFirstPoint = FALSE ;
      } else { 
         ptF.x = LOWORD( lParam ) ;                     // Очередные координаты мыши	
         ptF.y = HIWORD( lParam ) ;
         if ( GetLength2( ptF, pt0 ) >= L_VECTOR ) {    // Передвинули мышь не меньше чем на L_VECTOR пикселей
            if ( isFirstVector ) {                         // Самый первый вектор ещё не с чем сравнивать...
               v1.x = ptF.x - pt0.x ;                         // ...поэтому просто...
               v1.y = ptF.y - pt0.y ;                         // ...запомнили вектор.
               isFirstVector = FALSE ;
            } else {                                       // Все последующие векторы кусочно-линейного представления траектории
               v2.x = ptF.x - pt0.x ;                         // Определили вектор
               v2.y = ptF.y - pt0.y ;
               a = GetAngle2( v1, v2 ) ;                      // Угол между этим вектором и предыдущим
               if ( a > 0. )
                  SendMessage( hStatus, SB_SETTEXT, 0, (LPARAM)"Вращаем против часовой...") ;
               else
                  SendMessage( hStatus, SB_SETTEXT, 0, (LPARAM)"Вращаем по часовой...") ;
               v1.x = v2.x ; v1.y = v2.y ;                    // Текущий вектор становится "предыдущим".
            }
            pt0.x = ptF.x ; pt0.y = ptF.y ;                // Конец текущего вектора станет началом последующего.
         } 
      } 
   }
   break ;
case WM_LBUTTONUP:
   hCurs = LoadCursor( NULL, IDC_ARROW ) ;
   SendMessage( hStatus, SB_SETTEXT, 0, (LPARAM)"Отпустили.") ;
   isTracing = FALSE ;
break ;
Ну и чуть-чуть математики
Код:
/*
 *   Расстояние между точками pt1 и pt2 на плоскости
 */
double GetLength2( POINT pt1, POINT pt2 ) {

   return sqrt( (pt2.x-pt1.x)*(pt2.x-pt1.x) + (pt2.y-pt1.y)*(pt2.y-pt1.y) ) ;

}


/*
 *   Угол между векторами a и b на плоскости
 */ 
double GetAngle2( struct VECTOR2D a, struct VECTOR2D b ) {

   double dot, det ;

   dot = a.x * b.x + a.y * b.y ;       // скалярное произведение
   det = a.x * b.y - a.y * b.x ;       // определитель

   return ( -atan2( det, dot ) ) ;

}

Последний раз редактировалось Vago; 12.12.2014 в 17:09.
Vago вне форума Ответить с цитированием
Старый 13.12.2014, 14:50   #15
zvygin1964
Старожил
 
Аватар для zvygin1964
 
Регистрация: 19.06.2013
Сообщений: 2,463
По умолчанию

Цитата:
Сообщение от Vago Посмотреть сообщение
dot = a.x * b.x + a.y * b.y ; // скалярное произведение
det = a.x * b.y - a.y * b.x ; // определитель
return ( -atan2( det, dot ) ) ;}
[/CODE]
А на перевод на Delphi будет такой? :

var ax,ay,bx,by,an,dot,det: double;
begin
dot = a.x * b.x + a.y * b.y ; // скалярное произведение
det = a.x * b.y - a.y * b.x ; // определитель
an:=-arctan(det/dot);
end;

Это очень интересно, но не подходит для случая прямолинейного движения снизу-вверх и обратно.
Изображения
Тип файла: jpg рубильник.jpg (116.3 Кб, 117 просмотров)
Репутация: полный "0"
zvygin1964 вне форума Ответить с цитированием
Старый 13.12.2014, 22:56   #16
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Я так понимаю, это программа для какого-то биометрического тестирования? Тогда пусть для каждого нового фона "инструктор тренажёра" выполняет калибровку. Двух контрольных точек, наверное, достаточно. Пусть помечает мышью, к примеру, крайнее вертикальное положение рукоятки рычага и крайнее горизонтальное (крайнюю верхнюю точку обода штурвала и крайнюю боковую). Тогда построить проекцию траектории вращения - дело несложной математики. А дальше - посчитать меру близости этой проекции и реальной траектории.
Vago вне форума Ответить с цитированием
Старый 14.12.2014, 23:37   #17
zvygin1964
Старожил
 
Аватар для zvygin1964
 
Регистрация: 19.06.2013
Сообщений: 2,463
По умолчанию

Цитата:
Сообщение от Vago Посмотреть сообщение
Я так понимаю
Это раздел "Помощь студентам". Ранее я уже писал, что по мотивам этой инструкции уже снято и озвучено видео. На моей работе, даже не присели глянуть одним глазом.
В учебном комбинате попросили экземпляр в подарок (нет лицензии, котёл редкий и так далее...) Так, что это только учебный проект по моему плану.
Обратите внимание, как обо мне отзывается min@y™.
Репутация: полный "0"
zvygin1964 вне форума Ответить с цитированием
Старый 15.12.2014, 11:03   #18
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Цитата:
Сообщение от zvygin1964 Посмотреть сообщение
Цитата:
Сообщение от Vago
Я так понимаю
Это раздел "Помощь студентам". Ранее я уже писал, что по мотивам этой инструкции уже снято и озвучено видео. На моей работе, даже не присели глянуть одним глазом.
В учебном комбинате попросили экземпляр в подарок (нет лицензии, котёл редкий и так далее...) Так, что это только учебный проект по моему плану.
Обратите внимание, как обо мне отзывается min@y™.
Судя по тому, что предыдущее сообщение начинается с цитаты меня, любимого, оно целиком адресовано мне, но, простите, я не понял в нём ни-че-го! О каком видео идёт речь?.. Кто "не присел"?.. Почему меня должно волновать то, как один форумчанин отзывается о другом?.. И, главное, какое всё это имеет отношение к уточнению ТЗ?
Vago вне форума Ответить с цитированием
Старый 16.12.2014, 19:44   #19
zvygin1964
Старожил
 
Аватар для zvygin1964
 
Регистрация: 19.06.2013
Сообщений: 2,463
По умолчанию

Не изучал я скалярного произведения векторов. (Это дает знак угла поворота?)
Для Delphi так будет правильно? :

var ax,ay,bx,by,an,dot,det: double;
begin
dot = a.x * b.x + a.y * b.y ; // скалярное произведение
det = a.x * b.y - a.y * b.x ; // определитель
an:=-arctan(det/dot);
end; // ???????

Вариант 1 понятней:
Код:
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
 cx:=Width/2; cy:=Height/2;
 ax:=cx-x; ay:=cy-y;
 if ax=0 then ax:=1;// делить на 0 нельзя
 an:=arctan(ay/ax);
 if an>ang then Caption:='По' else Caption:='Против';
 ang:=an;
end;
,- выдает не верный результат при движении снизу вверх по правому краю Image.
Пытаюсь сместить центр вращения от центра на координаты выдаваемые:
Код:
procedure TForm1.Image1Click(Sender: TObject);
  var RadioButton: TRadioButton;
begin
  Label1.Caption:='x='+ inttostr(Mous.CursorPos.x)+ ' y='+ inttostr(Mous.CursorPos.y);
 RadioButton:=TRadioButton.Create(Form1);
  with RadioButton do
  begin
    Parent:=Form1;
    T:=ScreenToClient(Form1.FDesignSize);
    top:=Mouse.CursorPos.Y+T.y;
    left:=Mouse.CursorPos.X+T.x;
    center_of_rotation_X:=top;
    center_of_rotation_Y:=left;

    Width:=140;
    Height:=20;
    Caption:='центр вращения';
  end;
Изображения
Тип файла: jpg рубильник c Пифагором.jpg (116.1 Кб, 123 просмотров)
Репутация: полный "0"

Последний раз редактировалось zvygin1964; 16.12.2014 в 19:46.
zvygin1964 вне форума Ответить с цитированием
Старый 16.12.2014, 23:27   #20
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Я не зря перед этим написал про уточнение ТЗ. Сделайте это! Даже в разделе "помощь студентам"! Как предполагается эксплуатировать этот "программный комплекс"? Допустимо ли, что перед началом тестирования программу с конкретной фоновой фотографией настроит человек (назовём его "инструктором", "оператором" или ещё как-то)? Вот есть фон из поста #11, и есть фон из поста #15. В первом случае ось вращения практически перпендикулярна плоскости картинки, во втором - практически лежит в этой плоскости. В первом случае надо отлавливать круговое движение, во втором - прямолинейное. В общем случае - дугу эллипса (или её часть) с разным соотношением полуосей. Вопрос: Допустимо ли, что перед началом тестирования на конкретной картинке некий "оператор" каким-то образом (тремя щелчками мыши, к примеру) задаст три контрольных точки, по которым можно определить проекцию траектории вращения на плоскость экрана? Если да, то дальнейшая математика относительно несложна (хотя тут ещё опять надо будет посмотреть на ТЗ, на критерий оценки контроля моторики испытуемого). Если нет, если на фотографии программно нужно распознать вентиль или рукоять, а потом ещё и определить, под каким углом они сфотографированы, то это программа уже из области AI!! Но даже в случае "да" - это задача сперва математическая, а потом уже программистская, и, чтобы решить её элегантно, лучше всё-таки разобраться в основах геометрических преобразований в машинной графике и линейной алгебры.
Vago вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Платформа автоматизации "бизнеса" или конфигурирование против кодинга serzh-kz Общие вопросы по программированию, компьютерный форум 0 06.06.2013 05:35
Диагностика уровня закритичности конвективного течения на основе численного решения задачи Релея -Бенара(Делфи) Эльвира91 Помощь студентам 3 15.03.2013 17:27
ListBox или ComboBox, выбор элмента, в Delphi7 Николай ПН Помощь студентам 11 17.11.2010 19:55
Жильцы против Управляющих компаний или когда в нашей стране восторжествует справедливость? vasek123 Свободное общение 18 05.11.2010 06:37
Arcgis проблема с направлением течения реки treder Помощь студентам 0 06.04.2010 23:07