OpenGL中如何用一条直线连接两个独立变换矩形的顶点?

OpenGL中如何用一条直线连接两个独立变换矩形的顶点?,第1张

这得看左上角点的判断标准,旋转 *** 作可能会改变图形的相对位置,如果是旋转 *** 作后的左上角点,就有点麻烦,用旋转矩阵 乘 矩形所有点坐标(x,y,0)自己模拟出旋转 *** 作,得到旋转后点坐标,然后判断哪个点是左上角点(左上角点的x比较小,y比较大),把这两个点glBegin(GL_LINES) 连接。
另外,OpenGL 有图像拾取功能,不过我没有试过这样行不行。

初始化GLFW,创建窗口,初始化GLAD,创建视口,给定顶点数据,生成并绑定VAO、VBO、EBO(准备在GPU中进行处理),设置顶点属性指针(本质上就是告诉OpenGL如何处理数据),给出顶点和片段着色器,然后链接为着色器程序,渲染时使用着色器程序,清空缓冲,使用着色器程序,绘制三角形,交换缓冲区并检查触发事件(比如键盘移动、鼠标移动),删除VAO、VBO、EBO,调用GLFW的函数来清理所有的资源并退出程序即可看到平行四边形的效果

gl的GL_LINE 模式画线是很差劲的东西 ,只能画单像素粗细的直线(虽然有时更改参数能让他画的线稍微粗点)但终究是比较差的画线方式
所以正确的方法是画一个矩形,里面贴上特质的贴图来做个假直线

CDC类不是有现成的函数么
CDC pdc = CDC::FromHandle(hdc);
pdc->MoveTo(ps);
pdc->LineTo(pe);
以下是引用:
直线段的扫描转换算法
1 数值微分(DDA)法
我的理解就是以一个坐标轴为步长值(增量为1),另一个坐标根据直线的斜率(K)为
增量,然后四舍五入进行计算机,确定每一个点的坐标。
具体算法(我用OPENGL模拟)
void setPixel(GLint xCoord,GLint yCoord)
{
glBegin(GL_POINTS);
glVertex2i(xCoord,yCoord);
glEnd();
}
inline int round(const float a)
{
return int(a+05);
}
void lineDDA(int x0,int y0,int xEnd,int yEnd)
{
int dx = xEnd - x0,dy = yEnd - y0,steps,k;
float xIncrement,yIncrement,x = x0,y=y0;
if(abs(dx)>abs(dy))
{
steps = abs(dx);
}
else
{
steps = abs(dy);
}
xIncrement = float(dx)/float(steps);
yIncrement = float(dy)/float(steps);
setPixel(round(x),round(y));
for(k = 0;k<steps;k++)
{
x+=xIncrement;
y+=yIncrement;
setPixel(round(x),round(y));
}
}
2中点画线法
同样我理解的算法就是,以一个增量为多的坐标轴为步长值(为1),而另一个坐标
值是加1,还是不变取决于这两个坐标值中点是在这条直线的上方,还是下方。
具体算法如下:
void lineMiddle(int x0,int y0,int xEnd,int yEnd)
{
int a,b,c,d1,d2,d;
a = y0-yEnd;
b = xEnd-x0;
d = 2a+b;//判别试(2a+b为初始值)
d1 = 2a;//中点在直线下方增量值
d2 = 2a+b;//中点在真线上方的增量值
int x,y;
x = x0;y=y0;
setPixel(x,y);
while(x<xEnd)
{
if(d<0)//中点在直线下方
{
x++;
y++;
d+=d2;
}
else//中点在直线上方
{
x++;
d+=d1;
}
setPixel(x,y);
}
}
3Bresenham画线算法程序:
用一个坐标轴来当步长值(即+1),另一个坐标轴是否加1则跟据斜率(k)来确定,K
如果大于05,那么也加+1,如果小于05那么即不变。为了方便计算,如果d大于1
,那么就减一,归0。可设e,e=d-05,于是就有e>0时,加1,e<0时不变,这样便
于硬件实现。
算法实现如下:
void lineBresenham(int x0,int y0,int x1,int y1)
{
int x,y,dx,dy;
float k,e;
dx = x1 - x0;
dy = y1 - y0;;
k = (float)dy/dx;
e = -05;
x = x0;
y = y0;
setPixel(x,y);
for(int i =0;i<dx;i++)
{
x = x+1;
e = e+k;
if(e>=0)
{
y++;
e = e-1;
}
setPixel(x,y);
}
}

glVertex3f(0,0,0);
glVertex3f(00,00,50);
这个垂直于屏幕,永远不会被绘制。
另外glOrtho (-10, 10, -10, 10, 15, 200);设定了Z坐标为(-15到-200)的才会被复制,可是你画的两条线
glVertex3f(0,0,0);
glVertex3f(50,00,00);
glVertex3f(0,0,0);
glVertex3f(00,50,00);
都不在(-15~-200)范围内,所以不会被绘制。
修改成glOrtho (-10, 10, -10, 10, 00, 200);显示正常。

要想在VB60中使用OpenGL绘图,必须先下载一个SDK,名字叫vbogltlb。 下载该文件后,直接在VB60“工程”-“引用”里面引用 1、在form中加入一个PictureBox控件 2、要在Windows里面使用OpenGL,必须先进行像素格式设置

glbegin(GL_LINE);
glvertex3f();//在括号里输入点的坐标,如(00f,00f,500f);
glvertex3f();//在括号里输入点的坐标,如(00f,00f,500f);
glend();


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/13409854.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-30
下一篇 2023-07-30

发表评论

登录后才能评论

评论列表(0条)

保存