Skip to content

Commit 9a97810

Browse files
kvedalagithub-actions
and
github-actions
authored
[enhancement] New Graphics implementation with algorithm for spirograph (#557)
* skeleton of spirograph * add graphics to cmake * updating DIRECTORY.md * added cmake to graphics folder * add stub test function * working program * set pre-processor macro if GLUT is available * use snprintf details: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1967.htm * conditional include for mac * corrected conditional include for mac * fix cmake for MACOS * OpenGL animation if available, else plot to CSV * MacOS does not provide glutBitmapString function * formatting source-code for 8d570b4 * fix parameter * try caps include path GL * provide custom glutBitmapString cuntion * add glut library to gitpod docker * enable VNC in gitpod * better documentation and cmake configuration * enable keyboard inputs to pause and change parameters * fix lgtm alerts * implementation similar to one in C++ repo * fix compilation errors on MSVC Co-authored-by: github-actions <${GITHUB_ACTOR}@users.noreply.github.com>
1 parent cdf8453 commit 9a97810

File tree

5 files changed

+423
-34
lines changed

5 files changed

+423
-34
lines changed

.gitpod.dockerfile

+9-7
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1-
FROM gitpod/workspace-full
1+
FROM gitpod/workspace-full-vnc
22

33
RUN sudo apt-get update \
4-
&& sudo apt-get install -y \
5-
doxygen \
6-
graphviz \
7-
ninja-build \
8-
&& pip install cpplint \
9-
&& sudo rm -rf /var/lib/apt/lists/*
4+
&& sudo apt-get install -y \
5+
doxygen \
6+
graphviz \
7+
ninja-build \
8+
freeglut3 \
9+
freeglut3-dev \
10+
&& pip install cpplint \
11+
&& sudo rm -rf /var/lib/apt/lists/*

CMakeLists.txt

+35-27
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,38 @@
1-
cmake_minimum_required(VERSION 3.3)
1+
cmake_minimum_required(VERSION 3.6)
22
project(Algorithms_in_C
33
LANGUAGES C
44
VERSION 1.0.0
55
DESCRIPTION "Set of algorithms implemented in C."
66
)
77

8+
set(CMAKE_C_STANDARD 11)
9+
set(CMAKE_C_STANDARD_REQUIRED YES)
10+
11+
if(MSVC)
12+
add_compile_definitions(_CRT_SECURE_NO_WARNINGS)
13+
# add_compile_options(/Za)
14+
endif(MSVC)
15+
16+
find_library(MATH_LIBRARY m)
17+
818
option(USE_OPENMP "flag to use OpenMP for multithreading" ON)
19+
if(USE_OPENMP)
20+
find_package(OpenMP)
21+
if (OpenMP_C_FOUND)
22+
message(STATUS "Building with OpenMP Multithreading.")
23+
else()
24+
message(STATUS "No OpenMP found, no multithreading.")
25+
endif()
26+
endif()
27+
28+
add_subdirectory(misc)
29+
add_subdirectory(sorting)
30+
add_subdirectory(graphics)
31+
add_subdirectory(searching)
32+
add_subdirectory(conversions)
33+
add_subdirectory(project_euler)
34+
add_subdirectory(machine_learning)
35+
add_subdirectory(numerical_methods)
936

1037
cmake_policy(SET CMP0054 NEW)
1138
cmake_policy(SET CMP0057 NEW)
@@ -21,6 +48,7 @@ if(DOXYGEN_FOUND)
2148
set(DOXYGEN_GENERATE_TREEVIEW YES)
2249
set(DOXYGEN_JAVADOC_AUTOBRIEF YES)
2350
set(DOXYGEN_STRIP_CODE_COMMENTS NO)
51+
set(DOXYGEN_ENABLE_PREPROCESSING YES)
2452
set(DOXYGEN_EXT_LINKS_IN_WINDOW YES)
2553
set(DOXYGEN_OPTIMIZE_OUTPUT_FOR_C YES)
2654
set(DOXYGEN_CLANG_ASSISTED_PARSING YES)
@@ -34,6 +62,12 @@ if(DOXYGEN_FOUND)
3462
set(DOXYGEN_INTERACTIVE_SVG YES)
3563
set(DOXYGEN_DOT_IMAGE_FORMAT "svg")
3664
endif()
65+
if(OPENMP_FOUND)
66+
set(DOXYGEN_PREDEFINED "_OPENMP=1")
67+
endif()
68+
if(GLUT_FOUND)
69+
set(DOXYGEN_PREDEFINED ${DOXYGEN_PREDEFINED} "GLUT_FOUND=1")
70+
endif()
3771

3872
doxygen_add_docs(
3973
doc
@@ -42,32 +76,6 @@ if(DOXYGEN_FOUND)
4276
)
4377
endif()
4478

45-
set(CMAKE_C_STANDARD 11)
46-
set(CMAKE_C_STANDARD_REQUIRED YES)
47-
48-
if(MSVC)
49-
add_compile_definitions(_CRT_SECURE_NO_WARNINGS)
50-
# add_compile_options(/Za)
51-
endif(MSVC)
52-
53-
find_library(MATH_LIBRARY m)
54-
55-
if(USE_OPENMP)
56-
find_package(OpenMP)
57-
if (OpenMP_C_FOUND)
58-
message(STATUS "Building with OpenMP Multithreading.")
59-
else()
60-
message(STATUS "No OpenMP found, no multithreading.")
61-
endif()
62-
endif()
63-
64-
add_subdirectory(misc)
65-
add_subdirectory(sorting)
66-
add_subdirectory(searching)
67-
add_subdirectory(conversions)
68-
add_subdirectory(project_euler)
69-
add_subdirectory(machine_learning)
70-
add_subdirectory(numerical_methods)
7179

7280
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
7381
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})

DIRECTORY.md

+3
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,9 @@
107107
* [Word Count](https://github.com/TheAlgorithms/C/blob/master/exercism/word_count/word_count.c)
108108
* [Word Count](https://github.com/TheAlgorithms/C/blob/master/exercism/word_count/word_count.h)
109109

110+
## Graphics
111+
* [Spirograph](https://github.com/TheAlgorithms/C/blob/master/graphics/spirograph.c)
112+
110113
## Greedy Approach
111114
* [Djikstra](https://github.com/TheAlgorithms/C/blob/master/greedy_approach/djikstra.c)
112115

graphics/CMakeLists.txt

+88
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
find_package(OpenGL)
2+
if(OpenGL_FOUND)
3+
find_package(GLUT)
4+
if(NOT GLUT_FOUND)
5+
message("FreeGLUT library will be downloaded and built.")
6+
include(ExternalProject)
7+
ExternalProject_Add (
8+
FREEGLUT-PRJ
9+
URL https://sourceforge.net/projects/freeglut/files/freeglut/3.2.1/freeglut-3.2.1.tar.gz
10+
URL_MD5 cd5c670c1086358598a6d4a9d166949d
11+
CMAKE_GENERATOR ${CMAKE_GENERATOR} --config Release
12+
CMAKE_GENERATOR_TOOLSET ${CMAKE_GENERATOR_TOOLSET}
13+
CMAKE_GENERATOR_PLATFORM ${CMAKE_GENERATOR_PLATFORM}
14+
CMAKE_ARGS -DCMAKE_BUILD_TYPE=Release
15+
-DFREEGLUT_BUILD_SHARED_LIBS=OFF
16+
-DFREEGLUT_BUILD_STATIC_LIBS=ON
17+
-DFREEGLUT_BUILD_DEMOS=OFF
18+
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/freeglut
19+
# BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/freeglut-build
20+
# BUILD_IN_SOURCE ON
21+
# UPDATE_COMMAND ""
22+
INSTALL_COMMAND ""
23+
# CONFIGURE_COMMAND ""
24+
# BUILD_COMMAND ""
25+
)
26+
ExternalProject_Get_Property(FREEGLUT-PRJ SOURCE_DIR)
27+
ExternalProject_Get_Property(FREEGLUT-PRJ BINARY_DIR)
28+
set(FREEGLUT_BIN_DIR ${BINARY_DIR})
29+
set(FREEGLUT_SRC_DIR ${SOURCE_DIR})
30+
# add_library(libfreeglut STATIC IMPORTED)
31+
# set_target_properties(libfreeglut PROPERTIES IMPORTED_LOCATION ${FREEGLUT_BIN_DIR})
32+
33+
# set(FREEGLUT_BUILD_DEMOS OFF CACHE BOOL "")
34+
# set(FREEGLUT_BUILD_SHARED_LIBS OFF CACHE BOOL "")
35+
# set(FREEGLUT_BUILD_STATIC_LIBS ON CACHE BOOL "")
36+
# add_subdirectory(${FREEGLUT_SRC_DIR} ${FREEGLUT_BIN_DIR} EXCLUDE_FROM_ALL)
37+
# add_subdirectory(${BINARY_DIR})
38+
# find_package(FreeGLUT)
39+
endif(NOT GLUT_FOUND)
40+
else(OpenGL_FOUND)
41+
message(WARNING "OPENGL not found. Will not build graphical outputs.")
42+
endif(OpenGL_FOUND)
43+
44+
# If necessary, use the RELATIVE flag, otherwise each source file may be listed
45+
# with full pathname. RELATIVE may makes it easier to extract an executable name
46+
# automatically.
47+
file( GLOB APP_SOURCES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.c )
48+
# file( GLOB APP_SOURCES ${CMAKE_SOURCE_DIR}/*.c )
49+
# AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR} APP_SOURCES)
50+
foreach( testsourcefile ${APP_SOURCES} )
51+
# I used a simple string replace, to cut off .cpp.
52+
string( REPLACE ".c" "" testname ${testsourcefile} )
53+
add_executable( ${testname} ${testsourcefile} )
54+
55+
# set_target_properties(${testname} PROPERTIES LINKER_LANGUAGE C)
56+
57+
if(OpenMP_C_FOUND)
58+
target_link_libraries(${testname} PRIVATE OpenMP::OpenMP_C)
59+
endif()
60+
61+
if(MATH_LIBRARY)
62+
target_link_libraries(${testname} PRIVATE ${MATH_LIBRARY})
63+
endif()
64+
65+
if(OpenGL_FOUND)
66+
if(NOT GLUT_FOUND)
67+
add_dependencies(${testname} FREEGLUT-PRJ)
68+
target_compile_definitions(${testname} PRIVATE FREEGLUT_STATIC)
69+
target_include_directories(${testname} PRIVATE ${FREEGLUT_SRC_DIR}/include)
70+
target_link_directories(${testname} PRIVATE ${FREEGLUT_BIN_DIR}/lib)
71+
target_link_libraries(${testname} PRIVATE OpenGL::GL)
72+
target_link_libraries(${testname} INTERFACE FREEGLUT-PRJ)
73+
# target_include_directories(${testname} PRIVATE ${FREEGLUT_INCLUDE_DIRS})
74+
# target_link_libraries(${testname} INTERFACE freeglut_static)
75+
else()
76+
target_include_directories(${testname} PRIVATE ${GLUT_INCLUDE_DIRS})
77+
target_link_libraries(${testname} PRIVATE OpenGL::GL ${GLUT_LIBRARIES})
78+
endif()
79+
target_compile_definitions(${testname} PRIVATE USE_GLUT)
80+
endif(OpenGL_FOUND)
81+
82+
if(APPLE)
83+
target_compile_options(${testname} PRIVATE -Wno-deprecated)
84+
endif(APPLE)
85+
86+
install(TARGETS ${testname} DESTINATION "bin/graphics")
87+
88+
endforeach( testsourcefile ${APP_SOURCES} )

0 commit comments

Comments
 (0)