检测点是否在 SVG 路径内

2024-01-24

我正在尝试检测给定点是否位于 Objective-C 中的闭合 SVG 路径内。我不知道如何做数学。

我有一个路径的坐标,我想确定一个随机点是在路径内部还是外部。

这是路径坐标的示例:

"M673 460 c2 0 4 -1 5 -2 1 -1 2 -2 2 -4 0 -2 0 -3 0 -3 0 0 -3 1 -5 1 -3 1 -5 2 -5 3 0 1 0 3 0 4 1 0 2 1 3 1z:"

我知道 CoreGraphics 的containsPoint:方法,但我想避免使用这种方法。

我怎样才能通过编写自己的方法来做到这一点?

EDIT:

我试图避免containsPoint:因为该函数在使用时似乎在某些坐标/路径上崩溃。当它崩溃和不崩溃时,它看起来很随机。

以下是一些路径示例containsPoint:使应用程序崩溃:

"M661 446 c1 -1 3 -1 4 -1 1 -1 2 -2 2 -4 0 -2 0 -2 -2 -2 0 1 -2 1 -3 1 -2 0 -3 1 -3 2 0 1 0 2 0 3 0 0 1 1 2 1z" 
"M535 460 c0 0 1 -1 1 -2 1 -2 0 -3 -1 -3 0 0 -1 0 -2 1 0 1 0 2 0 3 1 0 1 1 2 1z" 

Xcode 用 and 中断EXC_BAD_ACCESS在程序集中由以下两个函数组成:get_y_inflections and get_cubic_coefficients.

EDIT 2:

我发布了一个新问题 https://stackoverflow.com/questions/12489988/containspoint-for-uibezierpath-crashes有关containsPoint:问题。


因此,由于我自己需要从曲线路径进行多边形/插值,我可能也有解决您问题的方法:

两个“公共”功能:

CGPathRef CGPathCreatePolygonPath(CGPathRef path, int quality);

创建仅包含线元素的路径,质量是曲线被分割成的段数

BOOL CGPathContainsPointInterpolated(CGPathRef path, const CGAffineTransform *m, CGPoint point, bool eoFill, int quality);

CGPathContainsPoint 和插值一步完成后,质量又是一条曲线被分割成的段数。

这是实现。

typedef struct {
    CGMutablePathRef path;
    int quality;
} InterpolationInfo;

static inline float cubeInterp(float t, float p0, float p1, float p2, float p3) {
    return powf(1-t, 3)*p0 + 3*powf(1-t, 2)*t*p1 + 3*(1-t)*powf(t, 2)*p2 + powf(t, 3)*p3;
}

static void pointsForCubeCurve(CGPoint cp0, CGPoint cp1, CGPoint cp2, CGPoint ep, CGPoint *buffer, int numberPoints) {
    for (int i = 0; i<numberPoints; i++) {
        float t = (i+1)/(float)numberPoints;
        buffer[i] = CGPointMake(cubeInterp(t, cp0.x, cp1.x, cp2.x, ep.x), cubeInterp(t, cp0.y, cp1.y, cp2.y, ep.y));
    }
}

static inline float quadInterp(float t, float p0, float p1, float p2) {
    return powf(1-t, 2)*p0 + 2*(1-t)*t*p1 + powf(t, 2)*p2;
}

static void pointsForQuadCurve(CGPoint cp0, CGPoint cp, CGPoint ep, CGPoint *buffer, int numberPoints) {
    for (int i = 0; i<numberPoints; i++) {
        float t = (i+1)/(float)numberPoints;
        buffer[i] = CGPointMake(quadInterp(t, cp0.x, cp.x, ep.x), quadInterp(t, cp0.x, cp.x, ep.x));
    }
}

