自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

重来的博客

致力于分享简单易懂的知识

  • 博客(29)
  • 收藏
  • 关注

原创 存储技术常用术语简析

经常遇到一些不明觉厉的关于存储技术的英文缩写?希望这篇文章能帮到你。

2023-08-12 20:08:52 471

原创 图形学中那些你需要知道的变换概念

在前面的OpenGL ES 教程中,随着教程的进展,我们介绍并使用过很多变换矩阵,但没有系统总结过计算机图形学涉及到的种种变换,因此这篇文章再次回顾“变换”这个主题,从简单到复杂,一步步把各种变换的来龙去脉梳理清楚。

2022-12-18 10:14:52 1041 1

原创 罗德里格旋转公式 (Rodrigues’ Rotation Formula)

关于三维空间中的旋转,我们以前提到过基于欧拉角的旋转表达矩阵,它们分别描述了围绕 x 轴、y 轴、z 轴旋转后坐标应当如何变化。事实上,我们可以更进一步,推导出一个通用的、围绕过原点的任意轴旋转的公式。

2022-12-17 22:49:31 1218 1

原创 傅里叶级数与傅里叶变换

本文主要从数学推导的角度梳理了从傅里叶级数到傅里叶变换的过程。傅里叶级数源自这样的一个假设的命题:任何周期函数都能够表述为若干正弦函数或者余弦函数的线性组合,原周期函数的周期T是这些正弦函数或者余弦函数的周期的若干倍......

2022-12-11 23:01:10 672

原创 Compose LazyGrid 相关介绍

如果你需要惰性(Lazy)的网格布局,除了考虑使用 LazyLayout 实现一个之外,还可以试试开箱即用的 LazyVerticalGrid 和 LazyHorizontalGrid 。本文以 LazyVerticalGrid 为例,介绍了在 Compose 1.2 版本中使用 LazyVerticalGrid 的一些小技巧。...

2022-08-07 21:13:45 2156

原创 OpenGL ES 2.0 for Android教程(九):添加触摸反馈

通过触摸支持实现良好的用户交互是许多游戏和应用程序的基石;它可以给用户一种与真实事物交互的感觉,即使他们只是在看屏幕上的像素。一些手机游戏之所以变得非常流行,仅仅是因为它们提出了一种新的触摸模式。空中曲棍球中有了更好看的木槌,但如果我们真的能使用它们,那不是很好吗?在本章中,我们将通过添加触摸支持,使我们的程序更具互动性。我们将学习如何添加三维相交测试和碰撞检测,这样我们就可以抓住木槌并在屏幕上拖动它。以下是本章的计划:

2022-04-11 15:47:00 9859

原创 OpenGL ES 2.0 for Android教程(八):构建简单物体

我们的空中曲棍球项目已经取得了长足的进步:现在我们的桌子放在一个很棒的角度,而且现在我们使用了纹理,看起来更好看了。然而,我们的木槌实际上看起来并不像一个真正的木槌,因为我们现在把每个木槌都画成一个点。你能想象用一个小点作为木槌打空气曲棍球吗?许多应用程序都使用简单图形的组合来创建更复杂的物体,我们将在这里学习如何创建更好的木槌。我们还缺少在场景中平移、旋转和移动的简单方法。许多3D应用程序通过使用视图矩阵来实现这一点;对该矩阵所做的更改会影响整个场景,就好像我们在从移动的摄影机中观察事物一样。我们将添

2022-03-31 09:35:36 2881 1

原创 OpenGL ES 2.0 for Android教程(七):使用纹理添加细节

我们已经设法用简单的形状和颜色完成了很多工作。不过,我们缺少了一些东西:如果我们希望在图形上绘画,并添加精致的细节呢?像艺术家一样,我们可以从基本图形和颜色开始,通过使用纹理在表面上添加额外的细节。简单来说,纹理就是可以加载到OpenGL上的图像或图片。我们可以通过纹理(Texture)添加大量细节。想想你最近可能玩过的一款精美的3D游戏,这些游戏的本质也只是使用点、线和三角形,就像其他3D程序一样。然而,通过纹理添加的细节和艺术家的加工,这些三角形可以用纹理构建美丽的3D场景。一旦我们开始使用纹理

