Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Датчики или симуляторы. Как?

21K
02 октября 2006 года
Lokky
2 / / 02.10.2006
Стоит такая задачка: надо создать датчик или симулятор (все равно, например, датчик скорости или амперметр, etc), в котором стрелка будет ПЛАВНО передвигаться на значение, введенное в клавы. :confused: :confused: :confused:
У меня полное не понимание,как это сделать.
1. Есть два рисунка: циферблат и стрелка;
2. Стрелка НЕ должна быть рисованная, это должен быть обычный рисунок (это симулятор и все должно быть весьма реалистично);
3. Передвигаться она должна ПЛАВНО, как на циферблате, а не скакать с одной точки в другую.
4. Есть такой, уже готовый код, на XML, может кто знает какой-нить конвертор (вручную не напишу - XML не знаю);
5. Как наложить стрелку на циферблат соотнося центр оси вращения на циферблате и на стрелке? Привязка к координатам? Как? Тоже самое касается перехода на значение - делать привязку к координатам? Как?
6. Циферблат лучше делать как background или загружать прямо на форму?
Сенк.
309
03 октября 2006 года
el scorpio
1.1K / / 19.09.2006
Цитата:
3. Передвигаться она должна ПЛАВНО, как на циферблате, а не скакать с одной точки в другую.



Это можно сделать при помощи таймера

Код:
class TIndicator: public TFrame
{
published:[INDENT]
TTimer *Timer; // Таймер обновления индикатора

void __fastcall Timer_Event (TObject *Sender); // Обработчик таймера
[/INDENT]private:[INDENT]int _fVisible_Value; //Отображаемое значение параметра
int _fReal_Value; //Требуемое значение параметра

void Draw_Value (void); // Функция рисования стрелки
void Set_Real_Value (int Value);
[/INDENT]
public:
     __property int Value = {read = _fReal_Value, write = Set_Real_Value}; // Свойство чтения/записи реального значения
};


void TIndicator::Set_Real_Value (int Value)
{[INDENT] if (_fReal_Value != Value)
{[INDENT]Timer->Enabled = true;
_fReal_Value = Value;[/INDENT]}
[/INDENT]}

TIndicator::Timer_Event (TObject *Sender)
{[INDENT]
if (_fVisible_Value < _fReal_Value)
     _fVisible_Value++; // Перемещение стрелки на деление вперёд
else if (_fVisible_Value > _fReal_Value)
     _fVisible_Value--; // Перемещение стрелки на деление назад
else
     Timer->Enabled = false; // Остановка таймера
this->Draw_Value(); // Рисование стрелки на новом положении
[/INDENT]}
240
03 октября 2006 года
aks
2.5K / / 14.07.2006
Код на XML? Ты ничего не путаешь? =))
309
03 октября 2006 года
el scorpio
1.1K / / 19.09.2006
Описанный в прошлом посте компонент - фрейм, создаётся в следующим образом.
Меню: "Файл"\"Создать"\"Фрейм". В проект добавляется новый юнит с формой.
Форма эта и есть фрейм - в редакторе форм указываются размеры компонента, добавляются объекты интерфейса и настраиваются их свойства. В .h-файле объявляются поля, методы и свойства фрейма, в .cpp-файле пишется реализация методов - в общем, как с формой.
После чего, переключаемся на форму программы, и на панели компонентов выбираем элемент Frame. В диалоговом окне указываем созданный нами класс фрейма.
Всё - объект расположен на форме и имеет имя, которое можно использовать в тексте программы
21K
03 октября 2006 года
Lokky
2 / / 02.10.2006
[QUOTE=aks]Код на XML? Ты ничего не путаешь? =))[/QUOTE]
нет, не путаю. Привожу код (признаю честно, выдран из методички AVishа (Александр Вишняков) "Создание приборов для Microsoft Flight Simulator"):
Код:
Я приведу уже написанный мной код XML Указателя Скорости и числа М самолета Ту-160
и постараюсь кратко рассказать что где находится и для чего.
Итак, вот код моего прибора:
<Gauge Name="UsmIndicator" Version="1.0">
<!-- ver. 2004_06_03 AVish -->
<Image Name="usm_background.bmp" Luminous="Yes" ImageSizes="0,0,350,350" />
 <Element><Position X="185" Y="185" />