static void CGPathElementConvertToPolygon(void *info, const CGPathElement *element) {
    InterpolationInfo *interpInfo = info;
    switch (element->type) {
        case kCGPathElementMoveToPoint:
            CGPathMoveToPoint(interpInfo->path, NULL, element->points[0].x, element->points[0].y);
            break;
        case kCGPathElementAddLineToPoint:
            CGPathAddLineToPoint(interpInfo->path, NULL, element->points[0].x, element->points[0].y);
            break;
        case kCGPathElementAddQuadCurveToPoint: {
            int nr = interpInfo->quality;
            CGPoint buffer[nr];
            pointsForQuadCurve(CGPathGetCurrentPoint(interpInfo->path), element->points[0], element->points[1], buffer, nr);
            for (int i = 0; i<nr; i++) {
                CGPathAddLineToPoint(interpInfo->path, NULL, buffer[i].x, buffer[i].y);
            }
            break;
        }
        case kCGPathElementAddCurveToPoint: {
            int nr = interpInfo->quality;
            CGPoint buffer[nr];
            pointsForCubeCurve(CGPathGetCurrentPoint(interpInfo->path), element->points[0], element->points[1], element->points[2], buffer, nr);
            for (int i = 0; i<nr; i++) {
                CGPathAddLineToPoint(interpInfo->path, NULL, buffer[i].x, buffer[i].y);
            }
            break;
        }
        case kCGPathElementCloseSubpath:
            CGPathCloseSubpath(interpInfo->path);
            break;
        default:
            break;
    }
}

static CGPathRef CGPathCreatePolygonPath(CGPathRef path, int quality) {
    CGMutablePathRef newPath = CGPathCreateMutable();
    InterpolationInfo info;
    info.path = newPath;
    info.quality = quality;
    CGPathApply(path, &info, CGPathElementConvertToPolygon);
    return newPath;
}

