C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Вопрос по графике  (Прочитано 4357 раз)
Sergey1985
Участник


Сказали спасибо: +8/-1
Offline

Сообщений: 310


Вопрос по графике
« : 30 Ноябрь 2014, 22:59:16 »

Здравствуйте уважаемые  .  Появилась необходимость отрисовать в программе автомобильный спидометр. Желательно покрасивей. Вопрос: как лучше сделать движение стрелки? И шкала и стрелка должны быть созданы в Фотошопе. (для красоты). В общем как один рисунок вращать на фоне другого? (Всякие там Image->Canvas->MoveTo и Image->Canvas->LineTo не подходят по определению)
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: Вопрос по графике
« Ответ #1 : 01 Декабрь 2014, 07:52:16 »

Если Firemonkey - все легко реализуется встроенными контролами (вращать можно любой).
Если VCL - смотри в сторону графических библиотек (например DirectX, OpenGL и т.п.)
Записан
POV
Участник


Сказали спасибо: +107/-7
Offline

Сообщений: 640


Re: Вопрос по графике
« Ответ #2 : 01 Декабрь 2014, 10:29:26 »

GDI+ к примеру даст красивости и удобства.
Записан
Sergey1985
Участник


Сказали спасибо: +8/-1
Offline

Сообщений: 310


Re: Вопрос по графике
« Ответ #3 : 01 Декабрь 2014, 11:19:28 »

Использую C++Builder6 так что Firemonkey отпадает по определению. 
Записан
POV
Участник


Сказали спасибо: +107/-7
Offline

Сообщений: 640


Re: Вопрос по графике
« Ответ #4 : 01 Декабрь 2014, 11:56:01 »

Кстати, а чего гифку не хотишь забубенить и казать нужный кадр? Сейчас уже никто размерами программ не загоняется. Заодно всегда можно "скины" организовать подменяя гифки.
Из предложенного тебе выше GDI+ самое простое. Инфы море.
Записан
Sergey1985
Участник


Сказали спасибо: +8/-1
Offline

Сообщений: 310


Re: Вопрос по графике
« Ответ #5 : 01 Декабрь 2014, 15:29:04 »

А гифки это их в какой проге рисовать нужно? Тоже в фотошопе или есть более простые варианты?
Записан
POV
Участник


Сказали спасибо: +107/-7
Offline

Сообщений: 640


Re: Вопрос по графике
« Ответ #6 : 02 Декабрь 2014, 09:50:53 »

Есть куча софта для создания GIF из набора картинок.

Но и программный поворот стрелки и наложение на фон не представляет проблемы. Делов-то.. За один день разберёшься и всё напишешь.
http://www.programmersforum.ru/showthread.php?t=211751
« Последнее редактирование: 02 Декабрь 2014, 10:00:57 от POV » Записан
Sergey1985
Участник


Сказали спасибо: +8/-1
Offline

Сообщений: 310


Re: Вопрос по графике
« Ответ #7 : 02 Декабрь 2014, 16:18:22 »

А есть ли спец сайты с примерами GDI+      как http://locv.ru для OpenCV к примеру?
Записан
POV
Участник


Сказали спасибо: +107/-7
Offline

Сообщений: 640


Re: Вопрос по графике
« Ответ #8 : 02 Декабрь 2014, 16:21:30 »

Да зачем же OpenCV для такой тривиальщины?! Без обертки вызвать функцию поворота не судьба?
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: Вопрос по графике
« Ответ #9 : 03 Декабрь 2014, 14:42:27 »

OpenCV - библиотека для компьютерного зрения, строго говоря, это не для рисования, а для распознавания и тому подобных задач.
Здесь - разные способы вращения изображений (включая встроенные методы рисования и в конце GDI+).
Записан
POV
Участник


Сказали спасибо: +107/-7
Offline

Сообщений: 640


Re: Вопрос по графике
« Ответ #10 : 03 Декабрь 2014, 16:54:28 »

Вот по быстрому накидал.. но поленился сообразить как смещения посчитать чтобы вращать вокруг нужной точки..


Код
//---------------------------------------------------------------------------
//----------------------------------
// настройка среды для GdiPlus
#define STRICT
#pragma option -w-hid
#include
#include
using std::min;
using std::max;
#include
#pragma comment(lib, "GdiPlus.lib") // для статик линковки
#pragma option -whid
 
Gdiplus::GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR  gdiplusToken;
 
//---------------------------------------------------------------------------
 
#include
...

Код
void __fastcall TForm11::FormCreate(TObject *Sender)
{
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
}
//---------------------------------------------------------------------------
void __fastcall TForm11::FormDestroy(TObject *Sender)
{
Gdiplus::GdiplusShutdown(gdiplusToken);
}
//---------------------------------------------------------------------------
 

Код
void __fastcall TForm11::PrepareBackground()
{
// фон из файла
Gdiplus::Bitmap pict(L"1.bmp");
 
// стрелка из файла
Gdiplus::Bitmap arrow(L"2.png");
 
// там будем выводить результат
Gdiplus::Graphics dest(this->Handle);
 
// буфер в котором перемасштабированная картинка из файла
Gdiplus::Bitmap *sour = new Gdiplus::Bitmap(Width, Height, PixelFormat32bppPARGB);
Gdiplus::Graphics temp(sour);
temp.SetSmoothingMode(Gdiplus::SmoothingModeHighQuality);
 
temp.ResetTransform ();
temp.DrawImage(&pict, 0, 0, Width, Height);
 
float dx = arrow.GetWidth()/2 *cos(angle*3.14/180);
float dy = 0;//(arrow.GetHeight()-9);//*sin(angle*3.14/180);
temp.TranslateTransform (100-dx, 100+dy);
temp.RotateTransform(angle);
temp.DrawImage(&arrow, 0, 0, arrow.GetWidth(), arrow.GetHeight());
 
temp.ResetTransform();
Gdiplus::Pen pen(Gdiplus::Color(255, 0, 0, 255));
temp.DrawLine(&pen, 100, 0, 100, 200);
temp.DrawLine(&pen, 0, 100, 200, 100);
 
dest.DrawImage(sour, Gdiplus::PointF(0,0));
 
Caption = angle;
}

