如何检测UIImage的非透明部分何时与UIImage的另一个不透明部分接触

我很难完成一些我认为会更容易的事情。 我试图运行一个方法,只要UIImage中的图片的非透明部分触及UIImage中包含的图像的另一个不透明的部分。 我列举了一个例子来帮助进一步解释我的问题。

我的问题的一个视觉例子

正如你在上面的图片中看到的,我有两个都在UIImage中的三angular形。 三angular形都是PNG图片。 只有三angular形是可见的,因为背景是透明的。 这两个UIImage都在UIImageView中。 我希望能够在三angular形的可见部分接触另一个三angular形的可见部分时运行方法。 有人可以帮帮我吗?

这个问题的蛮力解决scheme是为每个图像创build一个bool s二维数组,其中每个数组条目对于不透明像素是true的,对于透明像素是false的。 如果CGRectIntersectsRect返回true(表示可能的碰撞),则代码扫描两个数组(根据相对位置使用适当的偏移)以检查实际的碰撞。 这变得复杂,计算密集。

蛮力方法的一个替代方法是使用OpenGLES来完成所有的工作。 这仍然是一个蛮力的解决scheme,但它把工作交给了GPU,在这样的情况下,它更好。 我不是OpenGLES的专家,所以我会把细节留给其他人。

第二种select是对问题进行限制,使问题更容易解决。 例如,给定两个三angular形A和B,碰撞只能发生在A的顶点之一包含在B的区域内,或者B的顶点之一在A中。这个问题可以使用UIBezierPath类来解决在目标-C。 UIBezierPath可以用来创build一个三angular形的path。 然后可以使用UIBezierPath的containsPoint:方法来检查对angular三angular形的顶点是否包含在目标三angular形的区域中。

总之,解决scheme是为每个对象添加一个UIBezierPath属性。 初始化UIBezierPath以近似对象的形状。 如果CGRectIntersectsRect指示可能发生碰撞,则使用containsPoint:方法检查一个对象的顶点是否包含在另一个对象的区域中。

我做的是:

  • 计算图像A中非alpha像素的数量
  • 对于图片B也是一样的
  • 将A + B图像合并成一个图像:C
  • 比较得到的像素数

如果合并后像素数量less,那么我们有一个命中。

如果(C.count <A.count + B.count) – >我们有一个命中

 + (int)countPoints:(UIImage *)img { CGImageRef cgImage = img.CGImage; NSUInteger width = img.size.width; NSUInteger height = img.size.height; CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); size_t bitsPerComponent = 8; size_t bytesPerPixel = 1; size_t bytesPerRow = width * bitsPerComponent * bytesPerPixel; size_t dataSize = bytesPerRow * height; unsigned char *bitmapData = malloc(dataSize); memset(bitmapData, 0, dataSize); CGContextRef bitmap = CGBitmapContextCreate(bitmapData, width, height, bitsPerComponent, width, NULL,(CGBitmapInfo)kCGImageAlphaOnly); CGColorSpaceRelease(colorSpace); CGContextTranslateCTM(bitmap, 0, img.size.height); CGContextScaleCTM(bitmap, 1.0, -1.0); CGContextDrawImage(bitmap, CGRectMake(0, 0, width, height), cgImage); int p = 0; int i = 0; while (i < width * height) { if (bitmapData[i] > 0) { p++; } i++; } free(bitmapData); bitmapData = NULL; CGContextRelease(bitmap); bitmap = NULL; //NSLog(@"points: %d",p); return p; } + (UIImage *)marge:(UIImage *)imageA withImage:(UIImage *)imageB { CGSize itemSize = CGSizeMake(imageA.size.width, imageB.size.width); UIGraphicsBeginImageContext(itemSize); CGRect rect = CGRectMake(0, 0, itemSize.width, itemSize.height); [imageA drawInRect:rect]; [imageB drawInRect:rect]; UIImage *overlappedImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return overlappedImage; }