static BOOL CGPathContainsPointInterpolated(CGPathRef path, const CGAffineTransform *m, CGPoint point, bool eoFill, int quality) {
    CGPathRef polygon = CGPathCreatePolygonPath(path, quality);
    BOOL returnValue = CGPathContainsPoint(polygon, m, point, eoFill);
    CGPathRelease(polygon);
    return returnValue;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检测点是否在 SVG 路径内 的相关文章

  • 从 CocoaPods 添加 pod 时,架构 x86_64 的重复符号

    我正在尝试使用谷歌分析 https developers google com analytics devguides collection ios v3 进入我的应用程序 但通过 CocoaPod 添加后立即收到此错误 以前我的 Pod
  • SVG 元素出现在 DOM 中但在屏幕上不可见

    我尝试使用 SVG 绘制五线谱Vexflow http www vexflow com and 拉斐尔 js http raphaeljs com当我加载页面时 SVG 元素出现在 DOM 中 但它们不会出现在屏幕上 我检查了是否有任何 C
  • For 循环不适用于 JavaScript 动画

    我正在尝试编写一个 for 循环 以在单击形状按钮时重复 爆炸 路径的动画 但 for 循环无法工作 执行 而且我看不出哪里出了问题 for循环的目的 循环动画路径的过程 然后将动画反转回其原始路径 我知道问题出在 for 循环中的某个地方
  • CoreMediaIO,错误更新的属性 kCMIODevicePropertyDeviceIsRunningSomewhere

    当某些进程开始使用相机时 我需要接收一个事件 我通过 CMIOObjectGetPropertyData 完成此操作 但它不能正常工作 只有第一次访问时才是正确的值 我还尝试使用 CMIOObjectAddPropertyListenerB
  • UIAlertController 在 iOS 9 中不工作

    I have added the UIAlertController code showing login and password textfields it works for iOS 8 but in iOS 9 not works
  • 如何在iPhone应用程序中的类结构中实现主键和外键表数据[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 如何连接sqlite数据库中的两个表数据 if sqlite3 open dbPath UTF8String database SQL
  • 从视频创建缩略图 - 提高速度性能 - AVAsset - iPhone [重复]

    这个问题在这里已经有答案了 我正在使用基于以下线程中的代码的代码来生成视频缩略图 从 iPhone SDK 中的视频 URL 或数据获取缩略图 https stackoverflow com questions 1347562 gettin
  • 计算二维笛卡尔坐标中不规则形状的边界

    我正在寻找一种计算不规则形状边界的解决方案 Lats take a look at Square example 如果我有Minimum x and y and Maximum x and y like MaxX 5 MinX 1 MaxY
  • 如何求两个地点的经纬度距离?

    我有一组位置的纬度和经度 怎么找distance从集合中的一个位置到另一个位置 有公式吗 半正矢公式假定地球是球形的 然而 地球的形状更为复杂 扁球体模型会给出更好的结果 如果需要这样的精度 你应该更好地使用文森特逆公式 See http
  • Java制作一条有向线并使其移动

    我想画一条有向线并让它移动 我能够绘制一条有向线并移动该线 但当我移动该线时箭头会移位 这是我的绘画方法 Line2D Double line new Line2D Double startX startY endX endY g2d dr
  • 您是否标记 UIView 或将它们保留为属性?

    这主要是一个风格问题 但自从我开始为 iPhone 编程以来 我一直很好奇其他人的想法是什么 当您的 iPhone 应用程序中有一个 UIView 并且需要在应用程序的其他位置访问它时 通常在视图控制器中的另一个函数中 您是否喜欢用整数标记
  • 在 Objective-C 中比较 2 个字符串

    我写了以下代码 if depSelectedIndice gt 1 comSelectedIndice gt 1 NSLog depart elemet d depSelectedIndice NSLog depart elemet d c
  • NSString – 静态还是内联?有性能提升吗?

    如果我写的话会有任何性能提升吗 NSString helloStringWithName NSString name static NSString formatString Hello return NSString stringWith
  • 如何在 iOS 9 上可靠地检测是否连接了外部键盘?

    在 iOS 9 之前 确定是否连接外部键盘的最可靠方法是监听UIKeyboardWillShowNotification并使文本字段成为第一响应者 如中所述这个问题 https stackoverflow com questions 289
  • 计算三次贝塞尔曲线的弧长、曲线长度。为什么不工作?

    我正在用这个算法计算弧长 三次贝塞尔曲线的长度 function getArcLength path var STEPS 1000 gt precision var t 1 STEPS var aX 0 var aY 0 var bX 0
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 在 Objective C 的类方法中引用类本身

    我希望我没有跳过 ObjC 手册中的这一部分 但是是否可以从类的一个类方法中引用该类 就像在 PHP 中一样 您将使用 this 来引用当前实例 而 self 引用实例的类 this 的 ObjC 等价物将是 self 那么 PHP 的 s
  • ios水平居中约束问题?

    I am having hard time in learning constraints auto layout in iOS I have used any width any height I have a storyboard sc
  • 水平 UICollectionView 单行布局

    我正在尝试使用以下命令设置简单的水平布局UICollectionView 兜圈子却没有达到预期的结果 所以任何指针或例子将不胜感激 我粘贴经常更改的代码但没有成功可能没什么意义 该图像显示两行 第一行是单个项目 尺寸正确并且在中心正确对齐
  • PFQueryTableViewController 错误

    我正在遵循在线教程 使用 Parse 作为后端创建照片共享应用程序 我已经运行了两次教程 两次都从头开始创建应用程序 但在同一位置仍然出现相同的错误 我到处寻找解决方案 但仍然没有运气 我正在使用 PFQueryTableViewContr

随机推荐

  • 当设备方向改变时,UIWebview 中出现黑条

    我有一个 UIWebView 正在加载到另一个视图上 旋转时 纵向或横向的一切看起来都很好 但是当我处于纵向时 当我从纵向旋转到横向时 我通过捏或双击稍微放大 视图不会完全填充使用 uiwebview 右侧大约有 10 个像素变黑 如该屏幕
  • 使用 JavaScript 通过 websocket 进行视频流传输

    最快的直播方式是什么live使用 JavaScript 制作视频 TCP 上的 WebSockets 是否是足够快的协议来传输 30fps 的视频 TCP 上的 WebSockets 是否是足够快的协议来传输 30fps 的视频 是的 是的
  • TYPO3 扩展生成器多个图像上传不起作用

    我的目标是使用 TYPO3 7 6 2 版本中的扩展生成器创建扩展 我从扩展构建器文档创建了类别产品扩展 除了上传单个图像之外 它工作得很好 但我必须创建将多个图像添加到单个产品并在前端显示图像轮播的功能 但扩展生成器不适用于文件上传 我是
  • 组合连续原子变量的存储/加载

    参考 稍微过时的 paper http www open std org JTC1 SC22 WG21 docs papers 2007 n2338 html作者 Hans Boehm 在 原子操作 下 它提到内存模型 当时提出 不会阻止优
  • 使用 Swift 强制 NSLocalizedString 使用特定语言

    通过 swift 我如何强制我的应用程序从特定的 Localized strings 读取数据 我在实例化 ViewController 之前将其放入 didFinishLaunchingWithOptions 中 但它仍然以英语显示应用程
  • 斯威夫特3;范围“超出范围”

    我刚刚将 Xcode 更新到 8 0 beta 2 和 swift 3 0 从 swift 2 3 更新后 我遇到了很多错误 我有一个字符串扩展 它将 self 字符串中的范围转换为 NSRange extension String fun
  • 为什么我应该用 c++ 而不是 c 设置插件接口

    由于我的previous https stackoverflow com questions 1054697 why isnt my new operator called 问题 https stackoverflow com questi
  • C# 将图像从 PowerPoint 复制到 Word

    我需要一个应用程序将文本和图像从 PowerPoint 复制到 Word 我使用这个库 Microsoft Office Interop PowerPoint 和 Microsoft Office Interop Word 文本很容易传输
  • Android 不同屏幕尺寸的布局

    我正在为 Android 应用程序的布局而苦苦挣扎 我为不同的屏幕尺寸定义了不同的布局 当前的布局目录结构是这样的 layout 布局土地 小布局 布局 xlarge 布局 xlarge 土地 Problem 主要布局目录文件正在显示3 7
  • 联系表格 Laravel 4

    我是 Laravel 4 的菜鸟 联系表单给我带来了一些麻烦 发现了一些东西 全部都使用控制器 但我只需要在路线中使用它 如何创建简单的联系表单 姓名 电子邮件和消息 的路由以将数据发送到管理员电子邮箱 Cheers 这是一种仅使用您的路由
  • 使用 Google 脚本删除电子表格中的空白行

    Spreadsheet 1 Spreadsheet 1 中存在的数据 Name apple android windows linux Germany 3 4 6 7 America 4 1 6 2 Sweden 1 6 1 6 Paris
  • 在C中将字符数字转换为相应的整数

    C语言中有没有办法将字符转换为整数 例如 从 5 to 5 根据其他回复 这很好 char c 5 int x c 0 另外 为了进行错误检查 您可能希望首先检查 isdigit c 是否为 true 请注意 您不能完全便携地对字母执行相同
  • 迭代除 x item 之外的字典

    我有一个这种格式的字典 d data key 1 value 1 key 2 value 2 key 3 value 3 key x value x key n value n 我必须迭代它的项目 for key value in colu
  • 如何区分 Switch,Checkbox 值是由用户更改还是以编程方式(包括通过保留)更改?

    setOnCheckedChangeListener new OnCheckedChangeListener Override public void onCheckedChanged CompoundButton buttonView b
  • 在knockout js中将循环结构转换为JSON

    我有两个网格结构 在其中一个网格结构中我多次有多个字段 而在其中一个网格结构中我一次有两个字段 我为每个网格编写 apply 方法 我的第一个网格 id 工作正常 但是当我单击第二个网格上的 应用 时 我收到此错误 Uncaught Typ
  • 在 C++ 软件中纳入共享软件限制

    我希望在共享软件的基础上实现我的软件 以便用户 给予最多 例如 30 天的试用期来试用该软件 购买时 我打算向用户提供一个随机生成的密钥 输入该密钥时 再次启用该软件 我以前从未走过这条路 所以任何建议 反馈或关于如何完成此操作的 标准 方
  • 避免重新计算 Beam Python SDK 中所有云存储文件的大小

    我正在开发一个从 Google Cloud Storage GCS 目录读取约 500 万个文件的管道 我已将其配置为在 Google Cloud Dataflow 上运行 问题是 当我启动管道时 需要几个小时 计算所有文件的大小 INFO
  • 找不到 pyinstaller 命令

    我在 VirtualBox 上使用 Ubuntu 我该如何添加pyinstaller to the PATH 问题是当我说 pyinstaller file py 它说找不到 pyinstaller 命令 它说它安装正确 根据其他帖子 我认
  • 删除 X-Powered-By

    如何删除 PHP 中的 X Powered By 标头 我在 Apache 服务器上 使用 php 5 21 我无法在 php 中使用 header remove 函数 因为 5 21 不支持它 我使用了 Header unset X Po
  • 检测点是否在 SVG 路径内

    我正在尝试检测给定点是否位于 Objective C 中的闭合 SVG 路径内 我不知道如何做数学 我有一个路径的坐标 我想确定一个随机点是在路径内部还是外部 这是路径坐标的示例 M673 460 c2 0 4 1 5 2 1 1 2 2