绘制相交圆的轮廓

2023-12-29

我有一组点,每个点都有一个“影响”区域或基本上是一个半径。我希望能够将所有点的每个影响圆绘制为一条简单的圆形线。

它们会重叠,但我希望绘制所形成形状的外部。我知道这可能需要我找出它们相交的位置,并以某种方式形成一个完整的形状来绘制。问题是有些点甚至可能不会触及其他点!所以我也需要能够解决这个问题。

我试图简单地说明我的意思:

请注意,我只想绘制黑线,不填充。这是因为我希望背景图像和其他几何图形能够显示出来。

我会在 openGL 中这样做,所以圆可能会使用 GL_LINES 或一些类似的东西来制作,其中各种顶点形成曲线,但我真的不知道如何计算出这个周长。

如果有人有任何建议或可以指出我如何解决这个问题,我将不胜感激!

这可能更像是一个数学问题,我不是在寻找代码,而是实际上在寻找如何计算出这些形状。我就是想不出该怎么做!

*****编辑:用我想出的解决方案,希望可以帮助其他人!

因此,我使用了建议的想法,并基本上决定最好的方法是使用模板缓冲区进行绘制。现在这意味着我循环遍历我的点 3 次,但我需要对它们进行一些仔细的排序以仅找到可见的点。

所以代码方面我现在有这个:

private void stencilCircleAroundStars()
{
    //Lets try and draw something here using stencil
    glColorMask(false, false, false, false); //Disable colour mask
    glEnable(GL_STENCIL_TEST); // Enable Stencil Buffer For "marking" the outer circle
    glDisable(GL_DEPTH_TEST);// Disable Depth Testing

    for (Object value : stars.values())
    {
        Star star = (Star)value;

        glStencilFunc(GL_ALWAYS, 1, 1); // Always Passes, 1 Bit Plane, 1 As Mask
        glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); // We Set The Stencil Buffer To 1 Where We Draw Any Polygon

        //Draw the large circle
        starOb.location.copy(star.location);
        starOb.setScale(2000);
        starOb.draw();
    }

    for (Object value : stars.values())
    {
        Star star = (Star)value;
        //Now we change the functions and remove a slightly smaller circle from buffer.
        glStencilFunc(GL_ALWAYS, 0, 0); // Always passes, 0 bit plane, 0 as mask;
        glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); // We Set The Stencil Buffer To 0 Where We Draw Any Polygon
        starOb.location.copy(star.location);
        starOb.setScale(1900);
        starOb.draw();
    }

    //Now we enable the colour
    glColorMask(true, true, true, true);
    glStencilFunc(GL_EQUAL, 1, 1); // We Draw Only Where The Stencil Is 1
    glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); // Don't Change The Stencil Buffer

    glColor4f(0.5f, 1.0f, 0.5f, 0.5f);
    for (Object value : stars.values())
    {
        Star star = (Star)value;
        starOb.location.copy(star.location);
        starOb.setScale(2000);
        starOb.draw();
    }

    //Now we are done .. disable
    glDisable(GL_STENCIL_TEST);  
}

为了我的程序的目的,我的点本质上是称为“星星”的实体,而 StarOb 是我从文件加载的四边形的集合,这些四边形形成了一个漂亮的光滑圆圈。

我禁用颜色遮罩并循环一次,将最大的圆绘制到模板缓冲区中并将值设置为 1。然后我再次循环将较小的缩放圆绘制到模板缓冲区中,但这次将值设置为 0。这应该在任何不接触其他恒星的恒星周围留下一个边界,并且将有效地消除它们重叠的地方。

我最终重新启用颜色蒙版并实际绘制彩色圆圈。模板缓冲区阻止内部渲染,我得到了我想要的!然后我禁用模板缓冲区。

如果您真的想看,这里有一个生成多个不断增加的点的视频:它运行的视频 http://www.youtube.com/watch?v=M_QN4Yazx5c

这是其结果的低质量版本(测试时未绘制背景):


首先,想象背景不存在。我很确定您知道该怎么做,绘制每个圆圈,然后绘制其内部(如实心圆圈)以删除内部的弧线。

现在要对图像执行相同的操作,您可以执行以下任一操作。您可以做的一件事是禁用颜色缓冲区上的写入,执行该过程并更改模板缓冲区。然后启用在颜色缓冲区上的写入并绘制整个屏幕矩形,从而填充您在模板缓冲区中标记的像素。

然而,由于多种原因,您可能无法使用模板缓冲区,例如您将其用于其他用途。在这种情况下,另一种方法是执行相同的操作,但不是在模板缓冲区中渲染,而是在纹理中渲染。然后绑定该纹理并在屏幕上绘制一个矩形。

我很确定你也可以通过累积缓冲区来实现这一点,但我从未使用过它,所以我不能真正告诉你(如果有人知道这一点,请编辑我的答案并告诉我们如何做)

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

