gpt4 book ai didi

android - 使用 Android 的 Canvas 中两条路径之间的交集

转载 作者:太空狗 更新时间:2023-10-29 14:08:05 29 4
gpt4 key购买 nike

我在 Canvas 中添加了 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 个 Rect,而不是预期的 9 个。如何确定与红色区域相交的 Rects?。

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

最佳答案

看起来您正在以全部重叠的方式定义矩形,并且您的前几个矩形可能是宽度为 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,通过增减来移动整个矩形集合。

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

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

关于android - 使用 Android 的 Canvas 中两条路径之间的交集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31257923/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com