2022-03-28 10:15:00 9035

原创 OpenGL ES 2.0 for Android教程(六):进入第三维

虽然OpenGL非常擅长在2D中渲染东西,但当我们添加第三个维度的坐标时,屏幕中的内容就更灿烂了。在这一章中,我们将学习如何进行3D渲染,这样我们就可以获得在桌子对面俯视对手的视觉感受。几个世纪以来,艺术家使用过诸多技巧愚弄人们的眼睛,让他们把平面的二维绘画视为一个完整的三维场景。他们使用的一个技巧叫做线性投影(linear projection)—— 通过将平行线连接在一个假想的消失点上来创造透视的错觉。当我们站在一对笔直的铁轨上时,我们可以看到这种效果的典型例子......

2022-03-26 10:00:00 8873 2

原创 OpenGL ES 2.0 for Android教程(五):调整屏幕的宽高比

你可能还没有注意到,我们目前的空气曲棍球桌存在竖屏切换到横屏时的比例问题。我们的桌子在横屏时被压扁了!我们该如何根据屏幕的宽高比例来修正我们显示的结果,使它在不同的屏幕大小和方向上看起来都是正确的呢?这篇文章将给出答案。

2022-03-24 13:33:08 8947

原创 OpenGL ES 2.0 for Android教程(四):添加颜色和阴影

OpenGL ES 2 第四章:添加颜色和阴影在现实世界中,对象具有不同的颜色和阴影。如果我们看看家里的墙,可以看到它被涂成了单一颜色。同时,墙的某些部分看起来会更暗或更亮,这取决于朝向周围光线的角度。我们的大脑利用这些细微的阴影差异作为主要的视觉线索之一,帮助理解我们所看到的东西;艺术家们从一开始就一直在利用这些线索来欺骗我们的大脑。在本章中,我们将向艺术家学习,并使用不同的颜色和阴影使我们的桌子看起来不那么平坦,更逼真。

2022-03-22 10:33:15 9366 2

原创 OpenGL ES 2.0 for Android教程(三):编译着色器并绘制到屏幕

OpenGL ES 2 第三章:编译着色器并绘制到屏幕本章将继续我们在上一章中开始的工作。作为本章的游戏计划,我们将首先加载并编译我们定义的着色器,然后将它们链接到一个OpenGL程序中,最后我们就可以使用这个着色器程序将我们的曲棍球桌绘制到屏幕上。加载着色器现在我们已经为着色器编写了代码,下一步是将它们加载到内存中。要做到这一点,我们首先需要编写一个方法,从资源文件夹中读取代码。从raw资源中加载字符串创建util包,并创建Utils.kt,输入以下代码:fun Context.readStr

2022-03-20 11:44:42 5446 2

原创 OpenGL ES 2.0 for Android教程(二):定义顶点和着色器

OpenGL ES 2 第二章:定义顶点和着色器本章介绍我们的第一个项目:一个简单的空中曲棍球游戏。在我们进行这个项目的过程中,我们将了解OpenGL的一些主要构建块。我们将从学习如何使用一组称为顶点(vertices)的独立点来构建对象开始,然后我们学习如何使用着色器来绘制这些对象,所谓的着色器,是告诉OpenGL如何绘制对象的小程序。这两个概念非常重要,因为几乎每个对象都是通过将顶点连接成点、线和三角形来构建的,这些基本体都通过使用着色器绘制。我们将首先了解顶点,这样我们就可以建立我们的空气曲棍球桌

2022-03-19 10:51:47 6775

原创 OpenGL ES 2.0 for Android教程(一)

