Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ~MoveTO, ~LineTO, ~CvLine, Undo/Redo при написании ручкой в динамик 
:(
    Опции темы
SERG555
Дата 21.3.2009, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 11.12.2008

Репутация: нет
Всего: нет



Есть рисунок, пока я рисую мне нужны Undo, Redo. Рисую пером соответственно на экране с помощью LineTo и MoveTo в Picture Control, а записываю в файл с помощью СvLine. В общем как реализовать обратный шаг, 2 шага, 3 шага и назад. Undo должен же "затирать" в Picture Control и в рисунке img.


1 СvLine используется у меня при движении пера на событие HCT_EVT_PENMOVE:
Код
DrawLine( pt, m_ptLast );
UpdateCoordinatesDisplay ( evt.XPos, evt.YPos );
addSignPoint(pt.x, pt.y, true);
cvLine( img, cvPoint(m_ptLast.x, m_ptLast.y), cvPoint(pt.x, pt.y), cvScalarAll(255), 1, 8, 0 );
m_ptLast = pt;

ну допустим я буду исходя из cvpoint.x/y исходить при сохранение изображения, а не на событие HCT_EVT_PENMOVE заполнять... То есть сохранение делать не в динамике.
2 А что делать мне с тем то что в динамике я пишу пером и нажимаю Undo я если честно так и не понял как это реализовать (((
Как в PictureCOntrol реализовать Undo ?
Фактически у меня же получается юзаются тока 2 цвета: синий(ручка) и белый(фон). Поэтому я думаю что просто от момента HCT_EVT_PENMOVE до HCT_EVT_PENDOWN зарисовывать цветом фона эти все линии. Как считаете ?

Код
struct HandPulse {
CvPoint pt;
float time;
bool bCont; //continuous writing
};

vector <HandPulse> signPoints;

void CHCT::DrawLine ( CPoint pt1, CPoint pt2 )
{

dc.MoveTo ( pt1 );
dc.LineTo ( pt2 );
}
...
case HCT_EVT_PENMOVE:
DrawLine( pt, m_ptLast );
UpdateCoordinatesDisplay ( evt.XPos, evt.YPos );
addSignPoint(pt.x, pt.y, true);
cvLine( img, cvPoint(m_ptLast.x, m_ptLast.y), cvPoint(pt.x, pt.y), cvScalarAll(255), 1, 8, 0 );
m_ptLast = pt;
...
inline void CHCTDemoDlg::addSignPoint(int x, int y, bool bCont) {
HandPulse insHP;
float time;
if(startHand) 
{
drWatch.Stop();
tmAdd += (float)drWatch.GetDuration() / 1000000.0f;
time = tmAdd;
drWatch.Start();
}
else { 
drWatch.Start();
time = 0.0f; startHand = true; tmAdd = 0.0f;
}
insHP.pt = cvPoint(x,y);
insHP.time = time; insHP.bCont = bCont;
signPoints.push_back(insHP);
}


Есть ли что-нить готовое в C++ или надо писать руками, то помогите пожалуйста тогда с алгоритмом.
PM MAIL   Вверх
Earnest
Дата 23.3.2009, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Нет ничего готового.
Для UNDO-REDO удобнее завести отдельный буфер, а не пытаться использовать записи в документ. Это неудобно, а кроме того, для хорошщей реализации UNDO-REDO могут потребоваться дополнительные параметры.
Буфер UNDO реализуется как 2 стека (отдельно для элементов UNDO и REDO). Идея в том, чтобы UNDO и REDO-операции были "автоматическими". Т.е. каждый элемент буфера умел сам выполнять свой откат (элементы могут быть разными).
Примерно так: создаем новый элемент на экране, записываем его в документ и одновременно создаем соответствующий 
элемент в UNDO-буфер. При выполнении UNDO достаем из буфера верхний элемент, выполняем ему откат, который автоматически должен создать элемент для REDO и положить в буфер.  И т.д.
Реализация элементов буфера могла бы вполне ссылаться на содержимое документа, но удобнее держать копию (или использовать умные указатели с подсчетом ссылок.
Это просто идея. Дальше думай сам.


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.1044 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.