使用Android在画布中的两个路径之间的交叉

时间:2015-07-07 00:32:38

标签: android android-canvas

我在画布中添加49个Rects以及在ArrayList中存储每个Rect的区域:

private void addCoordinates(){
    if (regions.size() > 0) {
        regions.clear();
    }
    Paint xpaint = new Paint();
    xpaint.setColor(Color.LTGRAY);
    xpaint.setStyle(Paint.Style.STROKE);
    xpaint.setStrokeWidth(10);
    for (int j=1;j<8;j++){
        for (int i=1;i<8;i++){
            Region reg = new Region();
            Path p = new Path();
            RectF rect = new RectF();
            rect.set(0, Calculations.convertscale(scale,(float) 91.43 * i), Calculations.convertscale(scale,(float) 91.43 * j), 0);
            canvas.drawRect(rect, xpaint);          
            p.computeBounds(rect, true);
            reg.setPath(p, new Region((int) rect.left, (int) rect.top, (int) rect.right, (int) rect.bottom)); 
            regions.add(reg);
        }
    }
}

然后我通过剪切每个圆圈的路径在四个圆圈之间绘制一个相交的区域:

 private void interSection(){

    canvas.clipPath(pathA, Region.Op.INTERSECT);
    canvas.clipPath(pathB, Region.Op.INTERSECT);  
    canvas.clipPath(pathC, Region.Op.INTERSECT);
    canvas.clipPath(pathD, Region.Op.INTERSECT);

    canvas.drawPath(pathA, mPaint);
    canvas.drawPath(pathB, mPaint);
    canvas.drawPath(pathC, mPaint);
    canvas.drawPath(pathD, mPaint);       

    drawingImageView.invalidate();
}

我的任务是知道实际上与绘制区域相交的49个Rect中的哪一个,如下面的屏幕截图所示:

enter image description here

我尝试过下面的代码块,但它给了我所有49个Rect而不是9个预期。如何确定与红色区域相交的Rect?

private void checkRectangles() {
    int size = regions.size();
    for (Region reg:regions){
        Path path = reg.getBoundaryPath();
        if (path.op(path, pathA, Path.Op.INTERSECT)){
            count++;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

看起来你正在以一种它们都重叠的方式定义你的矩形,你的前几行可能是0宽的垂直线。以下内容应该有效:

RectF rects[][] = new RectF[rows][columns]; // rows & columns are global vars
//(next part goes in your addCoordinates)
for (int i=0; i<rows, i++) {
    for (int j=0; j<columns, j++) {
        canvas.drawRect(rects[i][j], paint);
    }
}
//(next part I wrote as a separate method; could be more useful that way)
private void setupRects(float scale) {
    for (int j=0; j<rows, j++) {
        for (int i=0; i<columns, i++) {
            //note: I usually index from 0 to length instead of from 1 to length+1
            rects[i][j] = new RectF(i*scale,j*scale,(i+1)*scale,(j+1)*scale);
        }
    }
}
/* Example output, with scale of 1:
 * rects[0][0] goes from (0,0) to (1,1)
 * rects[0][1] goes from (1,0) to (2,1)
 * rects[7][7] goes from (7,7) to (8,8)
 */

我之前没有使用过交叉功能,但似乎&#34;工作&#34;根据您之前对矩形的定义,它应该按照预期的方式工作&#34;建议的更改。

为简单起见,我的算法会创建相互接触的矩形。要实现间距,您可以修改方程式,也可以只覆盖一堆线。

如果有用,您可以考虑使用以下方法使等式更加稳健:

RectF(X0+i*scale,Y0+j*scale,X0+(i+1)*scale,Y0+(j+1)*scale);

事先,你可以定义X0 = 0和Y0 = 0,然后增加或减少它们以移动整个矩形集合。

为了好玩,您可能想尝试制作自己的交叉算法。通过一些工作,您可以找出曲线部分的方程式。为简单起见,您可以将每个矩形减少到五个点(角点+中心点),然后测试是否有任何点位于曲线方程中。如果是这样,那么你有一个交集!

实际上,现在我想起来了,你可能会忘记绘制矩形,只是做一个线条的叠加,这将给出一堆矩形的外观。您是否这样做取决于您的总体目标。在这种情况下,您要测试哪些线与形状相交,然后适当地解释结果。