本文是一系列OpenGL ES 2.0 for Android教程,基于Kotlin与一点点Compose来创建代码示例。通过本系列教程你可以从零开始一步步学习OpenGL ES。

2022-03-18 13:14:41 6014 2

原创 C语言中的结构体内存对齐现象

C语言中的结构体的占用的内存大小不一定等于所有成员的字节大小之和,因为编译器处理结构体的时候额外添加了一个叫内存对齐的优化,这是怎么一回事呢?

2022-03-13 23:40:46 769

原创 如何为Compose Image提供网络图片加载支持

本文是源码分析类文章如何为Compose Image提供网络图片加载支持?目前(Compose 1.0.5)最好的选择是使用图片框架Coil,Coil对Jetpack Compose相关的支持文档在这。Compose内的Image组件类似于ImageView,仅支持从本地加载图片资源,要想从网络中获取图片并加载,我们首先就得要使用能够处理网络请求的框架,将远程图片资源载入到本地才行。目前主流的图片加载框架Picasso、Glide、Coil等,它们更多面对的仍是传统的View系统下,将图片加载到Im.

2022-02-12 10:46:58 4483

原创 RSA算法加解密过程全解析

不同于传统的对称加密算法体系,非对称公私钥密码系统中的加密密钥和解密密钥是相互分开的,加密密钥用于公开给别人加密,而只有持有解密密钥的人才能对信息进行解密。1976年诞生过不少非对称密码算法,但是RSA是其中最容易让人理解的。下文将尝试对RSA实现的具体流程进行解析。寻找合适的加密、解密函数我并不知道RSA最初的诞生经过了怎样的启发与灵光一闪,但仍有办法切入RSA的设计思路,现在,我们从它的实际效果:公钥加密,私钥解密来入手,尝试一步步分析它,了解它。我们首先面临的问题是,如果想要达到加解密的钥匙分开

2021-11-09 14:45:53 24088

原创 一文读懂DH密钥交换算法

DH 算法是 Diffie和Hellman于1976年提出了一种的密钥交换协议。这种加密算法主要用于密钥的交换,可以在非安全信道下为双方创建通信密钥,通讯双方可以使用这个密钥进行消息的加密、解密,并且能够保证通讯的安全。换而言之,算法希望实现这样的一个效果:通信方A和B首先各自生成密钥DaD_aDa​和DbD_bDb​,然后通过某种计算获得各自的公钥PaP_aPa​和PbP_bPb​,接下来,A和B互相交换公钥PaP_aPa​和PbP_bPb​。现在,A持有自己的密钥DaD_aDa​和B的公钥PbP_b

2021-09-18 21:59:25 5532

原创 Linux:输入与输出

文章目录标准输出标准输入管道tee命令关于-符号将命令的输出送至屏幕和文件环境变量cut命令pasteexpand、unexpandjoinsplitsorttr命令uniqwc命令tee命令的补充说明make介绍tarball介绍进程替换标准输出首先来了解一下echo命令:$ echo "Hello World"$ echo Hello World屏幕上会打印字符串Hello World。需要输出的字符串是否带有双引号无关紧要,双引号会被忽略。如果需要输出双引号,可以使用转义字符$ ech

2021-07-29 19:16:24 1460

原创 分治算法——归并排序与最大连续子数组问题

本文是《算法导论》第二章、第三章、第四章一部分内容的简要概括归并排序先从一个简单的例子开始。假如面前有两堆已经排好序的扑克牌,牌面朝上,最小的牌在顶上,我们希望把两堆牌按照顺序合成一堆,牌面朝下。基本的操作就像是这样:从两堆牌的顶上挑一张最小的牌,翻转过来放在输出堆,不断重复这个步骤直到两堆牌中有一堆牌空了,到这个时候,把另一堆牌翻转、挪动到输出堆,有序的两堆牌的合并就完成了。依此类推,如何对一个数组进行排序呢?回答是:获得这个数组的两个有序子数组,然后合并。嗯?那怎么得到有序的子数组呢?回.