<Image Name="usm_needle.bmp" PointsTo="North" Luminous="Yes" ImageSizes="0,0,148,21">
<Axis X="12" Y="11" />
</Image>
<Rotate>
<Value Minimum="0" Maximum="1400">(A:Airspeed indicated, knots) 1.852 *</Value>
<Failures>
<SYSTEM_PITOT_STATIC Action="0" />
<GAUGE_AIRSPEED Action="Freeze" />
</Failures><Nonlinearity><Item Value="0" X="200" Y="44" />
<Item Value="100" X="229" Y="50" />
<Item Value="200" X="278" Y="80" />
<Item Value="300" X="309" Y="136" />
<Item Value="400" X="312" Y="200" />
<Item Value="500" X="287" Y="259" />
<Item Value="600" X="244" Y="300" />
<Item Value="700" X="176" Y="314" />
<Item Value="800" X="106" Y="300" />
<Item Value="900" X="63" Y="259" />
<Item Value="1000" X="38" Y="200" />
<Item Value="1100" X="41" Y="136" />
<Item Value="1200" X="72" Y="80" />
<Item Value="1300" X="121" Y="50" />
<Item Value="1400" X="150" Y="44" />
</Nonlinearity> <Delay DegreesPerSecond="25" />
</Rotate>
</Element>
<Mouse>
<Help ID="HELPID_GAUGE_AIRSPEED" />
<Tooltip ID="TOOLTIPTEXT_AIRSPEED_KILOS" MetircID="TOOLTIPTEXT_AIRSPEED_KILOS" />
</Mouse>
</Gauge>
1
04 октября 2006 года
kot_
7.3K / / 20.01.2000
[QUOTE=Lokky]Стоит такая задачка: надо создать датчик или симулятор (все равно, например, датчик скорости или амперметр, etc), в котором стрелка будет ПЛАВНО передвигаться на значение, введенное в клавы. :confused: :confused: :confused:
У меня полное не понимание,как это сделать.
1. Есть два рисунка: циферблат и стрелка;
2. Стрелка НЕ должна быть рисованная, это должен быть обычный рисунок (это симулятор и все должно быть весьма реалистично);
3. Передвигаться она должна ПЛАВНО, как на циферблате, а не скакать с одной точки в другую.
4. Есть такой, уже готовый код, на XML, может кто знает какой-нить конвертор (вручную не напишу - XML не знаю);
[/quote]
Если тебе это поможет - XMLMapper :D
Правда чем - это вопрос. В приведенном тобой - это не код датчика - это данные которые он отображает и его координаты при этом. Без разницы в чем ты их будешь хранить.
Т.е. твоя задача - получить данные от пользователя, а затем считать координаты из базы, которые соответствуют этим данным.
[QUOTE=Lokky]
5. Как наложить стрелку на циферблат соотнося центр оси вращения на циферблате и на стрелке? Привязка к координатам? Как? Тоже самое касается перехода на значение - делать привязку к координатам? Как?
[/QUOTE]
Создать как минимум 2 класса - класс который просчитывает текущее положение стрелки по отношению к циферблату, и класс который рисует эту картинку в окне( я так понимаю что датчиков будет не один).
Цитата:

6. Циферблат лучше делать как background или загружать прямо на форму?
Сенк.


???? Более быстро - копировать и извлекать готовую картинку из буфера.

309
05 октября 2006 года
el scorpio
1.1K / / 19.09.2006
Цитата:
Создать как минимум 2 класса - класс который просчитывает текущее положение стрелки по отношению к циферблату, и класс который рисует эту картинку в окне( я так понимаю что датчиков будет не один).


Лучше объединить это в одном компоненте. Хотя за отдельные функции этого компонента могут быть реализованы во вложенных объектах.
Например, сам компонент реализует отображение стрелки, а принадлежащий ему объект определяет текущее положение для плавного перемещения.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог