Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Графический симулятор человеческой руки


Автор: profesiachuvak 18.2.2011, 20:11
Здравствуйте форумчане.

Появилась необходимость создать графический симулятор человеческой руки. В упрощённом виде. Меня интересует передвижение руки в одной плоскости (на руку смотрим сверху). Есть два отрезка: от плеча до локтя и от локтя до кисти (сама кисть не интересует). Вообщем имеем два отрезка соединённый между собой, и они двигаются в плоскости XY. 

Главное условие этого симулятора максимально точное позиционирование её на координатной сетке. Смысл симулятора в том, что мы задаём координату (X;Y) и конец второго отрезка перемещается в эту точку. При этом естественно двигается и первый отрезок, но они как и настоящая человеческая рука не удлиняются, а согинаются под различными углами относительно друг друга. Место воображаемого плеча (начало первого отрезка) строго зафиксировано, т.е. его положение не изменяется.

Вопрос: чем мне воспользоваться для отображения этой графики? Как максимально точно обеспечить правильность позиционирования. Какие компоненты на это способны?

Автор: CodeMonkey 18.2.2011, 20:46
Есть мнение, что для отображения двух отрезков можно воспользоваться чем угодно.

Автор: VictorTsaregorodtsev 18.2.2011, 21:55
Правильность позиционирования обеспечивается при решении обратной задачи кинематики. Т.е. смотрите на алгоритмы управления "многосуставными" манипуляторами роботов - у этих "рук" тоже есть ограничения на углы поворота в отдельных суставах.
Естественно, вряд ли будут готовые компоненты ;) Слишком уж задача невостребована массами, несмотря на то, что алгоритмы известны уже несколько десятилетий.
Могу написать код (правда, на С) для манипулятора с любым числом шарниров, в том числе и в варианте, когда рука огибает те или иные препятствия (на плоскости или в объеме) для достижения кистью заданной точки. Естественно, незабесплатно ;)

Автор: Gwire 19.2.2011, 16:39
Здесь все просто.
(но лучше сразу взять ручку бумагу и линейку)

Плече и локоть можно представить двумя сторонами триугольника П и Л.
Скажем вершины креугольника О(неподвижная точка), С(сустав) и К(кисть).

При перемешении К, ОС и СК менятся (по условию) не могут.
Значит меняется ОК и углы между сторонами треугольника.
Возмем что координаты О=0,0 (попровку OffsetX и OffsetY для сделать не сложно).

1) ОК можно посчитать за Пифагором, относительно координат О и новой позиции К.
2) Зная длину всех сторон можно расчитать угол СОК (этого в сети навалом).
3) Считаем угол КОХ (где Х точка на оси ординат) относительно позиции К
4) Узнаем угол плеча к оси ординат СОК + КОХ.
5) Узнаем координаты вершины С за стороной П и углом СОХ.
6) Нарисовать линии по найденным коодинатам (не забываем про Offsetы).

Автор: profesiachuvak 19.2.2011, 21:23
Gwire, спасибо за ответ. Попробую прикинуть на бумаге. 

Вообщем-то сам расчёт углов и координат я сделаю сам. В этом вопроса нет. Нужен совет с каким графическим компонентом работать будет удобнее всего? Каким образом выводить графику на экран? Что взять в качестве холста? В каком компоненте я смогу точно указывать угол между отрезка, их длину?

Автор: Gwire 20.2.2011, 14:36
profesiachuvak, можешь написать свой компонент
Код

uses Controls;

type
  THandMan = class(TGraphicControl)
  protected
    procedure Paint; override;
  published
    property OnClick;
    property OnMouseMove;    
    property OnMouseDown;
  end;

implementation

procedure THandMan.Paint;
begin
    // Здесь вписываешь код прорисовки
    // Например:
    Canvas.Rectangle(0, 0, Width, Height);
end;

Зная координаты рисовать очень просто. А координаты у тебя есть.

Создание
Код

procedure TForm1.FormCreate(Sender: TObject);
var HM: THandMan;
begin
    HM:= THandMan.Create( nil );
    HM.Width:= 400;
    HM.Height:= 300;
    HM.Parent:= Self;
end;


Можно сделать "руку" как руку в 3D. 
Набор компонентов GLScene (взял в иституте на комп.графике).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)