Поиск:

Ответ в темуСоздание новой темы Создание опроса
> толщина линии 
:(
    Опции темы
mrgloom
Дата 16.12.2013, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Допустим есть линия, которая рисуется поверх изображения, надо при сохранении изображения эту линию проецировать.
Ну это понятно как сделать, надо сначала отрисовать как обычно, а потом просто скопировать в битмап и его уже сохранять.

Но требуется сделать изменяемую толщину линии(чтобы толщина зависела от размера изображения, т.к. на большом изображении она просто очень тонкая и теряется), понятно что можно менять толщину при создании CPen::CreatePen
но там толщина изменяется дискретно, оптимальное ли это решение? 
PM MAIL   Вверх
Amp
Дата 16.12.2013, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Линии же все равно страшными и несглаженными будут. К чему тут точность?
PM MAIL   Вверх
mrgloom
Дата 18.12.2013, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



непонятно при создании CPen::CreatePen, nWidth задаётся в каких единицах? device units это пиксели? и зависит от mapping mode или от чего?

допустим если я хочу чтобы моя линия была различных размеров в зависимости от размера изображения, например 0.1% от max(w,h) или например чтобы при выводе изображения в каком то размере, например масштаб изображения 60%(чтобы поместилось в экран) и я хочу чтобы моя линия показывалась 1 мм толщиной. Как это можно сделать?


PM MAIL   Вверх
Amp
Дата 18.12.2013, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Завязываться на DPI. Хоть через тот же SetMapMode. Но реальные единицы измерения (сантиметры, дюймы) на экране монитора большого смысла не имеют, так как DPI там логический.
PM MAIL   Вверх
mrgloom
Дата 18.12.2013, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



я не понимаю как это сделать через mapping mode
мне надо изменить только толщину линии ,а сам размер линии мне менять не надо.

нашел код который делает что то похожее, можете его прокомментировать?
Код

CSize imReqSizeMm = CSize(2000, 1000);//исходя из каких соображений подбирать размер?
int dpi = dc.GetDeviceCaps(LOGPIXELSX);
CSize imActSizeMm = CSize( (int)(10.0 * w * MM_PER_INCH / dpi),
(int)(10.0 * h * MM_PER_INCH / dpi) ); //почему уможаем на 10?
dc.SetMapMode(MM_ISOTROPIC);
dc.SetWindowExt(imReqSizeMm);
dc.SetViewportExt(imActSizeMm);
float scale = (float)imReqSizeMm.cx / imActSizeMm.cx;
CRect rcImg( 0, 0, (int)(w * scale), (int)(h * scale) );

PM MAIL   Вверх
mrgloom
Дата 18.12.2013, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



вот тут еще

http://stackoverflow.com/questions/1918332...tive-text-width
хоть и про делфи, но всё равно 
Цитата

The fundamental problem is that you try to zoom the text by changing its Height. Given that the Windows API uses an integer coordinate system it follows that only certain discrete font heights are possible. If for example you have a font 20 pixels high at a scale value of 100%, then you can basically set only scale values that are multiples of 5%. Worse than that, even with TrueType fonts not all of those will give pleasing results.

я про это изначально говорил, только я всё таки не понимаю как работает mapping mode или при изменении масштаба через mapping mode мы должны так же делить на scale и саму длину линии и так увеличиться только толщина?  
PM MAIL   Вверх
mrgloom
Дата 20.1.2014, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



я всё таки не понял mapping mode позволяет менять толщину отрезка или нет? или можно менять только масштаб таким образом?

т.е. размер отрезка должен оставаться тем же самым, а должна измениться только толщина в зависимости от параметров.

+ еще не очень понятно в каких единицах задаётся толщина в функции CPen::CreatePen в логических единицах?
PM MAIL   Вверх
Amp
Дата 20.1.2014, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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


 




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


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

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