gpt4 book ai didi

macos - Cocoa NSPoint 到 Quartz NSPoint - 翻转 Y 坐标

转载 作者:行者123 更新时间:2023-12-03 17:47:12 26 4
gpt4 key购买 nike

在 macOS 编程中,我们知道

  • Quartz 使用原点 (0, 0) 位于主显示屏左上角的坐标空间。增加 y 会下降。
  • Cocoa 使用一个坐标空间,其中原点 (0, 0) 位于主显示屏的左下角,并且 y 增大而向上。

现在我使用 Quartz API - CGImageCreateWithImageInRect 来裁剪图像,它采用矩形作为参数。该矩形的 Y 原点来自 Cocoa 的 mousedown 事件。

因此我在倒置的位置得到裁剪......

我尝试使用这段代码来翻转cropRect中的Y坐标

 //Get the point in MouseDragged event
NSPoint currentPoint = [self.view convertPoint:[theEvent locationInWindow] fromView:nil];
CGRect nsRect = CGRectMake(currentPoint.x , currentPoint.y,
circleSizeW, circleSizeH);
//Now Flip the Y please!
CGFloat flippedY = self.imageView.frame.size.height - NSMaxY(nsRectFlippedY);
CGRect cropRect = CGRectMake(currentPoint.x, flippedY, circleSizeW, circleSizeH);

但是对于顶部的区域,我错误的 FlippedY 坐标。如果我单击 View 顶部边缘附近,我会得到 FlippedY = 510 到 515在顶部边缘,它应该在 0 到 10 之间:-|

有人能给我指出正确可靠的 Flip 方法吗在这种情况下的Y坐标?谢谢!

这是 GitHub 中突出显示该问题的示例项目 https://github.com/kamleshgk/SampleMacOSApp

ISSUE Screenshot

最佳答案

正如 Charles 提到的,您使用的 Core Graphics API 需要相对于图像(而不是屏幕)的坐标。重要的是将事件位置从窗口坐标转换为与图像位置最接近的 View ,然后相对于同一 View 的边界(而不是框架)翻转它。所以:

NSView *relevantView = /* only you know which view */;
NSPoint currentPoint = [relevantView convertPoint:[theEvent locationInWindow] fromView:nil];
// currentPoint is in Cocoa's y-up coordinate system, relative to relevantView, which hopefully corresponds to your image's location

currentPoint.y = NSMaxY(relevantView.bounds) - currentPoint.y;
// currentPoint is now flipped to be in Quartz's y-down coordinate system, still relative to relevantView/your image

关于macos - Cocoa NSPoint 到 Quartz NSPoint - 翻转 Y 坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51504481/

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