Написание курсовой с использованием LaTeX

В очередной раз пришло время писать курсовую. Как-то давно я написал стиль для курсовой и использую его. Но сначала нужно установить редактор LaTeX. В дебиане можно использовать эти команды (постоянно забываю, поэтому и пишу сей пость):
 sudo aptitude install texmaker texlive-lang-cyrillic scalable-cyrfonts-tex texlive-fonts-recommended 
Вот и все, у вас установлен texmaker, с помощью которого можно написать курсовую.
Я использую схему с несколькими *.tex файлами. В файле coursework.tex я задаю схему оформления, и некоторые функции:
%Бумага A4, шрифт 14
\documentclass[a4paper,12pt]{article}
\usepackage{cyrtimes}
\usepackage[T2A]{fontenc}
\usepackage{listings}
\usepackage[utf8]{inputenc}
\usepackage{setspace}
\usepackage[english,russian]{babel}
\usepackage{amssymb,amsfonts,amsmath,cite,enumerate,float,indentfirst} 
\usepackage{graphicx}
\usepackage[compact,explicit]{titlesec}

%Оформление библиографии через точку
\makeatletter
\renewcommand{\@biblabel}[1]{#1.}
\makeatother

%Полуторный интервал
\renewcommand{\baselinestretch}{1.4}

%Растягивать там, где не удается перенести слово
\sloppy

%Частота переносов
\hyphenpenalty=2000

\parindent 1cm  %абзацный отступ

%Отступы у страниц
\usepackage{geometry}
\geometry{left=3cm}
\geometry{right=1cm}
\geometry{top=2cm}
\geometry{bottom=2cm}

\usepackage{fancyhdr}
\pagestyle{fancy}
\fancyhf{}
\fancyfoot[R]{\thepage}
\renewcommand{\headrulewidth}{0pt}
\renewcommand{\footrulewidth}{0pt}


%Меняем везде перечисления на цифра.цифра
\renewcommand{\theenumi}{\arabic{enumi}.}
\renewcommand{\labelenumi}{\arabic{enumi}.}
\renewcommand{\theenumii}{.\arabic{enumii}.}
\renewcommand{\labelenumii}{\arabic{enumi}.\arabic{enumii}.}
\renewcommand{\theenumiii}{.\arabic{enumiii}}
\renewcommand{\labelenumiii}{\arabic{enumi}.\arabic{enumii}.\arabic{enumiii}.}

%Пользовательские функции
\newcommand{\addimg}[3]{
\begin{figure}
\begin{center}
\includegraphics[scale=#2]{#1}
\end{center}
\caption{#3}
\end{figure}
}
\newcommand{\addimghere}[3]{
\begin{figure}[H]
\begin{center}
\includegraphics[scale=#2]{#1}
\end{center}
\caption{#3}
\end{figure}
}

\newcommand{\addtwoimghere}[4] {
\begin{figure}[H]
\begin{center}
\includegraphics[scale=#3]{#1}
\hfill
\includegraphics[scale=#3]{#2}
\end{center}
\caption{#4}
\end{figure}
}

%Для кода
\lstset{language=C++, tabsize=2, breaklines=true, basicstyle=\footnotesize\ttfamily}
\lstset{xleftmargin=10pt, showstringspaces=false}


\newenvironment{listing}
{\begin{list}{}{\setlength{\leftmargin}{1em}}\item\footnotesize\bfseries}
{\end{list}}

\newcommand{\code}[1] {
 \texttt{\begin{footnotesize}#1\end{footnotesize}}
}


%В документ включаются различные части работы
\begin{document}
\newpage
\large

\titleformat{\section}[block]{\Large\bfseries\filcenter}{}{1em}{#1}
\input{abstract}
\newpage
\tableofcontents
\newpage

\titleformat{\section}[block]{\Large\bfseries\filcenter}{}{1em}{\thesection\quad#1}
\titleformat{\subsection}[block]{\large\bfseries\filcenter}{}{1em}{\thesubsection\quad#1}
\titleformat{\subsubsection}[block]{\large\bfseries\filcenter}{}{1em}{\thesubsubsection\quad#1}
\titleformat{\paragraph}[block]{\Large\bfseries\filcenter}{}{1em}{#1}

\newcommand{\anonsection}[1]{
\paragraph{#1}\addcontentsline{toc}{section}{#1}
}

\input{introduction}
\newpage
\input{problem}
\newpage
\input{architecture}
\newpage
\input{example}
\newpage
\input{finally}
\newpage
\input{literature}
\end{document}
В файлах abstract.tex, introdution.tex, problem.tex ... literature.tex я пишу собственно содержание курсовой работы.

Обычно, каждый раздел начинается с команды \section*{Название}. Это позволяет именовать раздел без нумерации. Также это позволяет сделать команда \anonsection{}. По некоторым причинам \section* иногда не подходит (например в заключении).
Пользовательские команды \addimg, \addimghere, \addtwoimghere позволяют быстро и просто добавить изображение.

Код в LaTeX удобно заключать между командами \begin{lstlisting} и \end{lstlisting}. При этом он автоматически форматируется и подсвечивается, согласно описанию в coursework.tex.

Использование готового шаблона в LaTeX позволяют сэкономить весьма много времени на оформление  отдельных частей текста.

Теплота и уют

Иногда приходиться работать в Windows. Типичный лад работы с этой ОС у меня всегда вызывал небольшое раздражение: ни вам дополнительных рабочих столов, ни нормальной консоли. Хотя потихоньку нахожу различные полезные программки и дополнения, облегчающие жизнь. Дополнительные рабочие пространства можно получить используя сторонний шелл bblean, вместо стандартного explorer. Чтобы получить юниксовую консоль нужно установить уже всем давно известный cygwin. Однако долгое время мне не хватало нормального терминала. Конечно есть putty и cmd.exe, но не то. Недавно нашел на хабре статью про ConEmu. Вот основные его прелести: можно переключить в quake-режим и вызывать его, например, по win+tilda. Это очень круто, если вы держите в консоли переводчик, и вам нужно перевести пару фраз (позже напишу, наверое об этом статейку). Кроме того, этот терминал поддерживает разные виды шеллов: bash, cmd.exe. Также есть табы. У меня в одном табе запущен FAR под cmd, в другом - bash. Почитать об этом можно тут: http://habrahabr.ru/post/164687/. Думаю нужно будет в скором времени написать про свое окружение в windows и linux.

Volumetric Light Scattering

Читал тут статью про имитацию солнечных лучей(http://http.developer.nvidia.com/GPUGems3/gpugems3_ch13.html). Таким могут возникнуть например при тумане или если у вас в комнате достаточно пыльно.
Алгоритм вроде ясен и понятен, хотя что-то кажется что будет тормозить, так как для вычисления цвета одного фрагмента потребуется n обращений к текстуре. С другой стороны даже самый простой blur требует 4 лукапа.
Алгоритм полностью работает в постпроцессе, т.е. скорее всего придется делать еще один проход (а может и нет:-))

Для себя в будущем: в статье говорилось, что неплохо использовать downsampling, т.е. работать с уменьшенной копией экрана (возможно mipmap).
Надеюсь после сессии (а может и до) реализовать такое чудо. А пока картинка с сайта  NVidia.
Картинка из GPU Gems 3

Доработка

Давно ничего не писал, так как занимался рефакторингом движка и его улучшением. До доработки игрался с постпроцессом: реализовал фильтр Собеля, игрался с размытием по глубине. Multi pass рендеринг достается пока слишком тяжело, хотелось бы добавить некоторые полезные абстракции, например, материалы и техники.
Кроме того, вчера, попробовал реализовать shadow mapping, который также требует двух проходов. Сейчас буду пытаться завернуть эту технику в классы, чтобы можно было ей манипулировать (пока что все на слишком низком уровне).
Shadow mapping с 4 лукапами из текстуры
Фильтр Собеля
Собель от Себеля смотрится эффектно
Размытие по глубине


Про Image-based Lighting

Читаю OpenGL Cookbook наткнулся на очень интересную модель освещения, основанную на кубических картах. Смысл вот в чем: каждый тексель окружающей текстуры считается маленьким источником освещения. Если сторона кубмапы равна N, то текселей в ней будет 6*N^2, поэтому рассчитывать все в реальном времени невозможно. Поэтому освещение рассчитывают заранее, и результат заносят в другую кубическую карту.
Например диффузное освещение от n источников, можно рассчитать по формуле:
где Kd - диффузный цвет поверхности, Si  - положение источника света, n   - нормаль к поверхности, Li - цвет источника света.

Однако заранее нормаль не известна, так как освещаемые объекты могут быть различны. Поэтому, для предрасчета освещения, используют дополнительную кубическую карту, которая играть роль функции, переводящей нормаль n в результирующее значение цвета поверхности. То есть для каждого направления нормали требуется рассчитать (по формуле выше) значение диффузной компоненты света.
Аналогично, можно заранее рассчитать значение зеркальной компоненты:
Здесь кубическая карта будет переводить позицию наблюдателя v в зеркальную составляющую освещения.
 
Вообще, существует программы, которые занимаются генерированием таких карт, например HDRShop и Modified CubemapGen. Однако первая стоит денег, вторая у меня не запустилась (да и обе под Windows). Поэтому я решил написать свой вариант.

Результат получился весьма приличным:


     

Cubemapping. Металл и стекло

Уже около двух месяцев я не занимался своей библиотекой (обертка для OpenGL, в дальнейшем, возможно, графический движок). Сейчас начал вспоминать написанный код - вполне понятно и даже не стыдно. Продолжил чтение книги OpenGL 4.0 Cookbook и пытаюсь вспомнить архитектуру OGL, посматривая http://www.opengl.org/wiki/ (очень хорошая вики по библиотеке). Доделал шейдер преломления и могу показать результат:
 Вычисления весьма примитивные, попробую в дальнейшем использовать формулы Френеля.
PS: Новый QtCreator весьма сырой, хотя код подсвечивает как новогоднюю елку. Из-за сегфолтов пришлось отказаться

UPD: С использованием формул Френеля стало лучше. Их эффект в том, что при перпендикулярном попадании, луч преломляется лучше, чем при касательном.

О сборке deb пакетов или как не превратить дебиан в свалку

Debian - весьма стабильная система, однако за это нужно расплачиваться весьма не новыми пакетами в репозитории. Возникла у меня мысль использовать clang для парсинга C++ кода, т.е. воспользоваться python bindings, которые есть в clang 3.2. Clang 3.2 нет в репозитории, поэтому нужно собирать вручную.
Сборка проекта с помощью всем известных ./configure && make && make install несет в себе опасность. После make install мы получим бинарники раскиданные по всей системе, о которых не знает пакетный менеджер - в будущем проблемы обеспечены. Кроме того, если потребуется снова собрать приложение, то это потребует времени (llvm + clang собирались на моем уютном ноутбуке около 1.5 часа).
Решить все эти проблемы можно, собрав аккуратненький deb-пакет. В этом нам поможет утилита checkinstall, которой весьма просто пользоваться.
Настраиваем сборку с помощью ./configure. Здесь будет полезно установить префикс, т.к. многие приложения лезут в /usr/local, но удобнее работать с /usr:
 ./configure --prefix=/usr 
Затем собираем утилитой make:
 make
На последнем шаге, вместо make install воспользуемся checkinstall. По-хорошему, достаточно вызова sudo checkinstall, но в дебиане недостаточно новая версия утилиты, и это вызовет ошибку при создании директории в /usr:
  /bin/mkdir: cannot create directory `/usr/share/llvm': No such file or directory 
Костыль для дебиана:
 sudo checkinstall -D --fstrans=no --install=yes   
Checkinstall задаст несколько вопросов: хорошим тоном будет указать описание, указать себя в качестве мейнтейнера, зависимости и т.д.
После работы утилиты будем иметь deb-пакет, причем он будет уже установлен. В будущем такой пакет можно установить через dpkg -i package-name.deb.

Технологии Blogger.