Операции над точками и векторами

Операции над точками:

  • расстояние между точками \sqrt{(x_a-x_b)^2+(y_a-y_b)^2+(z_a-z_b)^2}

Операции над векторами:

  • длина \left|\vec{v}\right|=\sqrt{x^2+y^2+z^2}
  • скалярное произведение n=(\vec{a}, \vec{b})=|\vec{a}|* |\vec{b}|*cos\angle(\vec{a},\vec{b}) = x_a x_b + y_a y_b + z_a z_b, где n длина проекции вектора \vec{a} на вектор \vec{b}
  • векторное произведение \vec{c}=(y_a z_b-z_a y_b;z_a x_b-x_a z_b;x_a y_b-y_a x_b), где \vec{c} перпендикуляр к плоскости, которую образуют \vec{a} и \vec{b}
  • сложение векторов \vec{a}+\vec{b}=(x_a+x_b;y_a+y_b;z_a+z_b)
  • вычитание векторов \vec{a}-\vec{b}=(x_a-x_b;y_a-y_b;z_a-z_b)
Использование precompiled headers в CMake

Макрос для использования precompiled headers в CMake + Visual Studio 2008.

macro(USE_PRECOMPILED_HEADER PrecompiledHeader Sources)
    get_filename_component(HEADER_NAME ${PrecompiledHeader} NAME_WE)
    set(PrecompiledBinary ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE}/${HEADER_NAME}.pch)
    set(PrecompiledSource ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE}/${HEADER_NAME}.cpp)
    set(NEED_UPDATE_HEADER_CPP TRUE)
    set(PrecompiledData "#include \"${PrecompiledHeader}\"")
    if (EXISTS ${PrecompiledSource})
        file(READ ${PrecompiledSource} HEADER_CPP_DATA_IN)
        if (NOT ${HEADER_CPP_DATA_IN} STREQUAL ${PrecompiledData})
            SET(NEED_UPDATE_HEADER_CPP TRUE)
        else ()
            SET(NEED_UPDATE_HEADER_CPP FALSE)
        endif ()
    endif ()
    if (NEED_UPDATE_HEADER_CPP)
        file(WRITE ${PrecompiledSource} ${PrecompiledData})
    endif ()
    set_source_files_properties(${PrecompiledSource}
        PROPERTIES
        COMPILE_FLAGS "/Yc${PrecompiledHeader} /Fp${PrecompiledBinary}"
        OBJECT_OUTPUTS ${PrecompiledBinary}
    )
    set(DUPLICATE_SOURCES ${${Sources}})
    set_source_files_properties(${DUPLICATE_SOURCES}
        PROPERTIES
        COMPILE_FLAGS "/Yu${PrecompiledBinary} /FI${PrecompiledBinary} /Fp${PrecompiledBinary}"
        OBJECT_DEPENDS ${PrecompiledBinary}
    )
    source_group(src ${PrecompiledSource})
    list(APPEND ${Sources} ${PrecompiledSource})
endmacro(USE_PRECOMPILED_HEADER)

Использование тривиально:

FILE( GLOB_RECURSE SRC *.cpp )
USE_PRECOMPILED_HEADER("precompiled.h" SRC )

UPDATE: Окончательный вариант precompiled headers смотрим здесь.

Пустая переменная CMAKE_BUILD_TYPE при запуске INSTALL из MSVC

Для генерация файлов сборки проекта в последнее время пользуюсь замечательной утилитой CMake.

В процессе использования утилиты наткнулся на неприятный баг. Переменная CMAKE_BUILD_TYPE при сборки из под Visual Studio 2008 всегда оказывается пустой, вне зависимости от выбранного типа сборки (Debug, Release, RelWithDebInfo).

Решение проблемы заключается в использовании макроса CMAKE_INSTALL_CONFIG_NAME. Макрос этот хитрый и в документации к CMake вы его не найдете. Он используется только в сгенерированном файле cmake_install.cmake при выполнении цели INSTALL.

Пример использования этого макроса

set( INSTALL_PREFIX ${CMAKE_CURRENT_SOURCE_DIR}/bin/\${CMAKE_INSTALL_CONFIG_NAME})

Обратите внимание на обратный слеш после «bin/», он не дает раскрыть макрос до выполнения скрипта cmake_install.cmake, который вызывается из Visual Studio 2008 при компиляции цели INSTALL

Блог Евгения Жирнова