Algorithm 画笔冲压算法/技术

Algorithm 画笔冲压算法/技术,algorithm,paint,Algorithm,Paint,我在玩弄一种小油漆。我想创建不同的画笔尖(不仅仅是简单的线条)。其基本思想是沿着鼠标移动重复(冲压)刷尖。因为鼠标移动不会为鼠标移动的每个像素分派所需的事件。 我目前的方法是使用Bresenham算法对我想要绘制的像素进行geht,然后在每个像素上标记笔刷尖端。然而,这不是很有效,因为刷尖是例如30x30 px。我想在25%的刷宽度印章,但我不知道这是如何在一个好的方式做。我可以检测到距离,并且只在达到25%刷尖距离之前盖章 还有其他想法如何实现冲压笔刷算法,该算法考虑不规则鼠标事件并允许定义间

我在玩弄一种小油漆。我想创建不同的画笔尖(不仅仅是简单的线条)。其基本思想是沿着鼠标移动重复(冲压)刷尖。因为鼠标移动不会为鼠标移动的每个像素分派所需的事件。 我目前的方法是使用Bresenham算法对我想要绘制的像素进行geht,然后在每个像素上标记笔刷尖端。然而,这不是很有效,因为刷尖是例如30x30 px。我想在25%的刷宽度印章,但我不知道这是如何在一个好的方式做。我可以检测到距离,并且只在达到25%刷尖距离之前盖章

还有其他想法如何实现冲压笔刷算法,该算法考虑不规则鼠标事件并允许定义间距


谢谢你的阅读

Brasenham是一种近似算法,因为您已经在进行近似而不是混叠,所以您可以更进一步

稍微修改一下算法,将画笔宽度作为参数(或者更好的是打印距离):

  • 阈值是打印距离*矢量方向乘数(45135225315度=sqrt(2))
  • 而不是在X、Y处绘制像素->计数像素
  • 当pixelCount>=阈值打印笔刷位于X、Y位置并重置pixelCount时
对计数器使用浮点,如果像素不是正方形,则为每一步经过的deltaY或deltaX添加不同的量,并考虑从x1,y1到x2,y2的矢量方向,以获得每个像素要添加的实际距离


非常简单的修改…

回答有点晚,但如果有人在这里搜索答案,我将在java项目代码中实现它

步长是画笔的百分比,因此如果是20x20画笔,则25步长是5像素,即空间

然后,我从鼠标的最后一个和当前位置创建一个规范化向量

在第一次单击的
之后。
当距离大于空间时,需要一个迭代器来处理所有距离,因为有时鼠标可以快速移动,因此有多个DIB(或“stamps”,DIB是该域中的术语)

iter=space remn
用于将其与先前的dib对齐

添加了
向量*iter
的上一个位置为我们获取dib的位置

在我们把它们都画出来之后,重要的部分就来了

remn=dist iter+space remn余数(remn)是从添加到初始阶段的距离(dist)的前一个进程中收集的

为了理解数学,让我们举个例子

刷子=30x30,步长=25%,remn=2.5,距离=28.5(包括remn),间距=7.5(30*25/100)

下一个remn=28.5(dist)-27.5(5开始时+7.5*3次,自检查(=空格){//检查鼠标距离是否适合一步(空格) iter=空间remn; //测试=0; //System.out.println(“pZero=“+pZero”);
while(iterI想用画笔笔尖的百分比表示阈值。我想用画笔笔尖的像素宽度(=打印距离)作为阈值。但是,我很难理解为什么要用矢量方向乘数乘以打印距离(这是什么?)。你能解释一下吗?谢谢!
    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;
        }