From 4cc8f26bc8a53df15240b74f0dd62f7ff11e28c2 Mon Sep 17 00:00:00 2001 From: lmj01 Date: Fri, 19 Jul 2024 10:16:21 +0800 Subject: [PATCH] update --- cg/api.opengl.md | 1 + cg/canvas.md | 1 + cg/graphics.md | 3 ++ cg/threejs/grid.md | 101 +++++++++++++++++++++++++++++++++++++++++++- cg/tools/webgl.md | 10 +++++ cpl/Java.md | 8 ---- cpl/cplusplus.md | 14 ++++++ dev-note/eclipse.md | 30 ------------- dev-note/index.md | 2 +- dev-note/maven.md | 12 +++++- dev-note/pkg.md | 8 +++- exercises/2024.md | 27 +++++++++++- exercises/math.md | 58 ++++++++++++++++--------- web/index.md | 7 --- 14 files changed, 211 insertions(+), 71 deletions(-) create mode 100644 cg/tools/webgl.md delete mode 100644 dev-note/eclipse.md diff --git a/cg/api.opengl.md b/cg/api.opengl.md index 8541ffc..1ccb7ed 100644 --- a/cg/api.opengl.md +++ b/cg/api.opengl.md @@ -4,6 +4,7 @@ - [opengl 4.x](https://registry.khronos.org/OpenGL-Refpages/gl4/) - [opengl4.5新增了DSA(direct_state_access),更改VAO,VBO,EBO的新用法](https://www.khronos.org/opengl/wiki/Direct_State_Access) - [OpenGL Error](https://www.khronos.org/opengl/wiki/OpenGL_Error#Meaning_of_errors) +- [WebGL](/cg/tools/webgl.md) Context上下文是OpenGL的核心,因为OpenGL就是一个状态机,上下文中就保存了各种状态值,是所有执行指令的基础, 这个概念比较接近底层。统一的API是由显卡驱动提供的,负责沟通驱动与系统接口的是一些跨平台的库,如glew,glad,glad是更现代的库。 diff --git a/cg/canvas.md b/cg/canvas.md index 5e88015..9a5cc70 100644 --- a/cg/canvas.md +++ b/cg/canvas.md @@ -3,6 +3,7 @@ > 既然是图形库,那一定使用了很多图形学的技术 - [WebGL Report](https://webglreport.com/) +- [webgl](/cg/tools/webgl.md) ## 尺寸 diff --git a/cg/graphics.md b/cg/graphics.md index e410725..5fa21bf 100644 --- a/cg/graphics.md +++ b/cg/graphics.md @@ -1,5 +1,8 @@ # Graphics +- [Khronos社区](https://community.khronos.org/) +- [threejs社区](https://discourse.threejs.org/) + 早期3D的API由驱动层提供,所有细节都是驱动贴近硬件实现的,在经过shader发展中,现代硬件越来越复杂了 新时代的抽象图形接口vulkan来了,需要更具象化的过程,就是需要自己负责更多的事情 - 任务调度 diff --git a/cg/threejs/grid.md b/cg/threejs/grid.md index c100b6f..9e65705 100644 --- a/cg/threejs/grid.md +++ b/cg/threejs/grid.md @@ -1,8 +1,14 @@ # 网格 +- [How to make an infinite grid.](https://asliceofrendering.com/scene%20helper/2020/01/05/InfiniteGrid/) +- [Grids](https://godotshaders.com/snippet/grids/) +- [Shadertoy: Grid Shader](https://worldofzero.com/posts/shadertoy-grid-shader/) +- [Anti-Aliased Grid Shader](https://madebyevan.com/shaders/grid/) + +## 透视下 + - [无穷网格,很容易更改为ES6版本](https://github.com/Fyrestar/THREE.InfiniteGridHelper) - [讨论内容](https://discourse.threejs.org/t/three-infinitegridhelper-anti-aliased/8377) -- [Anti-Aliased Grid Shader](https://madebyevan.com/shaders/grid/) ```ts // 这个是保持与camera的朝向关联起来,这样不会因为control的改变而改变 @@ -27,4 +33,95 @@ float getGrid(float size) { float line = min(grid.x, grid.y); return 1.0 - min(line, 1.0); } -``` \ No newline at end of file +``` + +## 正交下 + +- [ Simple-Grid](https://www.shadertoy.com/view/wdK3Dy) +- [ Tearing Test](https://www.shadertoy.com/view/XtcSzf) + +目前通过添加额外的canvas来绘制一层。 +满足两种需求 +- 不能渲染,不能平移 +- 平移的只能是模型,这样方便对应网格进行测量 + +```js +const geometry = new PlaneGeometry( 1, 1); +const material = new ShaderMaterial( { + uniforms: { + lineStep: { value: 0 }, + lineWidth: { value: 0 }, + sceneCenterX: { value: 0 }, + sceneCenterY: { value: 0 }, + }, + depthTest: false, + depthFunc: AlwaysDepth, + transparent: true, + vertexShader: ` + void main() { + gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0); + } + `, + fragmentShader: ` + uniform float lineStep; + uniform float lineWidth; + uniform float sceneCenterX; + uniform float sceneCenterY; + void main() { + float x = sceneCenterX - gl_FragCoord.x; + float y = sceneCenterY - gl_FragCoord.y; + + float regularX = abs(mod(x, lineStep)); + float regularY = abs(mod(y, lineStep)); + + float masterX = abs(mod(x, lineStep * 10.0)); + float masterY = abs(mod(y, lineStep * 10.0)); + + if (masterX < lineWidth || masterY < lineWidth) { + gl_FragColor = vec4(0.0, 0.0, 0.0, 0.3); + } else if (regularX < lineWidth || regularY < lineWidth) { + gl_FragColor = vec4(0.0, 0.0, 0.0, 0.1); + } else { + gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0); + } + } + `, + extensions: { + // derivatives: true + } +}); +geometry.rotateX(Math.PI); +``` +```js +function updateSize(camera: OrthographicCamera) { + const { stepSize } = this; + // const vpWidth = camera.right - camera.left; + // const vpHeight = camera.top - camera.bottom; + const { left : vpWidth, bottom : vpHeight} = camera; + // 通过透视投影矩阵拿到当前缩放下的宽高, 参考OrthographicCamera的矩阵构建函数updateProjectionMatrix + const {left: vpLeft, right: vpRight } = function(e){ + const t = e.elements[0] + , n = e.elements[12]; + return { + left: -(n + 1) / t, + right: (1 - n) / t + } + }(camera.projectionMatrix); + const size1 = vpWidth / (vpRight - vpLeft) / 1e3; // 一米单位转换毫米的单位,计算每个世界坐标单位(pixel/m)像素/米 + const tmp1 = Math.abs(stepSize / size1); + const scale = 10 ** Math.ceil(Math.log(tmp1) / Math.log(10)); // 0.1 1 10 100...10倍递增 + const size1Physical = size1 * scale; // 得到每个像素的physical长度 + const lineWidth = Math.ceil(window.devicePixelRatio); + this.scale.set(vpWidth * 2, vpHeight * 2, 1); + this.position.set(vpWidth/2, vpHeight/2, 0); + const material = ((this).material); + material.uniforms.lineStep.value = size1Physical; + material.uniforms.lineWidth.value = lineWidth; + material.uniforms.sceneCenterX.value = Math.floor(.5 * vpWidth); + material.uniforms.sceneCenterY.value = Math.floor(.5 * vpHeight); + this.unit = scale; + console.log('grid -- ', this.unit, vpWidth, vpHeight, vpLeft, vpRight) +} +``` +目前可以还原,但是还需要处理一下的是多个pass的混合才能达到使用效果。 +这里的思想还是需要自己去体会相关逻辑。困惑心里的很多问题慢慢地解决了。 \ No newline at end of file diff --git a/cg/tools/webgl.md b/cg/tools/webgl.md new file mode 100644 index 0000000..fe5918f --- /dev/null +++ b/cg/tools/webgl.md @@ -0,0 +1,10 @@ +# WebGL + +- [threejs](https://threejs.org/) + - [笔记](/cg/threejs/index.md) +- [BabylonJS](https://www.babylonjs.com/) + - [笔记](/cg/babylonjs/index.md) + +## [WebGL API](https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API) + +[Rendering algorithms implemented in raw WebGL 2](https://github.com/tsherif/webgl2examples) \ No newline at end of file diff --git a/cpl/Java.md b/cpl/Java.md index 6312ad8..65a11fa 100644 --- a/cpl/Java.md +++ b/cpl/Java.md @@ -261,11 +261,3 @@ spring.data.neo4j.uri=http://localhost:7474 前端静态资源,通过元素a跳转到指定的href即可,后台的请求就可以全部使用RestController啦! 不直接返回页面,后面的页面也不处理! - - - -## 库 - -### [itext](https://api.itextpdf.com/iText/java/latest/) - -- A4 width:595.0, height:842.0 \ No newline at end of file diff --git a/cpl/cplusplus.md b/cpl/cplusplus.md index 00280dc..8d7ca35 100644 --- a/cpl/cplusplus.md +++ b/cpl/cplusplus.md @@ -98,6 +98,20 @@ operator<< (std::cout, 1) // 当初函数调用,传入参数 ``` [CPO](https://www.zhihu.com/question/518132411) +### [Copy elision](https://en.cppreference.com/w/cpp/language/copy_elision) + +- copy elision拷贝消除,一种拷贝优化, +- RVO(Return Value Optimization)返回值优化 +- NRVO(Named Return Value Optimization)命名返回值优化 + +### auto +```cpp +std::shared_ptr spA = std::make_shared(5); +auto& p = spA; // 引用 +auto p = spA; // 赋值 +``` + + ## TMP(template metaprogramming) 可参考的内容 diff --git a/dev-note/eclipse.md b/dev-note/eclipse.md deleted file mode 100644 index 88bd68f..0000000 --- a/dev-note/eclipse.md +++ /dev/null @@ -1,30 +0,0 @@ -# Eclipse - -使用在线安装包安装,不需要配置任何东西 - -## 创建工程 -通过在[线模板](https://start.spring.io/)创建 - -## 配置 - -开启自动补全功能 -window -> preferences -> Java -> Editor -> Content Assistent -> Auto Activation -设置auto activation trigger for java内容为 -abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ. -这样输入的任何一个有效的变量名时,都能协助查找API或变量名 - -## 快捷键 - -单词补全: -Alt + / - -打开资源: -Ctrl + Shift + R - -打开类型: -Ctrl + Shift + T - -## 清除项目的缓存 - -project -> clean - diff --git a/dev-note/index.md b/dev-note/index.md index 75e5ad8..c9378d5 100644 --- a/dev-note/index.md +++ b/dev-note/index.md @@ -12,7 +12,7 @@ - [build System](/dev-note/buildSystem.md) - [debug](/dev-note/debug.md) - [powershell](/dev-note/powershell.md) -- [包管理C++](/dev-note/pkg.md) +- [包管理 -- vcPkg, vfox](/dev-note/pkg.md) - [maven](/dev-note/maven.md) - [硬件配置](/dev-note/hardware.md) diff --git a/dev-note/maven.md b/dev-note/maven.md index 334a9d3..c1b3c30 100644 --- a/dev-note/maven.md +++ b/dev-note/maven.md @@ -42,7 +42,12 @@ Spring Boot 通过 Spring Boot Maven Plugin 在 Apache Maven 中提供了对 Spr ``` -## itext7 +## [itext](https://api.itextpdf.com/iText/java/latest/) + +- [FAQ](https://kb.itextpdf.com/itext/faq) +- [stackoverflow](https://stackoverflow.com/questions/tagged/itext+itext7) + +- A4 width:595.0, height:842.0 itext7 的字体涉及到版权问题,基本就是与adobe有关 @@ -54,6 +59,11 @@ document.add(new Paragraph("hellos你好").setFont(f2)); document.add(new Paragraph("hellos你好").setFont(f3)); ``` +### [7.1.8](https://api.itextpdf.com/iText/java/7.1.8/) + +- [How to fill a rectangle with color?](https://kb.itextpdf.com/itext/how-to-fill-a-rectangle-with-color) + + ## 工具 - [mvn的仓库](https://mvnrepository.com/) - [ Spring Initializr在线生成工程模板](https://start.spring.io/) diff --git a/dev-note/pkg.md b/dev-note/pkg.md index 9436cf5..0a3c66d 100644 --- a/dev-note/pkg.md +++ b/dev-note/pkg.md @@ -36,4 +36,10 @@ set(VCPKG_PLATFORM_TOOLSET v140) - 绑定到shell中 - vfox availabel 查看插件 -- vfox search java 查看所有版本 \ No newline at end of file +- vfox search java 查看所有版本 +- vfox list java 列出当前安装的版本 +- vfox current java 显示当前版本 +- vfox use sdkName@version 使用当前版本 + - vfox use -g --global 全局 + - vfox use -p --project 当前目录下 + - vfox use -s --session 当前shell diff --git a/exercises/2024.md b/exercises/2024.md index 9398a34..bb2e67c 100644 --- a/exercises/2024.md +++ b/exercises/2024.md @@ -1,5 +1,30 @@ # 2024 +## daily + +### 2024-7-12 + +学竞赛的必要条件是: 一个是长时间集中注意力的能力,这也和兴趣是高度正相关的;一个是记忆力和理解能力,大家要从小培养。 + + +
+2024-5读大师作品 + +有几点理由可以说明为何最优秀的数学家被吸引去读经典著作,首先,他们似乎是天生的善于进行综合的人,数学的真谛在于理解看起来不同的概念间的逻辑联系。最成功的数学家都是涉足面最广、洞察相似之物和将概念联系起来的能力最强的数学家。历史在这样的研究活动中的作用是明显的。对某些相似性的认识往往要经历几代人,而且通过对普遍的历史事实的回顾,往往容易看出各种联系。**进步不是出自于新的概念,而是由于认识到可以把旧概念用于新的情况,这样的事实比我们所愿想象的要多得多。** + +

迈克尔·阿蒂亚:二十世纪的数学发展

+ +从线性到非线性的发展,从非欧几里得几何的不同阶段到Riemann的更一般的几何,都是非线性的。 + +几何与代数,Euclid几何是数学理论中最早的一个例子,直到Descartes引入现在称为笛卡尔坐标系之前,一直是纯几何,之后是代数形式的尝试。 +Newton和Leibniz在分析方面的工作就是Newton以一个几何四维来思考,Leibniz使用形式化代数来思考,到现在的符号就是以Leibniz的符号来表示的。 + +几何是关于空间的,当你一眼观望完一个房间时,你的大脑所看到的太多东西了,空间直觉spatial intuition或空间知觉spatial perception,这些都是以几何形式出现的。这些都是在一个时间点上看到的结果,几何本质是静止的。而代数本质上是涉及的是时间,一步推导一步推导的结果,都是在上一个时间点上,是在前一个步骤上的结果,特别是计算机出现后的,算法,就是代数的形式化过程中的产物,任何算法,任何计算过程,都是一个接着一个的,并不是那个静止下的结果。 + +几何本质是静止的,而代数,现代的算法,任何算法,任何计算过程都是有时间维度的。 + +
+ ## [数学手册(原书第10版)](https://book.douban.com/subject/35350415/) 有种观点,学习数学,起始是从自己开始的,并不是从书本上规划的路径学习起来的。能认识字后,找准自己的能理解的方向下去就可以了。我也不知道我是从那里看到这种观点的。 @@ -10,4 +35,4 @@ 借鉴成功的历史事件是很好的助力,但是原创性的东西必须是从第一性原理出发,自主思考才是最好也最佳的实践过程。如果还我重新来学习,我一定会遵守这个准则。 -第一性原理(First Principles)是一个哲学和科学概念,指的是基于最基本的、不可剥夺的事实或假设来推导复杂情况或理论的方法。第一性原理思维是一种强大的思考工具,它鼓励人们深入问题的本质,避免被传统思维或既定框架限制。通过这种方法,可以发现新的可能性和解决方案。然而,它也需要深入的专业知识和对基础概念的深刻理解。 \ No newline at end of file +第一性原理(First Principles)是一个哲学和科学概念,指的是基于最基本的、不可剥夺的事实或假设来推导复杂情况或理论的方法。第一性原理思维是一种强大的思考工具,它鼓励人们深入问题的本质,避免被传统思维或既定框架限制。通过这种方法,可以发现新的可能性和解决方案。然而,它也需要深入的专业知识和对基础概念的深刻理解。 diff --git a/exercises/math.md b/exercises/math.md index 725b338..41301ce 100644 --- a/exercises/math.md +++ b/exercises/math.md @@ -61,12 +61,50 @@ ## 初等数学 +### 方程式 + +现代方程式几乎已经渗透到科学原理的各个方面,凡是你能想到的领域,经济学,物理学,医学或是什么其他科学领域,都会有方程式的出现。 + +学习方程式的一些原则 + +- 推导方程式,使用基本原理引导推导整个过程,体会到方程式只是一堆符合,其意义是由认为赋予的。 +- 方程有单位时,请解释其物理意义 + + +### 代数 + +重视积累:代数就是积累各种代数结构(比如分式求和求下界用权方和,去根号的常用方法等等) + +### 组合 + +组合最重要的是思想 + +- [高中数学竞赛专题讲座(第二辑).组合构造](https://book.douban.com/subject/3165692/) +- [组合极值论证与构造(高中卷16)数学奥林匹克小丛书](https://book.douban.com/subject/1501703/) +- [图论及其应用](https://book.douban.com/subject/26313250/) + ### 几何 初等数学几何学关注的对象多为点、线、面的度量性质,还有它们之间的位置关系等。 +重视积累:几何就是积累性质(比如直角三角形的性质,五心的性质等等)与常见结构, + +- [浙大出版社的《几何分册》](https://book.douban.com/subject/11501633/) +- [数学奥林匹克命题人讲座(12)册](https://book.douban.com/series/16571) +- [几何变换与几何证题](https://book.douban.com/subject/4918955/) +- [平均值不等式与柯西不等式](https://book.douban.com/subject/1503804/) +- [不等式的证明方法](https://book.douban.com/subject/6977541/) +- [初等不等式的证明方法](https://book.douban.com/subject/6724831/) +- [HIT数学·统计学系列](https://book.douban.com/series/49805) ## 高等数学 +## 数论 + +数论是一个有些特殊的板块,它是唯一一个完整的学科,大学数学系都有一门课是初等数论,基本就是完完整整地讲了一遍高中竞赛的全部内容,不多不少。数论的学习最重要的是知识体系的建立。 + +- [初等数论-北大出版社](https://book.douban.com/subject/21267842/) +- [数论讲义(上册)](https://book.douban.com/subject/1653408/)[数论讲义(下册)](https://book.douban.com/subject/1237669/) + ### 几何 #### 拓扑 @@ -78,23 +116,3 @@ - [James Munkres. Topology]() - [John L. Kelley General Topology]() - [EH Spanier. Algebraic Topology]() - -## 观点 - -
-读大师作品 - -有几点理由可以说明为何最优秀的数学家被吸引去读经典著作,首先,他们似乎是天生的善于进行综合的人,数学的真谛在于理解看起来不同的概念间的逻辑联系。最成功的数学家都是涉足面最广、洞察相似之物和将概念联系起来的能力最强的数学家。历史在这样的研究活动中的作用是明显的。对某些相似性的认识往往要经历几代人,而且通过对普遍的历史事实的回顾,往往容易看出各种联系。**进步不是出自于新的概念,而是由于认识到可以把旧概念用于新的情况,这样的事实比我们所愿想象的要多得多。** - -### 迈克尔·阿蒂亚:二十世纪的数学发展 - -从线性到非线性的发展,从非欧几里得几何的不同阶段到Riemann的更一般的几何,都是非线性的。 - -几何与代数,Euclid几何是数学理论中最早的一个例子,直到Descartes引入现在称为笛卡尔坐标系之前,一直是纯几何,之后是代数形式的尝试。 -Newton和Leibniz在分析方面的工作就是Newton以一个几何四维来思考,Leibniz使用形式化代数来思考,到现在的符号就是以Leibniz的符号来表示的。 - -几何是关于空间的,当你一眼观望完一个房间时,你的大脑所看到的太多东西了,空间直觉spatial intuition或空间知觉spatial perception,这些都是以几何形式出现的。这些都是在一个时间点上看到的结果,几何本质是静止的。而代数本质上是涉及的是时间,一步推导一步推导的结果,都是在上一个时间点上,是在前一个步骤上的结果,特别是计算机出现后的,算法,就是代数的形式化过程中的产物,任何算法,任何计算过程,都是一个接着一个的,并不是那个静止下的结果。 - -几何本质是静止的,而代数,现代的算法,任何算法,任何计算过程都是有时间维度的。 - -
\ No newline at end of file diff --git a/web/index.md b/web/index.md index 68959ff..7bd4cbf 100644 --- a/web/index.md +++ b/web/index.md @@ -50,13 +50,6 @@ ``` -### [WebGL API](https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API) - -- [threejs](https://threejs.org/) - - [笔记](/cg/threejs/index.md) -- [BabylonJS](https://www.babylonjs.com/) - - [笔记](/cg/babylonjs/index.md) - ### [Clipboard API](https://developer.mozilla.org/en-US/docs/Web/API/Clipboard_API) 新版的剪切接口,是新标准 ```javascript