2021-07-18 10:55:56 421

原创 javafx: 如何自定义ListView的子项视图

ListView上显示的单元格称为ListCell,自定义ListView子项布局关键在于setCellFactory方法。 /** * 设置要在ListView中使用的新单元格工厂。 * 这迫使所有旧的{@link ListCell}被扔掉,而新的ListCell是用新的单元工厂创建的。 */ public final void setCellFactory(Callback<ListView<T>, ListCell<T>&gt

2021-03-02 00:06:30 1639 1

原创 优雅计算算式:后缀表达式

表达式二叉树(Binary expression tree)是用来表示表达式的一种特殊的二叉树。两种常见表达式是代数表达式(如:3+2)和布尔表达式(如true ^ false)都可以用它表示,这些表达式包含了一元运算符和二元运算符,从而节点的孩子可以是零个、一个或两个。表达式树的叶子节点储存操作数(操作数可以是常量或变量),而内部节点则储存运算符。这种受限制的结构简化了表达式树的处理。

2020-11-24 12:44:57 6368 1

原创 滚动时RecyclerView对ViewHolder的缓存与复用

滚动时RecyclerView对ViewHolder的缓存与复用滚动时ViewHolder的复用首先需要对RecyclerView如何滚动显示其子项有一定的了解,这与ViewGroup的显示流程有关,ViewGroup需要依次走过onMeasure()方法、onLayout()方法、onDraw()方法,依次测量,布局,绘制。RecyclerView监听到滑动的操作后,重新调用onLayout()来排列和布局子 View ,这样就有了滚动的能力。如果稍微跟踪一下onLayout的调用链,会是这样的R

2020-07-22 19:09:07 1459

原创 java泛型:类型擦除

虽然编写代码时可以使用泛型,但是泛型实际上是一种语法糖,虚拟机并不认识泛型,编译器在编译时会进行类型擦除。无限定的类型变量,替换为Object类型使用了限定符的类型变量,替换为对应的限定类型。<T extends Comparable>替换为Comparable<T extends Serializable & Comparable>,多类型限定,类型擦除时,替换为第一个类型Serializable。编译器将在有必要的时候向Comparable插入强制类型转换

2020-06-04 21:31:08 184

原创 Handler推荐的构造方式

打开Handler的API文档后,我们会看到它的四个构造方法,以及其中两个的带有的长长的不推荐及其原因注释// 不推荐的构造方法public Handler();public Handler(Handler.Callback callback);// 推荐构造方法public Handler(Looper looper);public Handler(Looper looper, Handler.Callback callback);推荐的构造方法中都需要明确传入Looper对象。这是因为隐

2020-06-04 21:24:25 401

原创 Android: FragmentTransaction的add和replace的区别

什么是FragmentTransaction如果你尝试过动态添加碎片,一定使用过类似于以下的代码public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 加载主界面的碎片 FragmentT

2020-06-04 21:22:17 1726

原创 javafx:文本控件如何控制用户输入文本的格式

学习如何往javafx控件的文本框添加文本格式控制。usernameField.setTextFormatter(new TextFormatter<String>(change -> { change.getControlNewText(); return change; }));

2020-04-14 21:00:37 2443

原创 lambda表达式与匿名类

匿名类主要应用于实现一个需要传入的接口实现类。最经典的例子便是比较器Comparator接口。为了给排序定义一个基准而使用的接口。String[] players = {"Rafael Nadal", "Novak Djokovic", "Stanislas Wawrinka", "David Ferrer", "Roger Federer", "Andy Murray...

2020-04-12 20:06:24 450

转载 ServletContext的getResourcePaths()方法

ServletContext的getResourcePaths()方法以下是原文档和机翻。Set getResourcePaths(String path)Returns a directory-like listing of all the paths to resources within the web application whose longest sub-path...

2020-02-07 12:12:04 1264

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除