javapath2d.Double,追加但不减法

javapath2d.Double,追加但不减法,java,graphics2d,subtraction,path-2d,Java,Graphics2d,Subtraction,Path 2d,我已经研究过使用奇偶缠绕规则,以便在一个区域中创建孔。在论坛上,我能想到的就是一个Path2D。在它的内部加上一个洞。我想在已经存在的Path2D中创建一个整体,就像Area类具有Area.New形状一样;做我绝望了。我知道Path2D有能力提高我的游戏性能 Path2D.Double d = new Path2D.Double(Path2D.WIND_EVEN_ODD);// this is a much larger circle which I will be using to subtr

我已经研究过使用奇偶缠绕规则,以便在一个区域中创建孔。在论坛上,我能想到的就是一个Path2D。在它的内部加上一个洞。我想在已经存在的Path2D中创建一个整体,就像Area类具有Area.New形状一样;做我绝望了。我知道Path2D有能力提高我的游戏性能

Path2D.Double d = new Path2D.Double(Path2D.WIND_EVEN_ODD);// this is a much larger circle which I will be using to subtract from the tile...

d.append(current_draw_area.createTransformedArea(mouse_point), false);//Note that this is an area without a winding rule...

Path2D.Double shape= new Path2D.Double();//this is actually a empty tile which is simply a rectangle, but will eventually have something in it to subtract from...

shape.append(d, false);
注意:输出应该是一个空正方形,因为大得多的圆完全覆盖了瓷砖,或者是一个删除了圆与现有瓷砖形状交点的瓷砖,留下了瓷砖的剩余部分

研究链接

编辑:


您能否通过围绕原始路径2d Area=new AreaoriginalPath构建区域来使用区域;然后用它减去你想要的面积,然后从中创建一个新的Path2D-original=new Path2D.Doublearea@我不知道这是否理想。我正在根据这些类型改变区域,因此它是多层的。我需要减去的原因是,在一个面积被加上的地方,下面所有的面积都会被减去。转换有多贵?不确定,你得测试一下。不会比你现在做的更贵了@从某种意义上说,这就是我现在正在做的事情,但仍然涉及到这个领域。我不确定Path2D是否会更快,但现在我的绘图在上面编辑的live上有点神经质。@程序员不要介意,这可能是正在进行的相当大的循环过程。我刚刚把if里面的所有东西都注释掉了,它仍然很紧张。
for (int i = 0; i < paint_textures.size(); i++) {

            if (!current_paint.equals(paint_textures.get(i))) {

                paint_regions.get(paint_textures.get(i)).subtract(new Area(current_draw_area.createTransformedArea(mouse_point)));

                for (int y = adjY - 100; y < adjY + current_draw_area.getBounds().height + 100; y += 100) {

                    for (int x = adjX - 100; x < adjX + current_draw_area.getBounds().width + 100; x += 100) {

                        try {

                            if (paint_tiles.get(paint_textures.get(i)).get(new Point(x, y)).intersects(new Rectangle(x, y, 100, 100))) {

                                Area a = (Area) paint_regions.get(paint_textures.get(i)).clone();
                                a.intersect(new Area(new Rectangle(x, y, 100, 100)));

                                Path2D.Double d = new Path2D.Double(a.getPathIterator(null).getWindingRule());
                                d.append(a.getPathIterator(null), false);//This Causes painting to be Jumpy...

                                paint_tiles.get(paint_textures.get(i)).replace(new Point(x, y), d);

                            }

                        } catch (NullPointerException e) {
                        }

                    }

                }
            }
        }