使用Android在画布上找到两条路径的交点

3

我在画布中添加了 49 个 Rect,并将每个 Rect 的区域存储在 ArrayList 中:

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个矩形实际上与下面屏幕截图中所绘制的区域相交:

enter image description here

我已经尝试了下面的代码块,但它给出了全部的49个矩形,而不是期望的9个。如何确定与红色区域相交的矩形?

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个回答

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)
 */

我以前从未使用过intersect函数,但它似乎可以与您之前定义的矩形“配合”,所以在建议更改后应该“按预期工作”。
为简单起见,我的算法创建相互接触的矩形。要实现间距,您可以修改方程或覆盖一堆线。
如果有用,您可以考虑使等式更加健壮:
RectF(X0+i*scale,Y0+j*scale,X0+(i+1)*scale,Y0+(j+1)*scale);

事先,您可以定义X0=0和Y0=0,并增加或减少它们以移动整个矩形集合。
如果想要有趣的话,您可以尝试创建自己的相交算法。通过一些工作,您可以找出曲线部分的方程。为了简单起见,您可以将每个矩形缩小到五个点(角点+中心点),然后测试任何点是否位于曲线方程内。如果是,则存在交点!
实际上,现在我想起来了,您可以忘记绘制矩形,只需叠加线条即可,这将呈现出一堆矩形的外观。是否这样做取决于您的总体目标。在这种情况下,您将测试哪些线与形状相交,然后适当解释结果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接