绘制相交圆的轮廓 的相关文章

  • 简单的openGL程序无法在ubuntu中链接

    我正在尝试进入 opengl 编程 但无法编译我的第一个非常非常简单的程序 链接过程每次都会失败 我发现这个答案 https stackoverflow com questions 859501 learning opengl in ubu
  • 从两个相交的多边形创建新的 MKPolygon

    我知道确实有一个具体的问题讨论了这一点 但它有点老了 如果可能的话 我想了解更多技术性的知识 首先看一下这个截图 https www dropbox com s f94q3qaxrog0ec9 intersections png https
  • 如何从横滚、俯仰和偏航获取相机向上矢量?

    我需要从滚动角 俯仰角和偏航角 以度为单位 获取相机的向上矢量 以获得正确的外观 我已经尝试了几个小时不同的事情 但没有运气 这里的任何帮助将不胜感激 横滚 俯仰和偏航定义 3 轴旋转 从这些角度 您可以构建一个 3x3 变换矩阵来表达该旋
  • 在 Ubuntu 中与未编译的着色器链接

    我需要加载 glsl 来绘制一些东西 我的环境是Ubuntu 13 04 因此它不存在GLuint InitShader GLuint GLuint 这是我的对象创建 预链接步骤和链接的配置 不幸的是 它仍然出现错误 该错误与未编译的着色器
  • 在 QML 中控制纹理 3D 对象的不透明度

    我对 QML 中的 Qt 3D 有点陌生 我正在尝试控制 Qt 3D 的不透明度textured3D 对象 我正在使用简单qml3d https github com tripolskypetr simpleqml3d测试项目来做到这一点
  • LibGDX纹理混合与OpenGL混合功能

    在 libGdx 中 我试图创建一个成形纹理 采用完全可见的矩形纹理并将其遮罩以获得成形纹理 如下所示 在这里我在矩形上测试它 但我想在任何形状上使用它 我调查过本教程 http www learnopengles com tag addi
  • WPF 3D - 在复杂几何体上映射渐变画笔

    我想问是否有人知道如何在 WPF 3D 中的复杂对象上映射渐变画笔 结果应该类似于 matlab 中的 3D 图像 例如 3D 函数 假设您有一些想要可视化的 3 维数据 并且想要通过颜色区分某些级别的值 给定一个 GradientBrus
  • 带孔的多边形三角剖分

    我正在寻找一种算法或库 更好 将多边形分解为三角形 我将在 Direct3D 应用程序中使用这些三角形 最好的可用选项是什么 这是我到目前为止发现的 本 迪斯科的笔记 http www vterrain org Implementation
  • MATLAB 图形渲染:OpenGL 与 Painters?

    当谈到使用哪个渲染器来处理 MATLAB 图形或何时它很重要时 我一无所知 但我遇到过某些示例 其中does matter plot 0 0 ko markersize 50 linewidth 8 set gcf renderer ope
  • 从基本矩阵中查找单应矩阵

    我正在尝试计算单应性矩阵H给定一组对应关系和基本矩阵F 根据对极几何原理 我知道这可以通过对极线和对极线的叉积来完成F from 极点几何 http www cs unc edu marc tutorial node44 html e ij
  • OpenGL:VAO 和 VBO 对于大型多边形渲染任务是否实用?

    如果您想渲染一次在视锥体中包含数千个多边形的大型景观 并且用户的视点不断变化 那么使用 VAO 或 VBO 是否实用 我的意思是 每次玩家的位置或摄像机旋转发生变化时 您都必须重新计算顶点数据 以便正确剔除不再可见的任何顶点或场景 以保持良
  • Windows下使用GLEW使用OpenGL扩展

    我一直在 Windows 上使用 OpenGL 扩展痛苦的方式 https stackoverflow com questions 14413 using opengl extensions on windows GLEW 是更简单的方法吗
  • glm 中矩阵值的顺序不正确?

    我开始使用GLM http glm g truc net通过 OpenGL 3 和 GLSL 进行数学运算的库 我需要正交投影来绘制 2D 图形 所以我编写了这个简单的代码 glm mat4 projection 1 0 projectio
  • OpenGL:始终相同的颜色

    我正在 Windows 上编写一个程序 使用c opengl 2 1 and SDL我在顶点颜色方面遇到了一些问题 我在用着glColor3f设置每个顶点集的颜色 但它似乎不起作用 无论我选择什么颜色 我都会将每个顶点绘制为红色 我检查了传
  • 路径描边算法(转换为三角形/四边形)或其他建议

    有谁知道将矢量路径转换为由三角形 四边形面组成的描边路径的好算法 最好采用圆线连接 基本上 我试图绘制一条粗路径 其颜色基于随路径距离变化的值 我正在考虑将路径转换为三角形 四边形 并通过提供沿路径的距离作为一维纹理坐标来映射它 然后可以使
  • 延迟阴影映射 GLSL

    我目前正在实施延迟渲染管道 但我仍坚持使用阴影贴图 我已经成功地将其实施到前向管道中 我所做的步骤是 获取灯光视图中的位置 转换为光视图剪辑空间 使用 0 5 0 5 获取阴影纹理坐标 检查深度 编辑 使用新结果图像更新代码 float c
  • 是否有任何算法可以计算给定定义形状的坐标的形状面积?

    所以我有一些接收 N 个随机数的函数2D点 是否有任何算法可以计算输入点定义的形状面积 你想要计算多边形的面积 http local wasp uwa edu au pbourke geometry polyarea 取自链接 转换为 C
  • 在 OpenGL 中实例化数百万个对象:提高每秒帧数

    我的最终目标是以 60 fps 渲染 100 万个不同尺寸和颜色的球体 我也希望能够在屏幕上移动相机 我已经修改了代码我正在学习的教程的这一页 http learnopengl com Advanced OpenGL Instancing尝
  • matplotlib:渲染到缓冲区/访问像素数据

    我想使用 matplotlib 生成的图作为 OpenGL 中的纹理 到目前为止 我遇到的 matplotlib 的 OpenGL 后端要么不成熟 要么已经停止使用 所以我想避免使用它们 我当前的方法是将图形保存到临时 png 文件中 并从
  • 渲染到一个颜色通道而不影响其他通道

    使用 OpenGL 任何版本 如何通过一次仅影响一个颜色通道来渲染到帧缓冲区对象 例如 我的帧缓冲区对象具有 GL BGRA 布局 现在我想执行一些渲染命令 这些命令应该只改变红色通道 因此 如果片段用颜色 204 0 0 0 渲染并且像素

随机推荐