Код
void __fastcall TForm11::Timer1Timer(TObject *Sender)
{
Timer1->Enabled = false;
PrepareBackground();
angle += 10;
if (angle > 360)
angle = 0;
Timer1->Enabled = true;
}
« Последнее редактирование: 04 Декабрь 2014, 12:24:22 от POV » Записан
Sergey1985
Участник


Сказали спасибо: +8/-1
Offline

Сообщений: 310


Re: Вопрос по графике
« Ответ #11 : 04 Декабрь 2014, 10:27:12 »

Цитата: POV от 02 Декабрь 2014, 16:21:30
Да зачем же OpenCV для такой тривиальщины?! Без обертки вызвать функцию поворота не судьба?
Естественно что OpenCV я и не планировал для этого использовать   Я просто хотел показать пример отличного мануала для этой библиотеки и спросить пример аналогичного сайта для GDI+
Записан
Sergey1985
Участник


Сказали спасибо: +8/-1
Offline

Сообщений: 310


Re: Вопрос по графике
« Ответ #12 : 04 Декабрь 2014, 10:35:05 »

А за пример большое спасибки БЛАГОДАРЮ
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: Вопрос по графике
« Ответ #13 : 04 Декабрь 2014, 10:42:57 »

Держи, дарю 
См. 1-ая и 4-ая статья + исходные проекты.
Записан
Sergey1985
Участник


Сказали спасибо: +8/-1
Offline

Сообщений: 310


Re: Вопрос по графике
« Ответ #14 : 05 Декабрь 2014, 12:25:36 »

О-о-о классный босяцкий подгон))) 
Записан
Sergey1985
Участник


Сказали спасибо: +8/-1
Offline

Сообщений: 310


Re: Вопрос по графике
« Ответ #15 : 05 Декабрь 2014, 12:30:58 »

И еще вопросик
как можно вот эту переменную Gdiplus::Bitmap pict(L"1.bmp");
сделать глобальной? Ну или проверять чтоб она по 1000000... раз не загружалась. Это для использования этого всего алгоритма в таймере. Динамика понимаете ли
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: Вопрос по графике
« Ответ #16 : 05 Декабрь 2014, 20:31:06 »

Цитата: Sergey1985 от 05 Декабрь 2014, 12:30:58
И еще вопросик
как можно вот эту переменную Gdiplus::Bitmap pict(L"1.bmp");
сделать глобальной? Ну или проверять чтоб она по 1000000... раз не загружалась. Это для использования этого всего алгоритма в таймере. Динамика понимаете ли

Без проблем - объявляешь ее с модификатором extern в одном хедере, инициализируешь один раз, а хедер этот подключаешь куда тебе надо. Например
Код
//---------------- Unit1.h
 
extern Gdiplus::Bitmap pict;     // объявление глобальной переменной (здесь не выделяется память!)
 
//---------------- Unit1.cpp
 
#include "Unit1.h"                   // для использования pict
 
Gdiplus::Bitmap pict(L"1.bmp");  // выделение памяти под переменную происходит только 1 раз!
 
 
 
 
 
//---------------- Unit2.h
 
#include "Unit1.h"                  // для использования pict
 
//---------------- Unit2.cpp
 
#include "Unit2.h"
 
// === тут есть доступ к pict ===
 
Записан
Sergey1985
Участник


Сказали спасибо: +8/-1
Offline

Сообщений: 310


Re: Вопрос по графике
« Ответ #17 : 06 Декабрь 2014, 08:19:17 »

Странно но вот такая запись
//---------------- Unit1.cpp
 
#include "Unit1.h"                   // для использования pict
 
Gdiplus::Bitmap pict(L"1.bmp");  // выделение памяти под переменную происходит только 1 раз!
приводит к тому что картинка пропадает(((
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


« Ответ #18 : 06 Декабрь 2014, 10:40:28 »

Цитата: Sergey1985 от 06 Декабрь 2014, 08:19:17
Странно но вот такая запись
//---------------- Unit1.cpp
 
#include "Unit1.h"                   // для использования pict
 
Gdiplus::Bitmap pict(L"1.bmp");  // выделение памяти под переменную происходит только 1 раз!
приводит к тому что картинка пропадает(((

Ну да, т.к. надо рисовать каждый раз в событии OnDraw или еще каком-то в этом роде. Лучше использовать глобальный указатель, а память выделять динамически:

Код
//---------------- Unit1.h
 
extern Gdiplus::Bitmap* pict;     // объявление глобального указателя (здесь не выделяется память!)
 
//---------------- Unit1.cpp
 
#include "Unit1.h"                    // для использования pict
 
Gdiplus::Bitmap* pict = NULL;     // инициализация (определение) глобального указателя (здесь не выделяется память!)
 
 
 
 
 
//---------------- Unit2.h
 
#include "Unit1.h"                  // для использования pict
 
//---------------- Unit2.cpp
 
#include "Unit2.h"
 
// === тут есть доступ к pict ===
 
// в событии OnDraw (например, формы):
 
delete pict;
pict = new Gdiplus::Bitmap(L"1.bmp");
// и т.д.
 
// не забываем освобождать память (например в деструкторе формы)
delete pict;
 
 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.115 секунд. Запросов: 19.