我在玩弄一点油漆我想创造不同的画笔技巧(不仅仅是简单的线条)。基本思想是沿着鼠标移动重复(冲压)刷尖因为鼠标移动不会为鼠标移动的每个像素分派所需的事件。
我现在的方法是使用Bresenham算法来确定我要绘制的像素,然后在每个像素上标记画笔的笔尖但这不是很有效,因为刷头是例如30x30像素。我想在画笔宽度的25%上盖章,但我不知道这是怎么做到的我可以检测到距离,只有在达到25%刷尖距离时才能戳到。
有没有其他想法,如何实现一个冲压刷算法,考虑到不规则的鼠标事件,并允许间距的定义?
谢谢你的阅读!

最佳答案

回答有点晚,但如果有人在这里搜索答案,我将如何在java项目的代码中实现它。
步骤是画笔的百分比,所以如果是20x20画笔,那么25步是5像素,这是空间。
然后,我从鼠标的最后和当前位置创建一个规范化向量。
在第一次点击之后。
当dist大于一个迭代器处理所有距离的空间时,因为有时鼠标可以快速移动,因此有多个dib(或“stamp”,dibs是这个域中的术语)
first用于将其与先前的dib对齐。
前一个位置加上iter=space-remn可以得到dib的位置。
在我们把它们都画出来之后,重要的部分就来了。
vector*iter余数(remn)是从添加到与初始阶段的距离(dist)的前一个过程中收集的。
为了理解数学,让我们举一个例子。
刷子=30x30,步长=25%,remn=2.5,dist=28.5(含remn),间距=7.5(30*25/100)
下一个remn=28.5(dist)-27.5(最初5次+7.5*3次,因为检查(因此,鼠标必须移动1.5像素才能进行下一个dib,因为已经移动了6个像素。
在另一种情况下则更为直接。
dist(已添加remn)失败remn=dist。
例如,如果我们有2个像素,从上一次我们增加了距离移动的鼠标说3像素,所以我们需要为下一个dib移动额外的2.5像素。

    int size =(Integer) tool.getAttribute("size");
        int step = (Integer) tool.getAttribute("step");
        double space = size*step/100.0f; //what is actualy need for the check algorithm for the step rate to work
        double dist = Point.distance(pZero.getX(),pZero.getY(),last.getX(),last.getY());
        int bleed = (int) (size/tilemap[0].getWidth()+size/tilemap[0].getHeight());
        Point2D.Double vec = new Point2D.Double(pZero.getX()-last.getX(),pZero.getY()-last.getY());
        vec.x /= dist;
        vec.y /= dist;
        dist+=remn;
        if(first){
            //System.out.println("First ");
            for(int y=0; y < tilesHigh; ++y) {
                for(int x=0; x < tilesWide; ++x) {

                    int pos = x+y*tilesWide;
                    // This should never exceed tilemap.length.
                    BufferedImage tile = tilemap[pos];
                    //tool.operate(tile.getGraphics(), new Point(pZero.x-x*tile.getWidth(), pZero.y-y*tile.getHeight()));
                    tool.operate(tile.getGraphics(), tilemapPointToTilePoint(pZero, pos));

                }
            }
            first = false;
        }else {
            if(dist>=space){//check to see if the mouse distance is enoght for a step(space)
                iter=space-remn;
                //test=0;
                //System.out.println("pZero="+pZero);
                while(iter<dist-remn){//fills the gap between with at the rate of step(space),if you move the mouse fast you use to get those
                    //do stuff
                    pZero.x =(int) Math.round(last.x + (vec.x*iter));
                    pZero.y =(int) Math.round(last.y + (vec.y*iter));
                    //int pos = xyToIndex(pZero.x, pZero.y);
                    //test++;
                    //System.out.println("iter = "+iter+" remn="+remn+" space="+space);
                    //System.out.println("pIter="+pZero);
                    //System.out.println("Second ");

                    for(int y=0; y < tilesHigh; ++y) {//bleed
                        for(int x=0; x < tilesWide; ++x) {
                            int pos = x+y*tilesWide;
                            // This should never exceed tilemap.length.
                            BufferedImage tile = tilemap[pos];
                            //tool.operate(tile.getGraphics(), new Point(pZero.x-x*tile.getWidth(), pZero.y-y*tile.getHeight()));
                            tool.operate(tile.getGraphics(), tilemapPointToTilePoint(pZero, pos));
                        }
                    }
                    iter += space;
                }
                //System.out.println("last = "+last);
                //System.out.println("test="+test);
                remn = dist-iter+space-remn;
            }else remn = dist;
        }

关于algorithm - 画笔压印算法/技术,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6095636/

10-09 12:39