当前位置: 首页 > 知识库问答 >
问题:

如何在OpenGL中填充java形状

商运锋
2023-03-14

现在,我当前的渲染代码如下:

public void fill(Shape shape, float xOffset, float yOffset) {
        AffineTransform transform = new AffineTransform();
        transform.translate(xOffset, yOffset);
        PathIterator pi = shape.getPathIterator(transform, 1);
        int winding = pi.getWindingRule();
        ShapeRenderer r = getInstance();
        float[] coords = new float[6];
        boolean drawing = false;
        while (!pi.isDone()) {
            int segment = pi.currentSegment(coords);
            switch (segment) {
            case PathIterator.SEG_CLOSE:
                if (drawing) {
                    r.endPoly();
                }
                break;
            case PathIterator.SEG_LINETO:
                r.lineTo(coords);
                break;
            case PathIterator.SEG_MOVETO:
                if (drawing) {
                    r.endPoly();
                }
                drawing = true;
                r.beginPoly(winding);
                r.moveTo(coords);
                break;
            default:
                throw new IllegalArgumentException("Unexpected value: " + segment);
            }
            pi.next();
        }
    }

着色器:

private final Deque<Queue<Float>> vertices = new ConcurrentLinkedDeque<>();

    @Override
    public void beginPoly(int windingRule) {
    }

    @Override
    public void endPoly() {
        Queue<Float> q;
        GL11.glBegin(GL11.GL_LINE_LOOP);
        while ((q = vertices.poll()) != null) {
            Float x, y;
            while ((x = q.poll()) != null && (y = q.poll()) != null) {
                GL11.glVertex2f(x, y);
            }
        }
        GL11.glEnd();
    }

    @Override
    public void moveTo(float[] vertex) {
        Queue<Float> q = new ConcurrentLinkedQueue<>();
        vertices.offer(q);
        lineTo(vertex);
    }

    @Override
    public void lineTo(float[] vertex) {
        Queue<Float> q = vertices.peekLast();
        q.offer(vertex[0]);
        q.offer(vertex[1]);
    }

假设我想像JavaAWT一样,成功地填充这个形状。。。我该怎么做?(已经尝试使用GL_多边形,但它只填充整个O,我有一个填充圆,而不是O。也尝试使用jogamp glu的部分,但它只是没有渲染任何东西,不知道为什么)

共有1个答案

巫马玉堂
2023-03-14

已经尝试使用GL_多边形,但它只填充整个O,我有一个填充圆,”

是的,当然。GL_POLYGON用于凸形,填充多边形包围的整个区域。

您有两种选择:

>

  • 使用GL_POLYGON两次绘制白色形状,然后在白色形状内绘制红色形状。

    使用GL\u TRIANGLE\u STRIP并形成一个仅绘制轮廓的形状。原语可以通过在外轮廓和内轮廓上交替指定点来形成。

  •  类似资料:
    • 问题内容: 我知道该怎么做,但是我发誓您可以像[[0] = {0,0,0,0};那样填写;你是怎么做到的?我确实尝试过Google,但没有任何帮助。 问题答案: 您也可以将其作为声明的一部分:

    • 问题内容: 有一些简单的方法可以在Java中填充字符串吗? 似乎应该在类似StringUtil的API中使用某些东西,但是我找不到能做到这一点的任何东西。 问题答案: 有几种方法:leftPad,[rightPad](https://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/Str

    • 问题内容: 我用线画一个三角形。如何填充颜色?到目前为止,我只能为线条成功上色,而不能填充颜色。 问题答案: 从顶点制作一个,然后填充它,方法是:

    • 问题内容: 我正在用Java做像素艺术制作者。我做了一个看起来像这样的网格: 现在,我想添加点击填充区域功能。我不知道如何填充它,因为它不是构成网格的数组… 任何建议都非常感谢! 问题答案: 绘画方法应仅绘画,而不设置类的属性。例如,您应该将行/列设置为属性,然后也具有“ gridSize”属性。 那么该面板的首选大小将是: 这很重要,因为您不希望在调整框架大小时动态更改rowHeight和col

    • 我正在为一个家庭作业制作一个ms绘画风格的程序。在这个家庭作业中,你应该能够右键点击一个形状并在屏幕上移动它。填充的形状可以在形状内的任何地方右键单击,而未填充的形状则应在形状的边框上右键单击并选择。 我遇到的问题是,当我最初启动程序,绘制和未填充的形状,并尝试拖动它,它会拖动,但一旦我再次放下它,它的行为正确,变得不可拖动,所有未来未填充的形状都相应地行动。 TLDR:我希望所有填充的形状都是可

    • 问题内容: 我正在编写一个从整数n创建2D数组的程序。然后,我必须用从1到n n数组大小的 值填充数组, 并检查它是否是一个幻方。 我现在的方式是按照从1到n n数组大小的 顺序填充 数组。我该如何随机? 我的代码: 问题答案: 创建一个随机的数字列表以添加到您的数组中,如下所示: