Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何对照背景中的位图检查屏幕上鼠标的位置?(可可/目标C)_Objective C_Cocoa - Fatal编程技术网

Objective c 如何对照背景中的位图检查屏幕上鼠标的位置?(可可/目标C)

Objective c 如何对照背景中的位图检查屏幕上鼠标的位置?(可可/目标C),objective-c,cocoa,Objective C,Cocoa,我正在寻找一种方法来定义鼠标无法离开的屏幕区域。这个问题的回答者罗布·马约夫(rob mayoff)指导我,我可以使用石英事件点击来检测鼠标事件。这让我找到了解决这个问题的部分方法 我需要在屏幕上定义一个不规则的区域,而不仅仅是一个矩形,鼠标不能离开。我一直在研究这一点,我唯一能想到的是使用位图来定义不规则区域,因为它的形状非常奇怪。但是,我愿意使用位图以外的解决方案 因为这必须在Mac上完成,所以我决定必须使用objective C/Cocoa 我需要知道如何定义该区域,同样重要的是,如何找到

我正在寻找一种方法来定义鼠标无法离开的屏幕区域。这个问题的回答者罗布·马约夫(rob mayoff)指导我,我可以使用石英事件点击来检测鼠标事件。这让我找到了解决这个问题的部分方法

我需要在屏幕上定义一个不规则的区域,而不仅仅是一个矩形,鼠标不能离开。我一直在研究这一点,我唯一能想到的是使用位图来定义不规则区域,因为它的形状非常奇怪。但是,我愿意使用位图以外的解决方案

因为这必须在Mac上完成,所以我决定必须使用objective C/Cocoa

我需要知道如何定义该区域,同样重要的是,如何找到该区域中距离鼠标最近的点(这样,如果鼠标试图移动到该区域之外,我可以将鼠标移动到该区域)

这类似于禁区的外观:


如果可以将该区域表示为矩形的并集,则可以在每个矩形中找到最靠近鼠标点的点,然后其中一个点将是该区域的最近点。

将掩码加载到
NSBitmapImageRep
中。例如:

    mask = [NSBitmapImageRep imageRepWithData:[NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForImageResource:@"mask"]]];
根据面罩测试您的位置,如下所示:

- (BOOL)isAllowablePoint:(CGPoint)point
{
    if (point.x < 0 || point.y < 0 || point.x >= mask.pixelsWide || point.y >= mask.pixelsHigh)
        return NO;
    NSUInteger pixel[4];
    [mask getPixel:pixel atX:point.x y:point.y];
    return pixel[0] == 0;
}
-(BOOL)是允许点:(CGPoint)点
{
if(点x<0 | |点y<0 | |点x>=mask.pixelsWide | |点y>=mask.pixelsHigh)
返回否;
整数像素[4];
[mask getPixel:pixel atX:point.xy:point.y];
返回像素[0]==0;
}

确保您的遮罩图像以72 dpi保存。您可以通过在预览中打开图像来检查/修复此问题。选择“工具>调整大小”,并确保分辨率框显示72。

不幸的是,该区域的形状将平滑地圆化,如下所示:您描述的方法将找到该区域的点,该点与从T到p的线段相交,这是最接近T的。这不一定是最接近T的区域的点。是的,如果你有更好的算法/方程,请分享!我希望这能很好地工作,因为我会将鼠标移回那个点,所以T在开始时永远不会超过该区域外的几个像素。然而,如果用户移动鼠标非常快,它可能会离区域边缘大约100像素,这会使我的算法不那么漂亮。然而,现在,我能想到的唯一更好的方法是像a*这样的路径算法,我认为这是不值得的。