
算法
文章平均质量分 51
还是叫明
这个作者很懒,什么都没留下…
展开
-
判断点是否在贝塞尔曲线(Bézier curve)上的方法
但贝塞尔曲线(Bézier curve)并不是y关于x的方程,而是(x,y)关于一个参数t的方程。利用同样的方法,我们也可以使用y求出若干个t。然后比较用x求出的t和用y求出的t,如果都在[0,1]范围内,而且是接近的,那我们可以认为点P就在贝塞尔曲线上。假设贝塞尔曲线经过点P0(x0,y0)、P1(x1,y1)、P2(x2,y2)、P3(x3,y3),现在要判断点P(x,y)是否在曲线上。现在,如果我们需要判断一个点P(x,y)是否在贝塞尔曲线上,就要找到一个t,代入方程中,求出(x,y)跟P一致。...原创 2022-08-09 15:16:48 · 1832 阅读 · 0 评论 -
判断空间四点(多点)共面的计算方法
如果三点非共线,那么三点必然共面。如果现在有第四点,如何判断这个点跟前三点共面呢?如果有超过四个点,实际上也是从第四个点开始,一个个判断是否跟前三个点共面。可以使用向量和行列式的方法去计算。我们先来看行列式的几何意义。对于二阶行列式,它的行向量组成了一个平行四边形,而其值就是平行四边形的面积。类似的,对于三阶行列式,它的行向量组成了一个平行六面体,而其值就是这个平行六面体的体积。四个点刚好能形成三个向量,而如果四点不共面,那么这个平行六面体的体积就不会是0。反过来说,如果平行六面体的体积是0,也就是如果行列原创 2022-06-21 16:22:56 · 5948 阅读 · 0 评论 -
已知两点求直线一般方程,已知三点求平面一般方程
我们知道,直线的一般方程是,而平面的一般方程是。对于直线方程,有ABC三个未知数。但我们知道,已知两个点只能求出两个未知数。对于平面方程是同理的。事实上,一般方程里的参数是有冗余的。例如,和这两个方程事实上描述的是同一条直线。那我们可不可以直接把一个系数约掉呢,例如变成。很遗憾这行不通,因为A有可能是0。任何一个参数都有可能是0,无法约掉。这样的话,在求解的时候,我们就需要分类讨论。先判断某一个参数是否为0,如果是0,则可以去掉该参数。少了一个参数,点数和未知数的数量相同,就可以求解了。如果没有参数是0,那原创 2022-06-08 06:51:01 · 1726 阅读 · 1 评论 -
三维空间圆弧描述方法
在以下的描述方法中,我们用到:圆心:(x0,y0,z0),需3个数值。弧起点:(x1,y1,z1),需3个数值。弧终点:(x2,y2,z2),需3个数值。弧方向:(xd,yd,zd),长度不重要,只需表达出方向,所以需要2个数值。弧度:θ,需1个数值。描述方法:1、圆心+弧起点+弧终点+弧方向需要11个数值。可以描述所有圆弧。2、圆心+弧起点+弧方向+弧度需要9个数值。可以描述所有圆弧。3、弧起点+弧终点+弧方向需要8个数值。不能描述圆周。描述圆周时,弧起点和弧终点重合。4、弧起点+弧终点+弧上任一点需要9原创 2022-06-07 13:40:08 · 1530 阅读 · 0 评论 -
线段与线段交点的求解
本方法适用于二维和三维的情况。假设线段AB和线段CD交于点K,如下图所示:由于三角形AKM和三角形BKN相似,故有: (1)由于三角形ACD和BCD共底,故有: (2)根据两向量叉乘数值为其围成的平行四边形的面积,有: (3)综合(1)(2)(3)式,有 (4)假设原点为O,有 (5) (6)结合(4)(5)(6)式,有 (7)根据(7)式即可求出K的坐标。...原创 2022-06-07 11:12:28 · 307 阅读 · 0 评论 -
判断点是否在图形(矩形、椭圆、多边形)内的算法(二)
我们在上一篇文章中介绍了判断一个点是否在图形内的算法,那如果是大量的点呢?例如我们要在一个2000*2000的画布中,把所有在图形内的点填充为红色,在外面的填充为绿色。这样的话,我们就要对4百万个点进行区域判断,这个计算量是非常巨大的。对于上一篇中介绍的方法,我们有一些优化的空间,例如:(1)因为三角函数的计算是很耗时的,先把cos和sin值求出来。(2)矩形的判断是比较快速的,可以先求出椭圆和多边形的外接矩形,如果在外接矩形外,肯定就不会在图形内了。但是这样的优化之后,计算量仍然.原创 2021-12-16 11:35:13 · 1570 阅读 · 0 评论 -
判断点是否在图形(矩形、椭圆、多边形)内的算法(一)
我们在下面的介绍中,只讨论三种图形,分别是矩形(包括正方形)、椭圆(包括圆)和多边形。对于矩形和椭圆,比较常见的描述方法是(x,y,w,h),另外再加一个旋转角度a(绕中心旋转)。而对于多边形,一般的描述方法是一个二维点的数组。事实上矩形也是多边形(四边形),因为它的描述方法不一样,所以我们分开讨论。一、无旋转矩形这是最简单的一种情况,判断方法也简单。只要判断点的横坐标是否在[x,x+w]、纵坐标是否是[y,y+h]内即可。二、旋转矩形对于旋转矩形,比较常规的做法是:..原创 2021-12-13 10:26:57 · 10994 阅读 · 7 评论 -
云图和热力图的绘制算法
云图和热力图是很像的两种图,它们的区别在于,云图的数据源要求图的每一个区域都有数值,而热力图是在图上的某些离散点有数值。事实上,云图可以看作是高密度的热力图。云图在开始绘制云图之前,我们先来研究云图的数据源。假设我们现在要绘制以下数据的云图:这是一张5*4的表格,可能我们要绘制的云图是500*400这个大小。我们很容易会想到这样一种绘制方法:(1)表格的一个格子代表一个像素,数值代表一种颜色,如下图所示:(2)把这张5*4的图片放大100倍,得到500*400的云图。这种方.原创 2021-07-26 10:53:08 · 8156 阅读 · 4 评论 -
流程图连接线生成算法
在使用Visio等软件时,图形和图形之间可能需要使用连接线,如下图所示:一般连接线会有3种,分别是折线、直线和Bezier曲线。上图中的蓝线是Bezier曲线,绿线是直线,黑线是折线。直线过于简单,无需算法讨论,而Bezier曲线将在后续的文章中讨论。本文主要讨论折线的生成算法。二、折线形态根据图形的相对位置和箭头的方向,折线会有不同的形态。就分段数来说,会出现2、3、4、5段的情况,如下图所示(事实上还有1段的情况,由于简单,本文不讨论):对一个图形来说,其他图形相对于原创 2021-06-28 14:53:23 · 3856 阅读 · 1 评论 -
多边形扩展或收缩算法
如下图所示,黑色多边形是原多边形,绿色多边形是扩展多边形,红色多边形是收缩多边形。算法要实现的效果就是这样。首先,我们用一个点的数组表示多边形,形如Point[] points。接下来是数学公式的推导,我们用向量法解决这个问题。对于每一个点,它都有两个邻点,如下图所示,点P的邻点是P1和P2。那我们要求的,其实就是点Q。Q到PP1和PP2的距离都是L。如图所示,明显向量PQ就是向量...原创 2019-11-12 17:21:47 · 11797 阅读 · 18 评论 -
代码实现地图截图功能
问题描述:已知左上角点(lon1,lat1),右下角点(lon2,lat2),以及当前地图的放大倍数zoom,把左上角点到右下角点之间的地图区域保存成图片。一、基础知识一般的地图是由一张张瓦片式的图片拼成的,就像装修时铺地砖一样。而且这些瓦片都是正方形的,比较普遍的大小是256*256。当zoom为0时,整个世界的地图就是一张256*256的图片。当zoom为1时,世界地图就被切成了2^1...原创 2019-11-01 15:40:08 · 2509 阅读 · 0 评论 -
地理坐标(经纬度坐标)和屏幕坐标(xy坐标)间的转换
在我们的屏幕上,有一张地图,这张地图经过缩放、平移、旋转,最终地理坐标和屏幕坐标的关系大致如下图所示:这种关系要怎么描述呢?我们可以假设地图是一张纸,而屏幕是一堵墙。只要我们有两个图钉,我们就能把纸定在墙上。我们把这两个点称为锚点。锚点在屏幕坐标系上的坐标是(x1,y1)和(x2,y2),对应在地理坐标系上的坐标是(lon1,lat1)和(lon2,lat2)。那现在的问题就变成了,已...原创 2019-10-28 11:04:24 · 44156 阅读 · 17 评论 -
已知三角形顶点坐标,求其外接圆的公式
三角形的外接圆,就是其圆心到三个顶点的距离都相等。设三角形的坐标为(x1,y1),(x2,y2),(x3,y3),圆心坐标为(x,y),那么它们满足以下方程组:(x-x1)^2+(y-y1)^2=(x-x2)^2+(y-y2)^2(x-x1)^2+(y-y1)^2=(x-x3)^2+(y-y3)^2解方程之后,可以得到x和y的表达式。我硬着头皮解了一次,发现表达式很复杂,没办法化简。公...原创 2019-09-20 10:05:15 · 6470 阅读 · 1 评论 -
常见动画的缓动函数
大多时候,我们的动画都是线性变化的。例如,一个点从0运动到1,假如中间有8个点,那就应该是0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8。但有的时候,我们需要一种非线性的变化。例如我们做一架飞机起飞,它的变化应该是从慢到快的。又比如一个小球落地,它的轨迹应该是抛物线,而且还会弹起。要做到这些,就需要用到缓动函数(EasingFunction)。很多语言都提供了缓动函数库,但如我...原创 2019-05-09 10:23:08 · 8996 阅读 · 0 评论 -
机器码、序列号、认证码、注册码的生成算法(一)
虽然标题列出了很多种“码”,但其实有些是一个意思,只是叫法不一样而已。我所介绍的算法也不是说绝对严谨、不能破解的,它们只是适用于某些场合而已。举个例子,我现在想设计一个长度是24个字符的注册码,但如果你用比较安全的RSA算法来做的话,可能你要用到1024个字节,转成Base64也有170个字符。又比如,认证码的用户都是体力劳动者,但你非要做得顶级黑客都无法攻破,感觉就没有意义了。以下所说的几种认证...原创 2019-06-05 15:05:32 · 23968 阅读 · 0 评论 -
机器码、序列号、认证码、注册码的生成算法(二)
设备动态密码设计我们再把需求列出来:(1)密码只能是阿拉伯数字,而且不能太长,一般要求10位以下,否则记不住,或让人感觉厌烦。(2)密码包含用户信息,系统能知道是谁对设备进行了操作。(3)密码是动态的,每次都不一样。(4)密码能够防止恶意篡改。说白了,就是密码里包含用户信息、时间信息,校验信息,但只能有8个阿拉伯数字。这是可以做到的,为什么?因为我最后做出来了。好,我们...原创 2019-06-05 15:26:22 · 7645 阅读 · 0 评论 -
机器码、序列号、认证码、注册码的生成算法(三)
机器码生成如果我们希望注册码只能在一台电脑上使用,那就需要生成一个机器码。把机器码交给开发者,开发者经过一系列的运算之后,返回一个注册码。这个注册码已经包含了机器信息,只能用在一台电脑上。机器码可以从很多硬件信息上得到,例如是MAC地址、磁盘ID、CUP序列号等。但这些信息有几个问题:(1)不一定唯一,很多同个型号的电脑,硬件信息都是一样的。(2)不一定存在。例如没有网卡,MAC地...原创 2019-06-05 15:44:32 · 15016 阅读 · 0 评论 -
机器码、序列号、认证码、注册码的生成算法(四)
生成注册码(非对称加解密)我们再列出几种生成注册码的情况:(1)软件生成一个机器码,交给开发者,开发者提供一个注册码。(2)把用户名交给开发者,开发者提供一个注册码。(3)直接向开发者索取一个注册码。在算法上,这几种情况并无太大区别。如果我们有一个原始的码(机器码或用户名),我们把它设为x,那么注册码就是x的一个函数y=f(x)。如果是第三种情况,那么x可能是一个随机数(也可能...原创 2019-06-06 08:44:32 · 12368 阅读 · 0 评论 -
机器码、序列号、认证码、注册码的生成算法(五)
生成注册码(对称加密)非对称加密自然是要更安全的,因为软件里没有私钥。但该方法最大的缺点就是密钥太长,注册码太长,无法手抄。鉴于我们假设破解者是无法对软件反编译的,使用对称加密也未尝不可。流程跟上一节提到的基本一致。加密方法可以使用DES,密钥最短是64位,也就是16个字符。明文信息最长是7个字节,我们用4个字节存放机器码(相当于一个int),然后剩下的三个字节存放过期信息。下面是实现...原创 2019-06-06 08:56:43 · 9094 阅读 · 0 评论 -
坐标轴刻度取值算法
我们在用代码绘制图表的时候,需要绘制坐标轴,而坐标轴上是有刻度的。假如数据最小值是0.32,最大值是0.65,我们想坐标轴上有11个刻度左右,那是不是每个刻度的间隔就是(0.65-0.32)/10=0.033呢?这样做出来的刻度是这样的:0.32 0.353 0.386 0.419 0.452 0.485 0.518 0.551 0.584 0.617 0.65Oh my god! 这样的...原创 2019-06-13 16:35:33 · 7430 阅读 · 2 评论 -
绘制等高线图的算法
假设我们在一个矩形范围内,有一些离散的高度数据,形如(x,y,height)这样的数据集,然后我们要得到一张这样的等高线图:我们描述一下生成等高线图的算法。一、图形概述实际地图上实用的单位是米,但我们显示时使用的单位是像素,这里面有一个转换的关系。而且,显示的图形有可能需要缩放。所以我们收集的数据,x和y统一使用相对值。我们把总长和总宽都定为1,实际的坐标相对于单位1来定。例如地图...原创 2019-06-12 11:14:52 · 18239 阅读 · 17 评论 -
C#表达式求值算法(干货)
在讲述算法之前,我们需要先学习几个概念。中缀表示法中缀表示法就是我们人书写表达式的方法,如8/4+3*(6-2)。后缀表示法后缀表示法是从中缀表示法转化过来的,它满足以下条件:(1)操作数的顺序与中缀表达式一致。(2)没有括号。(3)操作符没有优先级之分。例如上面的表达式,其后缀形式是:84/362-*+后缀表达式的特点对计算机计算非常有利。二元运算符需...原创 2019-06-27 15:07:43 · 4185 阅读 · 3 评论 -
绘制云图的三种算法(附C#代码)
我们要做什么呢?就是输入一个二维数组,TestData = new double[9, 6] { { 26,28,29,32,28,27}, { 27,30,32,35,30,28}, { 24,27,30,27,25,24}, { 22,20,25,28,26,23}, { 19,15,20,26,25,24}, { 17,18,23,27,...原创 2019-04-26 16:11:33 · 15837 阅读 · 14 评论