Skip to content

Commit

Permalink
add result
Browse files Browse the repository at this point in the history
  • Loading branch information
archibate committed Dec 14, 2021
1 parent f621092 commit 7469b94
Show file tree
Hide file tree
Showing 9 changed files with 1,814 additions and 13 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
build
GNUmakefile
10 changes: 7 additions & 3 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
cmake_minimum_required(VERSION 3.12)
project(hellocmake LANGUAGES CXX)

add_subdirectory(stbiw)
if (NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release)
endif()

add_executable(main main.cpp)
target_link_libraries(main PUBLIC stbiw)
#add_subdirectory(stbiw)

add_executable(main main.cpp rainbow.cpp mandel.cpp)
#target_link_libraries(main PUBLIC stbiw)
38 changes: 29 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,43 @@

第01讲的回家作业

# 要求
通过 pull request 提交作业。会批分数,但是:

在 main.cpp 中为了导出一个美好的图像,使用了 `stb_image_write.h` 这个头文件。
没有结业证书,回家作业仅仅作为评估学习效果和巩固知识的手段,不必为分数感到紧张 :)
量力而行,只要能在本课中,学到昨天的自己不懂的知识,就是胜利,没必要和别人攀比。

在 CMakeLists.txt 中也引用了 stbiw 这个库,然而这个库还没有被定义。
你的任务就是定义 stbiw 这个库,他的内容应该包含 stbi_write_png 的实现。
- 课件:https://github.com/parallel101/course
- 录播:https://space.bilibili.com/263032155

最好以子模块 + 库的形式,实在搞不定的话同一个目录下 include 也可以。但是分数会低
作业提交时间不限 :) 即使完结了还想交的话我也会看的~ 不过最好在下一讲开播前完成

# 参考
## 作业要求

stb_image_write.h 下载地址: https://github.com/nothings/stb/blob/master/stb_image_write.h
在 main.cpp 中为了导出两个"美好的图像",使用了 `stb_image_write.h` 这个头文件。
他在 CMakeLists.txt 中也引用了 stbiw 这个库,然而这个库还没有被定义。

你需要一个 .cpp 文件定义了 STB_IMAGE_WRITE_IMPLEMENTATION 这个宏,才能决定让 stbi 系列函数在这里实现。
你的任务就是 **定义 stbiw 这个库**,他的内容应该包含 `stbi_write_png()` 的实现,
以及允许通过尖括号导入头文件 `<stb_image_write.h>`

运用上课所学知识,尽量不修改 main.cpp 的内容,只修改 stbiw 子目录下的内容,
完成任务。最好以子模块 + 库的形式,实在不行的话直接改 main.cpp 也可以。

运行成功后,应该会在主程序同目录发现两个"美好的图像":mandel.png 和 rainbow.png

## 参考信息

stb_image_write.h 原仓库地址: https://github.com/nothings/stb

你需要在一个且仅一个 .cpp 文件定义了 `STB_IMAGE_WRITE_IMPLEMENTATION` 这个宏,
才能决定让 stbi 系列函数在这里实现。

如果你能不仅完成了作业,解释清楚为什么 stbi 必须要这样设计,可能会给你满分!

## 采分点提示

像这样:
```cmake
target_compile_definitions(stbiw PUBLIC -DSTB_IMAGE_WRITE_IMPLEMENTATION)
```
是不行的,因为如果两个 .cpp 文件都 include 了 stb_image_write.h,那么同一个函数会被定义两遍!
是不行的,因为 mandel.cpp 和 rainbow.cpp 两个文件都 include 了 stb_image_write.h,
这样同一个函数会被定义两遍!
9 changes: 8 additions & 1 deletion main.cpp
Original file line number Diff line number Diff line change
@@ -1 +1,8 @@
#include "stb_image_write.h"
#include "rainbow.h"
#include "mandel.h"

int main() {
test_rainbow();
test_mandel();
return 0;
}
24 changes: 24 additions & 0 deletions mandel.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#include "mandel.h"
#include <stb_image_write.h>
#include <vector>
#include <complex>

void test_mandel() {
std::vector<char> buf(512 * 512);
for (int j = 0; j < 512; j++) {
for (int i = 0; i < 512; i++) {
float x = i / 512.f * 3.0f - 2.0f;
float y = j / 512.f * 3.0f - 1.5f;
std::complex<float> c(x, y);
std::complex<float> z(0, 0);
for (int steps = 0; steps < 256 / 4; steps++) {
z = z * z + c;
if (std::norm(z) >= 4.f) {
buf[j * 512 + i] = 255 - steps * 4;
break;
}
}
}
}
stbi_write_png("mandel.png", 512, 512, 1, buf.data(), 0);
}
3 changes: 3 additions & 0 deletions mandel.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#pragma once

void test_mandel();
15 changes: 15 additions & 0 deletions rainbow.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
#include "rainbow.h"
#include <stb_image_write.h>
#include <vector>

void test_rainbow() {
std::vector<char> buf(512 * 512 * 3);
for (int j = 0; j < 512; j++) {
for (int i = 0; i < 512; i++) {
buf[(j * 512 + i) * 3 + 0] = i / 2;
buf[(j * 512 + i) * 3 + 1] = j / 2;
buf[(j * 512 + i) * 3 + 2] = 0;
}
}
stbi_write_png("rainbow.png", 512, 512, 3, buf.data(), 0);
}
3 changes: 3 additions & 0 deletions rainbow.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#pragma once

void test_rainbow();
Loading

0 comments on commit 7469b94

Please sign in to comment.