tangguo

如何判断封闭路径是否包含给定点?

java

在Android中,我有一个Path对象,我碰巧知道它定义了一条闭合路径,因此我需要弄清楚路径中是否包含给定点。我所希望的是一些类似的东西

path.contains(int x,int y)

但这似乎并不存在。

我要这样做的特定原因是因为我在屏幕上有一组形状定义为路径,并且我想弄清楚用户单击了哪个形状。如果有更好的方法来解决这一问题,例如使用不同的UI元素,而不是自己“艰难地”进行操作,我愿意提出建议。

如果需要的话,我愿意自己编写算法,但这意味着我猜需要进行不同的研究。


阅读 270

收藏
2020-10-20

共1个答案

小编典典

本android.graphics.Path类没有这样的方法。Canvas类确实具有可以设置为路径的剪切区域,无法针对某个点对其进行测试。您可以尝试Canvas.quickReject,针对单点矩形(或1x1Rect)进行测试。我不知道这是否真的会检查路径还是仅检查封闭的矩形。

Region类显然只跟踪包含的矩形。

您可以考虑将每个区域绘制到一个8位的alpha层位图中,并在每个区域中Path填入自己的“颜色”值(确保在中关闭了抗锯齿功能Paint)。这为每个填充有填充路径的索引的路径创建了一种掩码。然后,您可以仅使用像素值作为路径列表的索引。

Bitmap lookup = Bitmap.createBitmap(width, height, Bitmap.Config.ALPHA_8);
//do this so that regions outside any path have a default
//path index of 255
lookup.eraseColor(0xFF000000);

Canvas canvas = new Canvas(lookup);
Paint paint = new Paint();

//these are defaults, you only need them if reusing a Paint
paint.setAntiAlias(false);
paint.setStyle(Paint.Style.FILL);

for(int i=0;i<paths.size();i++)
    {
    paint.setColor(i<<24); // use only alpha value for color 0xXX000000
    canvas.drawPath(paths.get(i), paint); 
    }

然后查点

int pathIndex = lookup.getPixel(x, y);
pathIndex >>>= 24;

如果有未填充的点,请确保检查255(无路径)。

2020-10-20