计算机图形学-扫描转换直线段-直线方程法-DDA算法-中点算法-OPENGL实现-详解

2023-10-30

说明与环境配置

生成一个线段的方法主要有三种:

  1. 直线方程法
  2. 数字差分分析DDA算法
  3. 中点算法, (Bresenham 算法)
    我所采用的实现方式:
    OPENGL1.1库 + VS2019

环境配置

https://blog.csdn.net/BoyInC0de/article/details/90079870

扫描转换直线段

方法一: 直线方程法

该方法根据直线的几何方程来群定线段路径上的像素位置

方程: y = m x + b y=mx + b y=mx+b
通俗来讲, 只要确定   m \ m  m   b \ b  b, 就可以通过不断将   x i \ x_i  xi代入方程计算像素   ( x i , y i ) \ (x_i, y_i)  (xi,yi)的值

那么对于区间   [ x 0 , x 1 ] \ [x_0,x_1]  [x0,x1]只要将其离散化到   k 0 , k 1 . . . . k n \ k_0,k_1....k_n  k0,k1....kn,
其中   k i + 1 = k i + 1 , k 0 = x 0 , k n = x 1 \ k_{i+1} = k_i+1, k_0=x_0, k_n=x_1  ki+1=ki+1,k0=x0,kn=x1
我们就可以通过   y i = m x i + b \ y_i=mx_i+b  yi=mxi+b计算纵坐标
然后通过取整得到   y \ y  y坐标
取整:
{ ( k i , y i ) } i = 0 n → { ( k i , y i , r ) } i = 0 n \left\{ (k_i,y_i) \right\}_{i=0}^n \to \left\{ (k_i,y_{i,r}) \right\}_{i=0}^n {(ki,yi)}i=0n{(ki,yi,r)}i=0n
  y i , r = r o u n d ( y i ) = ( i n t ) ( y i + 0.5 ) \ y_{i,r} = round(y_i)=(int) (y_i + 0.5)  yi,r=round(yi)=(int)(yi+0.5)
和后两种算法相比, 该算法具有很明显的弊端.
运算特点: 乘法+加法+取整 浮点运算

代码描述: 算法比较简单, 暂无代码.

方法二: 数字差分分析DDA算法

方法:
y i + 1 = m x i + 1 + b = m ( x i + 1 ) + b = m x i + b + m = y i + m \begin{aligned} y_{i+1} & = mx_{i+1}+b \\ & = m(x_i+1) + b \\ & = mx_i + b + m \\ & = y_i + m \\ \end{aligned} yi+1=mxi+1+b=m(xi+1)+b=mxi+b+m=yi+m

运算特点: 加法+取整 浮点运算

代码描述:

void CALLBACK draw(){     //都是全局变量
		glColor3f(rc, gc, bc);
		m = (float)dy / dx;
		y = y_0;
		for (x = x0; x <= x1; x++) {
			glBegin(GL_POINTS);
			glVertex2i(x,(int)(y+0.5));
			glEnd();
			y += m;
		}
		glFinish();
}

方法三: 中点算法

方法:
直线的隐式方程: F ( x , y ) = A x + B y + C = 0 F(x,y)=Ax+By+C=0 F(x,y)=Ax+By+C=0
该式中:
A = y 0 − y 1 = − Δ y B = x 1 − x 0 = Δ x C = x 0 ∗ y 1 − x 1 ∗ y 0 \begin{aligned} A &amp;= y_0 - y_1 = -\Delta y \\ B &amp;= x_1 - x_0 = \Delta x \\ C &amp;= x_0 * y_1 - x_1*y_0 \\ \end{aligned} ABC=y0y1=Δy=x1x0=Δx=x0y1x1y0
直线具有正负划分性,
直线上方的点:   F ( x , y ) &gt; 0 \ F(x,y) \gt 0  F(x,y)>0
直线下方的点:   F ( x , y ) &lt; 0 \ F(x,y) \lt 0  F(x,y)<0
直线上的点:   F ( x , y ) = 0 \ F(x,y) = 0  F(x,y)=0

有了正负划分性, 我们可以想象像素点组成了一条蛇, 它沿着直线, 在直线两侧游走.
一会大于0, 一会小于0.

那么这条蛇的出发点就是   ( x 0 , y 0 ) \ (x_0,y_0)  (x0,y0), 那么它的下一个点应该是什么呢?
也就是说根据   ( x i , y i , r ) \ (x_i,y_{i,r})  (xi,yi,r) 如何确定他的下一个像素点   ( x i + 1 , y i + 1 , r ) \ (x_{i+1},y_{i+1,r})  (xi+1,yi+1,r), (y_{i,r}是取整后的坐标)

这里我们根据所取点间的中点M与直线的位置构造一个函数判别式:
d = F ( M ) = F ( x i + 1 , y i , r + 0.5 ) d=F(M)=F(x_i+1,y_{i,r}+0.5) d=F(M)=F(xi+1,yi,r+0.5)
这个函数的意义是 M点位于直线的上方还是下方, 也就是说, 算完   ( x i , y i , r ) \ (x_i,y_{i,r})  (xi,yi,r)以后,   x i \ x_i  xi加上1也就是点   E \ E  E
再点E再向上加0.5个点位, 就是点   M \ M  M, 而我们只要将   M \ M  M坐标代入直线方程,
就可以根据正负来判断它是在直线上面还是下面

在这里插入图片描述

  1. 如果   d ≥ 0 \ d\geq0  d0, 中点M在线段上方, 取点E
  2. 如果   d &lt; 0 \ d\lt0  d<0, 中点M在线段下方, 取点NE

接下来取包括初始点在内的连续三个点, 做一个计算, 参考图:
在这里插入图片描述
初始点:   ( x 0 , y 0 ) \ (x_0,y_0)  (x0,y0) , 中点:   M ( x 0 + 1 , y 0 + 0.5 ) \ M(x_0+1,y_0+0.5)  M(x0+1,y0+0.5) 代入   F ( x , y ) \ F(x,y)  F(x,y)
设 d = F ( x 0 + 1 , y 0 + 0.5 ) = A ( x 0 + 1 ) + B ( y 0 + 0.5 ) + C = ( y 0 − y 1 ) ( x 0 + 1 ) + ( x 1 − x 0 ) ( y 0 + 0.5 ) + x 0 y 1 − x 1 y 0 = y 0 − y 1 + 0.5 ( x 1 − x 0 ) = A + 0.5 B \begin{aligned} 设d=F(x_0+1,y_0+0.5) &amp;= A(x_0+1) + B(y_0 + 0.5) + C \\ &amp;= (y_0-y_1)(x_0+1)+(x_1-x_0)(y_0+0.5)+x_0y_1-x_1y_0 \\ &amp;= y_0-y_1+0.5(x_1-x_0) \\ &amp;= A+0.5B \end{aligned} d=F(x0+1,y0+0.5)=A(x0+1)+B(y0+0.5)+C=(y0y1)(x0+1)+(x1x0)(y0+0.5)+x0y1x1y0=y0y1+0.5(x1x0)=A+0.5B
接下来判定再下一个像素,   ( x i + 2 , y i + 1 , r ) \ (x_{i}+2, y_{i+1,r})  (xi+2,yi+1,r)
第一种情况上一点的:   d ≥ 0 \ d\geq0  d0:
初始点:   ( x 0 , y 0 ) \ (x_0,y_0)  (x0,y0) , 第一个点:   M ( x 0 + 1 , y 0 ) \ M(x_0+1,y_0)  M(x0+1,y0), 那么第二个点   ( x 0 + 2 , y 0 + 0.5 ) \ (x_0+2,y_0+0.5)  (x0+2,y0+0.5) 代入F(x,y)
F ( x 0 + 2 , y 0 + 0.5 ) = A ( x 0 + 2 ) + B ( y 0 + 0.5 ) + C = ( y 0 − y 1 ) ( x 0 + 2 ) + ( x 1 − x 0 ) ( y 0 + 0.5 ) + x 0 y 1 − x 1 y 0 = ( y 0 − y 1 ) + 0.5 ( x 1 − x 0 ) + ( y 0 − y 1 ) = A + 0.5 B + A = d + A \begin{aligned} F(x_0+2,y_0+0.5) &amp;= A(x_0+2) + B(y_0 + 0.5) + C \\ &amp;= (y_0-y_1)(x_0+2)+(x_1-x_0)(y_0+0.5)+x_0y_1-x_1y_0 \\ &amp;=(y_0-y_1)+0.5(x_1-x_0) + (y_0 - y_1) \\ &amp;= A+0.5B+A \\ &amp;=d + A \end{aligned} F(x0+2,y0+0.5)=A(x0+2)+B(y0+0.5)+C=(y0y1)(x0+2)+(x1x0)(y0+0.5)+x0y1x1y0=(y0y1)+0.5(x1x0)+(y0y1)=A+0.5B+A=d+A
第二种情况上一点的:   d &lt; 0 \ d\lt0  d<0:
初始点:   ( x 0 , y 0 ) \ (x_0,y_0)  (x0,y0) , 第一个点:   M ( x 0 + 1 , y 0 + 0.5 ) \ M(x_0+1,y_0+0.5)  M(x0+1,y0+0.5), 那么第二个点   ( x 0 + 2 , y 0 + 1.5 ) \ (x_0+2,y_0+1.5)  (x0+2,y0+1.5) 代入F(x,y)
F ( x 0 + 2 , y 0 + 1.5 ) = A ( x 0 + 2 ) + B ( y 0 + 1.5 ) + C = ( y 0 − y 1 ) ( x 0 + 2 ) + ( x 1 − x 0 ) ( y 0 + 1.5 ) + x 0 y 1 − x 1 y 0 = y 0 − y 1 + 0.5 ( x 1 − x 0 ) + ( y 0 − y 1 ) + ( x 1 − x 0 ) = A + 0.5 B + A + B = d + A + B \begin{aligned} F(x_0+2,y_0+1.5) &amp;= A(x_0+2) + B(y_0 + 1.5) + C \\ &amp;= (y_0-y_1)(x_0+2)+(x_1-x_0)(y_0+1.5)+x_0y_1-x_1y_0 \\ &amp;= y_0-y_1+0.5(x_1-x_0)+(y_0-y_1)+(x_1-x_0) \\ &amp;= A+0.5B+A+B \\ &amp;=d+A+B \end{aligned} F(x0+2,y0+1.5)=A(x0+2)+B(y0+1.5)+C=(y0y1)(x0+2)+(x1x0)(y0+1.5)+x0y1x1y0=y0y1+0.5(x1x0)+(y0y1)+(x1x0)=A+0.5B+A+B=d+A+B
观察第一种情况:   d \ d  d 的增量是   A \ A  A ( 即 − Δ y -\Delta y Δy )
观察第二种情况:   d \ d  d 的增量是   A + B \ A+B  A+B ( 即 − ( Δ y − Δ x ) -(\Delta y-\Delta x ) (ΔyΔx) )
那么采用归纳法:
d 0 = A + 0.5 B d i + 1 = { d i + A , d i &gt; 0 d i + A + B , d i ≤ 0 \begin{aligned} d_0 &amp;= A+0.5B \\ d_{i+1} &amp;= \begin{cases} d_i + A, &amp; \text{$d_i\gt 0$} \\ d_i + A+B, &amp; \text{$d_i\leq 0$} \end{cases} \end{aligned} d0di+1=A+0.5B={di+A,di+A+B,di>0di0
接下来做一个优化: 用2d来代替d
增量都是整数, 只有初始值包含小数, 可以用2d代替d, 2a改写成a + a
这样一来, 算法中只有整数变量, 不含乘除法, 可用硬件实现.

但是, 这只是斜率 0 ≤ m ≤ 1 0\leq m\leq 1 0m1的情况
按照上面的归纳法, 通过计算, 便可以得到以下方程:

0 ≤ m ≤ 1 0\leq m\leq 1 0m1:
d 0 = 2 A + B d i + 1 = { d i + 2 A , d i &gt; 0 d i + 2 A + 2 B , d i ≤ 0 d i &lt; 0 时 , y 增 1 \begin{aligned} d_0 &amp;= 2A+B \\ d_{i+1} &amp;= \begin{cases} d_i + 2A, &amp; \text{$d_i\gt 0$} \\ d_i + 2A+2B, &amp; \text{$d_i\leq 0$} \end{cases} \\ d_i&amp;\lt 0时, y增1 \end{aligned} d0di+1di=2A+B={di+2A,di+2A+2B,di>0di0<0,y1

m &gt; 1 m\gt 1 m>1:
d 0 = A + 2 B d i + 1 = { d i + 2 A + 2 B , d i &gt; 0 d i + 2 B , d i ≤ 0 d i &gt; 0 时 , x 增 1 \begin{aligned} d_0 &amp;= A+2B \\ d_{i+1} &amp;= \begin{cases} d_i + 2A +2B, &amp; \text{$d_i\gt 0$} \\ d_i +2B, &amp; \text{$d_i\leq 0$} \end{cases} \\ d_i&amp;\gt 0时, x增1 \end{aligned} d0di+1di=A+2B={di+2A+2B,di+2B,di>0di0>0,x1

− 1 ≤ m ≤ 0 -1\leq m\leq 0 1m0:
d 0 = 2 A − B d i + 1 = { d i + 2 A − 2 B , d i &gt; 0 d i + 2 A , d i ≤ 0 d i &gt; 0 时 , y 减 1 \begin{aligned} d_0 &amp;= 2A-B \\ d_{i+1} &amp;= \begin{cases} d_i + 2A-2B, &amp; \text{$d_i\gt 0$} \\ d_i + 2A, &amp; \text{$d_i\leq 0$} \end{cases} \\ d_i&amp;\gt 0时, y减1 \end{aligned} d0di+1di=2AB={di+2A2B,di+2A,di>0di0>0,y1

m &lt; − 1 m\lt -1 m<1:
d 0 = A − 2 B d i + 1 = { d i − 2 B , d i &gt; 0 d i + 2 A − 2 B , d i ≤ 0 d i &lt; 0 时 , x 增 1 \begin{aligned} d_0 &amp;= A-2B \\ d_{i+1} &amp;= \begin{cases} d_i - 2B, &amp; \text{$d_i\gt 0$} \\ d_i + 2A - 2B, &amp; \text{$d_i\leq 0$} \end{cases} \\ d_i&amp;\lt 0时, x增1 \end{aligned} d0di+1di=A2B={di2B,di+2A2B,di>0di0<0,x1

代码描述:

#include <windows.h>
#include <GL.H>
#include <GLAUX.H>
#include <GLU.H>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//添加这3条语句
#pragma comment (lib, "opengl32.lib")  
#pragma comment (lib, "glu32.lib")  
#pragma comment (lib, "glaux.lib")  
//#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" ) //这句是不让控制台窗体出现,如果想要出现,去掉即可。
inline void init() //初始化
{
	glClearColor(0.0, 0.0, 0.0, 1.0);//黑色背景
}
//绘制图形函数
float r = 1, g = 0, b = 0;
float x = 30.0f, y = 30.0f;
float R1, R2;
float pi = 3.1415926f;
int i;
int x0; int y_0; int x1; int y_1; float rc; float gc; float bc;

void CALLBACK draw()
{
	float dx = x1 - x0, dy = y_1 - y_0;
	float m = 0;
	if (dx != 0) m = dy / dx;
	else return;
		if (x0 > x1)
		{
			int t = x1; x1 = x0; x0 = t;
			t = y_1; y_1 = y_0; y_0 = t;
		}
		int d = 0;
		int d1 = d, d2 = d;
		int a = y_0 - y_1, b = x1 - x0, c = x0 * y_1 - x1 * y_0;
		glColor3f(rc, gc, bc);
		d = a + a + b;
		d1 = a + a;
		d2 = (a + b) + (a + b);
		int x = x0;
		int y = y_0;
		for (int i = x0; i < x1; i++)
		{
			if (d < 0)
			{
				y++;
				d += d2;
			}
			else d += d1;
			x++;
			glBegin(GL_POINTS);
			glVertex2i(x, y);
			glEnd();
		}
		glFinish();
}

void set(int x0, int y_0, int x1, int y_1, float rc, float gc, float bc) {
	::x0 = x0;	::x1 = x1;	::y_0 = y_0;	::y_1 = y_1;	::rc = rc;	::gc = gc;	::bc = bc;  
}

void CALLBACK change(){
	set(100, 500, 350, 550, 0.0f, 1.0f, 0.0f); 	draw();
}

void main()
{
	auxInitDisplayMode(AUX_SINGLE | AUX_RGBA);
	auxInitPosition(100, 0, 1000, 1000);
	auxInitWindow("CGOpenGL");
	init();
	auxIdleFunc(change);
	auxMainLoop( draw );
}

所有代码下载与效果展示:

该代码采用包含直线段绘制的两种算法:
**中点算法, 和 DDA算法. **
分别采用两种算法描绘出4种不同斜率的直线, 外加一条单独处理的垂直x轴的直线. 有明确的注释.
虽然OpenGL1.1库文件较老, 但不论是对于教学还是实践, 对理解直线段算法都具有重要意义.

下载地址: https://download.csdn.net/download/boyinc0de/11206604

效果展示:

其中左侧图形为: 中点算法绘制
中间竖线为: 特殊处理
右侧图形为: DDA算法绘制
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算机图形学-扫描转换直线段-直线方程法-DDA算法-中点算法-OPENGL实现-详解 的相关文章

  • OpenGL,如何独立旋转对象?

    到目前为止我的代码 void display void glClear GL COLOR BUFFER BIT GL DEPTH BUFFER BIT Clear Screen And Depth Buffer glLoadIdentity
  • glVertexAttribDivisor 和 glVertexBindingDivisor 有什么区别?

    我一直在寻找将属性与任意顶点分组关联起来的方法 起初似乎是我实现这一目标的唯一方法 但后来我偶然发现了这个问题 https stackoverflow com questions 14169228 opengl single vertex
  • 如何在 GLSL 1.3 和 OpenGL 2.1 中使用位运算

    我正在尝试编写一个使用许多位操作的着色器 事实上 从 glsl 1 30 开始就支持它们 但我只使用 OpenGL 2 1 有没有办法在我的 OpenGL 版本中使用位运算 所有 SM3 兼容 OpenGL 2 1 硬件支持limited整
  • LibGDX纹理混合与OpenGL混合功能

    在 libGdx 中 我试图创建一个成形纹理 采用完全可见的矩形纹理并将其遮罩以获得成形纹理 如下所示 在这里我在矩形上测试它 但我想在任何形状上使用它 我调查过本教程 http www learnopengles com tag addi
  • 移动/调整大小期间 opengl 窗口冻结

    我正在使用 LWJGL 开发游戏 移动窗口时 计划将来添加调整大小代码 渲染循环冻结 我希望它在移动时继续以某种方式运行 LWJGL 不包括 glutMainLoop Display属于OpenGL 而不是Java 相关代码 regular
  • 如何计算正切和副法线?

    谈谈OpenGL着色语言 GLSL 中的凹凸贴图 镜面高光之类的东西 I have 顶点数组 例如 0 2 0 5 0 1 0 2 0 4 0 5 法线数组 例如 0 0 0 0 1 0 0 0 1 0 0 0 世界空间中点光源的位置 例如
  • glDeleteTextures在Windows上似乎没有释放纹理内存,有没有解决办法?

    我的 openGL 应用程序内存不足 遇到一些问题 我正在尝试找出我的问题 为此 我创建了一个小型测试程序 它基本上只是从调用 glDeleteTextures 的文件中加载一个巨大的纹理 然后再次加载它 如果我在 OSX 上运行这个测试程
  • 为什么我的 CAOpenGLLayer 更新速度比之前的 NSOpenGLView 慢?

    我有一个在 Mac OS X 上渲染 OpenGL 内容的应用程序 最初它渲染到 NSOpenGLView 然后我将其更改为渲染到 CAOpenGLLayer 子类 当我这样做时 我看到了巨大的性能损失 帧速率减半 鼠标响应能力降低 卡顿
  • OpenGL什么时候完成函数中指针的处理?

    OpenGL有多项功能 http www opengl org wiki GLAPI glTexSubImage2D直接获取指针 他们中有一些从这些指针读取数据 http www opengl org wiki GLAPI glBuffer
  • 渲染缓冲区大于窗口大小 - OpenGL

    我正在尝试绘制大于屏幕尺寸 即 320x480 的渲染缓冲区 512x512 执行 glReadPixels 后 图像看起来是正确的 除非图像的尺寸超过了屏幕尺寸 在本例中 超过了水平 320 和垂直 480 是什么原因导致这种异常现象呢
  • 按像素值偏移 gl_Position 或 gl_Vertex

    我的属性包含像素值 我想用这个属性值来偏移我的 gl vertex 问题是我的 gl vertex 以世界单位为单位 而 offset attribute 以像素为单位 如果我将屏幕尺寸作为统一发送 然后将像素转换为 1 到 1 值 并将其
  • Qt 5.5 QOpenGLWidget 链接错误未链接任何 openGL 调用

    我尝试使用 Qt 5 5 1 构建一个简单的 OpenGL 应用程序 一切都很好 直到我尝试使用 glClearColor 等 openGL 本机函数调用 该小部件实际上编译并产生黑屏 但在我尝试使用任何 openGL 本机函数后 它甚至不
  • OpenSceneGraph 将相机设置在初始位置

    我是第一次使用 OpenSceneGraph 我有点迷失 因为文档确实不太清楚 所以 我有这段代码加载一个带有房子的 obj 文件 并且我在我想要的 人 所在的地方淹没了一个小盒子 所以现在 我不想把那个盒子放在那里 而是想把相机放在那里
  • OpenGL 与 OpenCL,选择哪个以及为什么?

    哪些功能使 OpenCL 能够独特地选择 OpenGL 和 GLSL 进行计算 尽管有与图形相关的术语和不实用的数据类型 OpenGL 是否有任何真正的警告 例如 可以通过使用其他纹理将 a 渲染到纹理来完成并行函数评估 减少操作可以通过迭
  • 进行亚像素平移时,2D 纹理会扭曲

    我想知道一个理论推理为什么这是可能的 几何体的平移与纹理映射有何关系 我只能在进行子像素平移时注意到这种效果 如果通过整个像素平移 纹理看起来很好 我正在使用正交投影 GL CLAMP TO EDGE GL NEAREST 片段着色器是hi
  • 如何创建自己的 openGL 上下文并将其绑定到 GLCanvas?

    所以当我开始掌握java时 paint Graphics g 我继续创建自己的渲染方法 但我必须了解缓冲区策略以及如何 获取 图形 所以现在我在学习openGL 我必须掌握方法 Override public void display GL
  • 如何在 OpenGL 中绘制镜像某些东西的镜子?

    根据我的理解 要在 OpenGL 中进行镜像 您基本上需要绘制场景 然后将所有内容翻转并再次绘制 只是使其通过镜子可见 从而在镜子中创建完美翻转的图像 但我看到的问题是 执行此操作时 唯一可以看到其他镜子的镜子是在前一个镜子之后渲染的镜子
  • 开启TK onRenderFrame和onUpdateFrame的区别?

    我目前正在使用 OpenTK 框架和 OpenGL 用 C 编写 Jump n Run 游戏 Open TK 提供预设功能 例如GameWindow Run or GameWindow onUpdateFrame onRenderFrame
  • glTranslatef 不在 glBegin .. glEnd 中工作

    我正在尝试并排绘制不同颜色的两个方块 我的问题是我无法让 glTranslatef 将第二个方块向右移动 第二个方块只是绘制在第一个方块上 void display void glClear GL COLOR BUFFER BIT glMa
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半

随机推荐

  • Verdi实现信号的平移

    在Verilog System verilog中 xxx可以实现延迟指定时间的功能 而在使用verdi查看信号波形并进行分析时 同样也可以实现类似的功能 注 这种信号平移是有其应用场景的 例如 在某些仿真模型中 为了模拟实际的信号延迟 信号
  • 极光笔记

    随着全球化进程的深入 跨境数据传输与存储问题已经变得愈发重要 推送服务的数据中心节点选择不仅关乎数据访问速度和用户体验 同时也直接牵扯到数据合规性和安全保障 EngageLab Push深知这一点 为了满足更多国际客户和全球用户触达需求 我
  • java resultset获取列数_Java语言如何获取ResultSet的行数和列数

    ResultSet接口表示在数据库的数据表中查询的结果集 ResultSet 对象具有指向其当前数据行的指针 最初 指针被置于第一行之前 Java没有提供直接返回ResultSet行数的函数 或方法 如果想知道ResultSet的行数 有以
  • 图像去噪的快速入门学习

    1 理论基础 数学基础 高等数学 线性代数 概率统计 矩阵论 数值分析等 信号处理 统计信号处理 统计学习理论等 2 文献资料阅读 常用的数据库 IEEE IEE Electronic Library Elsevier SpringerLi
  • Python(4) Numpy,控制台完全输出ndarray

    import numpy as np np set printoptions threshold np nan print ndarray 当ndarray里面的存放的数据维度过大时 在控制台会出现不能将ndarray完全输出的情况 中间部
  • NDIS网络数据监控程序NDISMonitor(3)-----NdisMonitro应用程序(C#)

    转载请标明是引用于 http blog csdn net chenyujing1234 欢迎大家拍砖 1 主窗口Load函数ctrlForm Load 1 先调用GetExtensions来获得运行目录下bin目录中的所有文件 通过载入为A
  • 【maven】The forked VM terminated without saying properly

    1 概述 转载 https blog csdn net zhglance article details 53695653 一直在使用Maven开发项目 最近遇到了一个让人头疼的问题 在网上搜索竟然没有找到中文描述的解决方式 自己找了英文网
  • linux内核中GPIO的使用(一)--IO内存

    一 相关概念 使用IO内存将物理地址映射为虚拟地址 再通过对虚拟地址的操作来控制硬件 所谓的IO内存是指一种编址方式 不同cpu平台使用的编址方式不同 一种是 IO内存 方式 也叫统一编址方式 是指内存和外设的地址是在同一个地址空间上的 如
  • 手把手教你使用Segformer训练自己的数据

    使用Segformer训练自己的数据 系统配置 代码链接 针对MMCV 选择系统 Windows环境要求 ubuntu 18 04 安装swin segmentation 制作VOC 数据集 代码部分修改 开始训练 使用Transforme
  • mysql实时监控工具mytop

    mysql实时监控工具mytop mytop类似于linux top工具 可以实时监控mysql服务器的性能信息 安装依赖 yum install y perl CPAN cpan cpan gt install DBI cpan gt i
  • vmwaeESXi导出虚拟机和安装

    找到你要导出的虚拟机点击 操作 选择导出 点击 导出 导出的文件会通过浏览器下载到本地 点击创建 注册 选择 从OVF或OVA文件部署虚拟机 点下一页 输入 虚拟机名称 然后点击 单机以选择文件或拖放 以下三个文件就是导出的虚拟机 将三个文
  • docker学习:实战commit

    这里的commit是把你修改后的一个容器打包成一个镜像 这样你本地就多了一个image镜像 有什么用呢 就是你在之前的镜像上的修改连同镜像 成为一个新的image 下次你去布置启动这个修改后的镜像就不用 先下载一个镜像再修改 直接拿你这次c
  • 正则表达式作业

    利用正则表达式完成下面的操作 一 不定项选择题 能够完全匹配字符串 010 62661617 和字符串 01062661617 的正则表达式包括 ABD A r d 3 d 8 B r 0 9 C r 0 9 d D r d d 能够完全匹
  • day049:异常、throws声明异常、throw抛出异常、异常的处理方式

    接下节 day050 try catch 常见问题 throwable的成员方法 自定义异常 ZQyyds 的博客 CSDN博客 一 异常 1 什么是异常 指程序出现了不正常的情况 程序在执行过程中 出现的非正常情况 最终会导致JVM的非正
  • Java课题笔记~JSON

    3 1 概述 概念 JavaScript Object Notation JavaScript 对象表示法 如下是 JavaScript 对象的定义格式 name zhangsan age 23 city 北京 接下来我们再看看 JSON
  • 整理:学术论文发表过程中的审稿人意见答复技巧

    整理 学术论文发表过程中的审稿人意见答复技巧 更新历史 20200613 首次发布 科技论文投稿后 通常都需要答复审稿人的意见 对于审稿人的意见 不能随便敷衍 因为这会让审稿人感到不高兴 说不定转头就把论文拒了 因此 需要按照合适的方式或者
  • rsync linux间同步文件及文件夹

    有时候本地写代码想同步到另一台电脑 又不想push上git 用linux自带的rsync 工具 方便快捷 将本地的salmon目录同步到ray ubuntu电脑上 rsync av salmon ray ray ubuntu home ra
  • 关于服务器环境搭建

    前言 在很多新项目中 都会用到环境搭建的情况 今天教大家如何在服务器中部署应用的环境搭建 一 搭建环境是什么 搭建环境是指建立运行程序文件的基础环境 比如服务运行需要装什么软件都需要哪些程序 服务器的部署就是搭建环境 整理了很久 刚开始搭建
  • C++ 惯用法之 Nifty Counter

    背景 C 中全局对象的初始化在 main 函数执行前完成 在 main 函数执行结束前销毁 在同一源码文件中全局变量的初始化顺序和其定义顺序一致 但在不同的源码文件中其初始化顺序不一致 就有可能导致代码出错 一般解决方法 概述 静态局部变量
  • 计算机图形学-扫描转换直线段-直线方程法-DDA算法-中点算法-OPENGL实现-详解

    扫描转换直线段 说明与环境配置 环境配置 扫描转换直线段 方法一 直线方程法 代码描述 算法比较简单 暂无代码 方法二 数字差分分析DDA算法 代码描述 方法三 中点算法 代码描述 所有代码下载与效果展示 说明与环境配置 生成一个线段的方法