在 Objective-C 中使用 C 函数(适用于 iPhone)

2024-01-20

'大家好。我自称是 iPhone 编程新手(拥有更长的 Perl 和 Web 背景——30 年)……但上周我冒险买了几本好书。在死记硬背并阅读了 1000 多页之后,并且对它有了很好的理解之后,我已经朝着第一个优秀的原生 iPhone 应用程序迈进了。我的问题是这样的:我不知道如何在 Objective-C 中执行简单的地理(纬度/经度)多边形点例程。我有两种方法可以做到这一点。一个用 C 语言编写(第一个代码示例),一个用 JavaScript 语言编写(第二个代码示例):

// this is the poly.h file

int pnpoly(int nvert, float *vertx, float *verty, float testx, float testy);


// this is the poly.c file

#include "poly.h"
int pnpoly(int nvert, float *vertx, float *verty, float testx, float testy){
 int i, j, c = 0;
 for (i = 0, j = nvert-1; i < nvert; j = i++) {
 if ( ((verty[i]>testy) != (verty[j]>testy)) &&
  (testx < (vertx[j]-vertx[i]) * (testy-verty[i]) / (verty[j]-verty[i]) + vertx[i]) )
    c = !c;
 }
 return c;
}

或者这个(在 JavaScript 中):

function _isPointInPoly(poly, pt){
 for(var c = false, i = -1, l = poly.length, j = l - 1; ++i < l; j = i)
  ((poly[i].y <= pt.y && pt.y < poly[j].y) || (poly[j].y <= pt.y && pt.y < poly[i].y))
  && (pt.x < (poly[j].x - poly[i].x) * (pt.y - poly[i].y) / (poly[j].y - poly[i].y) + poly[i].x)
  && (c = !c);
 return c;
}

(如果我能让它们转换,任何一个都可以)

所以,为了尝试这个...我将 .h 文件和 .c 文件与我的 iPhone 项目一起放入 xcode 中。现在唯一的问题是如何从 Objective-C 调用它并获得结果..:)

顺便说一句:我昨晚搜索了大神谷歌来得到这个问题的答案,但只是尝试搜索“在 Objective-C iPhone 应用程序中包含 C”等等。你得到了很多条目,但没有一个与此有关! :) 只是让你知道我在发帖之前尝试过谷歌。

好吧,我的问题:

  1. 如何从 Objective-C 调用 pnpoly?
  2. 我使用什么类型来称呼它? (int 很好,但是 float *vertx 显然是一个浮点数组.. NSArray 没有 ——我能找到)

(编辑:这里有更多信息。我正在寻求帮助构建也将被传递的数组)

这个问题没有被完全问清楚。

例程(在 Objective-C 中)将如下所示:(假设编码正确)

NSMutableArray *latitudeArray = [[NSMutableArray alloc] init];
NSMutableArray *longitudeArray = [[NSMutableArray alloc] init];

// coordinates surrounding 1 inifite loop.

[latitudeArray addObject:@"37.32812557141369"];
[longitudeArray addObject:@"-122.0320253896318"];
[latitudeArray addObject:@"37.32821852349916"];
[longitudeArray addObject:@"-122.0289014325174"];
[latitudeArray addObject:@"37.33021046381746"];
[longitudeArray addObject:@"-122.0289300638158"];
[latitudeArray addObject:@"37.33042111092124"];
[longitudeArray addObject:@"-122.0279574092159"];
[latitudeArray addObject:@"37.33395972491337"];
[longitudeArray addObject:@"-122.0279263955651"];
[latitudeArray addObject:@"37.33363270879559"];
[longitudeArray addObject:@"-122.0320527775551"];
[latitudeArray addObject:@"37.32812557141369"];
[longitudeArray addObject:@"-122.0320253896318"];


int nvert = [[latitudeArray count] intvalue];

// 37.33189399206268 x -122.0296274412866 should return true

float testx =37.33189399206268;
float testy =-122.0296274412866;

int y_or_n = pnpoly(int nvert, float *vertx, float *verty, float testx, float testy);

我应该明确表示我正在学习 Objective-c,但发现了 C 例程 - 所以不确定如何构造调用它的 C 变量或调用它的例程。

我知道这要求很高……但这对我来说真的很困惑。谁能帮我? 非常感谢。

Jann


你可以直接调用它。 Objective-C 只是 C API 的前端,也是一种将方法重写为函数的方法(无论如何,达到某种近似值......),因此您可以像在 C 代码中一样调用 C 函数。

- (int)doWhatever {
  // ...
  int hitTest = pnPoly(/*blah*/);
  return hitTest;
}

您也可以在 Objective-C 中使用 C 基元类型(例如 int 和 float),而不会出现问题。所以用浮点数调用该函数:)。如果您需要将这些值存储在像 NSArray 这样的 Foundation 集合类中,那么您可以将它们包装在一个名为 NSNumber 的类中。

NSNumber *someFloat = [NSNumber numberWithFloat: f];
float usefulValue = [someFloat floatValue];
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Objective-C 中使用 C 函数(适用于 iPhone) 的相关文章

  • 使用 C# 和 ASP.NET 在电子邮件附件中发送 SQL 报告

    我正在尝试使用 ASP NET 和 C 从 sql reportserver 2008 作为电子邮件附件发送报告 到目前为止我学会了如何获取 PDF 格式的报告 http weblogs asp net srkirkland archive
  • JavaScript 错误:MVC2 视图中的条件编译已关闭

    我试图在 MVC2 视图页面中单击时调用 JavaScript 函数 a href Select a JavaScript 函数 function SelectBenefit id code alert id alert code 这里 b
  • C# 根据当前日期传递日期时间值

    我正在尝试根据 sql server 中的两个日期获取记录 Select from table where CreatedDate between StartDate and EndDate我通过了5 12 2010 and 5 12 20
  • Libev,如何将参数传递给相关回调

    我陷入了 libev 中争论的境地 通常 libev 在类似的函数中接收包 接收回调 没关系 但是实际操作中 我们需要派遣一个亲戚 写回调 根据收到的包裹处理具体工作 例如 S RECV MSG pstRecvMsg S RECV MSG
  • 来自嵌入图像的 BitmapSource

    我的目标是在 WPF 窗口上重写 OnRender 方法中绘制图像 someImage png 它是嵌入资源 protected override void OnRender System Windows Media DrawingCont
  • 测量进程消耗的 CPU 时钟

    我用 C 语言编写了一个程序 它是作为研究结果创建的程序 我想计算程序消耗的确切 CPU 周期 精确的循环次数 知道我怎样才能找到它吗 The valgrind tool cachegrind valgrind tool cachegrin
  • admob ios7错误音频框架

    我正在将 admob SDK 当前的 集成到我的上一个应用程序 IOS7 Xcode5 中 并且出现了一个新错误 在新项目上也是如此 我想我错过了一些东西 但我多次重新启动该过程 但错误仍然存 在 Undefined symbols for
  • LinkLabel 无下划线 - Compact Framework

    我正在使用 Microsoft Compact Framework 开发 Windows CE 应用程序 我必须使用 LinkLabel 它必须是白色且没有下划线 因此 在设计器中 我将字体颜色修改为白色 并在字体对话框中取消选中 下划线
  • 以编程方式创建 Blob 存储容器

    我有一个要求 即在创建公司时 在我的 storageaccount 中创建关联的 blob 存储容器 并将容器名称设置为传入的字符串变量 我已尝试以下操作 public void AddCompanyStorage string subDo
  • 如何使用 MonoTouch 在 UIKeyboard 之上添加 UIToolbar?

    我按照 Obj C 中的示例进行操作定制 iPhone 键盘 https stackoverflow com questions 1610542 custom iphone keyboard 1612549 1612549但是 为了在 Wi
  • Unity3D - 将 UI 对象移动到屏幕中心,同时保持其父子关系

    我有一个 UI 图像 它的父级是 RectTransform 容器 该容器的父级是 UI 面板 而 UI 面板的父级是 Canvas 我希望能够将此 UI 图像移动到屏幕中心 即画布 同时保留父级层次结构 我的目标是将 UI 图像从中心动画
  • 应用程序仅启用纵向,但 UIImagePickerController 在 iOS6 中旋转

    请注意 下面的答案 不适用于 iOS6 所以我仍然需要答案 我的应用程序仅启用纵向模式 但是 如果我将 UIImagePickerController 作为子视图嵌入其中 并旋转设备 则顶部和底部栏将保持在同一位置 但 UIImagePic
  • 如何在没有 MFMessageComposeViewController 的情况下发送和接收短信?

    我想发送和接收短信而不显示MFMessageViewController从我的申请中 有人能告诉我这怎么可能吗 不可能 除非您使用第 3 方 api 发送 接收短信
  • 如何高效计算连续数的数字积?

    我正在尝试计算数字序列中每个数字的数字乘积 例如 21 22 23 98 99 将会 2 4 6 72 81 为了降低复杂性 我只会考虑 连续的数字 http simple wikipedia org wiki Consecutive in
  • 如何从 Windows Phone 7 模拟器获取数据

    我有一个 WP7 的单元测试框架 它在手机上运行 结果相当难以阅读 因此我将它们写入 XDocument 我的问题是 如何才能将这个 XML 文件从手机上移到我的桌面上 以便我可以实际分析结果 到目前为止 我所做的是将 Debugger B
  • iOS 11 中的密码自动填充快速输入栏

    iOS 11 中引入了一项新功能 应用程序密码自动填充 此功能允许用户直接从键盘快速输入栏使用其应用程序中保存的密码 https techcrunch com 2017 06 08 ios 11s new password autofill
  • GCD 与自定义队列

    我想知道这两者的性能有什么区别 dispatch async dispatch get global queue DISPATCH QUEUE PRIORITY HIGH 0 perform complex operation dispat
  • 如何组合两个 lambda [重复]

    这个问题在这里已经有答案了 可能的重复 在 C 中组合两个 lambda 表达式 https stackoverflow com questions 1717444 combining two lamba expressions in c
  • 声明一个负长度的数组

    当创建负长度数组时 C 中会发生什么 例如 int n 35 int testArray n for int i 0 i lt 10 i testArray i i 1 这段代码将编译 并且启用 Wall 时不会出现警告 并且似乎您可以分配
  • 如何为有时异步的操作创建和实现接口

    假设我有数百个类 它们使用 计算 方法实现公共接口 一些类将执行异步 例如读取文件 而实现相同接口的其他类将执行同步代码 例如将两个数字相加 为了维护和性能 对此进行编码的好方法是什么 到目前为止我读到的帖子总是建议将异步 等待方法冒泡给调

随机推荐

  • 如何混合 Singleton 来创建一个接受初始化参数的类?

    我已经了解了如何将类定义为单例 如何在 Ruby 中创建单例 https stackoverflow com questions 4677 how do i create a class using the singleton design
  • 如何通过自动布局功能使 TableView 高度动态化?

    我在 Xcode 5 中使用自动布局 我将表视图的高度设置为大于或等于 200px 我希望它具有动态大小 因为有时它会有很多行 有时它会有几行 但尺寸始终为 200px 如果内容大于此值 我应该向下滚动以查看下面的行 What should
  • 获取连接到服务器的在线用户的名称

    我是 ASP NET 新手 我经历过这个link http www aspdotnetfaq com Faq How to show number of online users visitors for ASP NET website a
  • 从通知可分割对象中读取内容以进行后续通知

    我正在尝试构建 Whatsapp 通知过滤应用程序 在其中监视来自 Whatsapp 的所有通知并根据过滤策略删除消息 我可以使用下面的链接代码获取消息内容从 Parcelable contentView 或 contentIntent 中
  • 自动验证 htaccess (401) 用户名​​密码登录

    我有一个网页 每 5 分钟刷新一次 其中包含客户详细信息 我通过基本和标准 htaccess 和 htpassword 文件类型登录系统向其添加了用户名密码 因为文件的一部分包含公司数据 但我需要在我的工作电脑上打开相同的网页 该电脑是连接
  • 为什么需要在 ERD 中指出识别或非识别关系?

    在 ERD 中 弱 非识别关系是连接两个强实体的关系 并用虚线表示 强 标识关系是将强实体连接到弱实体的一种关系 弱实体是包含来自其相关实体的外键 FK 作为其自身主键 PK 的组成部分的关系 并指示通过实线 我的问题是 所以呢 为什么区分
  • Click() 方法并不总是有效

    我在 Selenium WebDriver 中进行测试时遇到问题 这Click当程序尝试单击按钮时 事件并不总是有效 在一项测试中一切正常 而在其他测试中则不然 每个测试都从一页开始 首先 用户必须从一个选项中选择一个select组件 然后
  • 检查文件扩展名

    我正在使用以下 PowerShell 代码 我需要在 if 条件下检查其扩展名 foreach line in lines extn line Split 1 if extn eq xml 有没有一种简单的方法来检查 PowerShell
  • 引用分支中switch语句的值

    Swift 有没有办法引用我在分支中打开的值 例如 switch UIDevice current userInterfaceIdiom cases default fatalError User interface idiom value
  • 如何为 Amazon ECR 配置自定义域名

    Amazon Elastic Container Repositories ECR 具有相当不人性化的 URI 例如99999999999 dkr ecr eu west 1 amazonaws com 是否可以为 ECR 配置自定义域名
  • 如何在 smack API 中处理添加请求

    我使用 Smack API 来编写我的 Google talk 客户端 现在我需要处理对此的添加请求 我将 SubscriptionMode 设置为手动 现在我必须注册存在数据包的侦听器 但我不知道如何 任何人都可以帮忙吗 我还没有尝试过
  • PDF 文件的结构? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 对于一个小项目 我必须解析 pdf 文件并获取其中的特定部分 简单的字符链 我想使用 python 来做
  • jq:从数组中删除元素

    我有这个 JSON 文件 想要从数组中删除一个元素 address localhost name local vars instances one two 我正在使用这个命令 jq del vars instances select ind
  • Scikit-learn RandomizedLasso 和 RandomizedLogisticRegression 已弃用

    我注意到linear model RandomizedLasso and linear model RandomizedLogisticRegression为套索回归实现稳定性选择的方法已被弃用 有谁知道为什么 稳定性选择不是一个好的方法吗
  • Xamarin.Forms 上传多个带有数据的图像

    我找到了几个有关如何在 Xamarin 中上传图像或多个图像的教程 但是 我还没有找到如何发送多个图像 每个图像都包含一些卫星数据 这是模型在服务器上的样子 public class AppFileDTO public IFormFile
  • 检查C#中的管理员权限

    我想知道程序是否以管理员身份运行 用户不必是管理员 我只想知道我的应用程序是否有权编辑某些以管理员身份运行时可编辑的受保护文件 这将返回一个 bool valid using System Security Principal bool i
  • 使用 Numpy 在 1D numpy 数组中查找局部最大值/最小值

    您能否建议 numpy scipy 中的一个模块函数可以在一维 numpy 数组中找到局部最大值 最小值 显然 最简单的方法是查看最近的邻居 但我希望有一个公认的解决方案 它是 numpy 发行版的一部分 在 SciPy 中 gt 0 11
  • Zend Framework 2 如何渲染模块内的部分?

    我的模块内的目录结构是这样的 Api Module php config module config php src etc view api api index phtml partial test phtml 然后 我正在这样做 但是
  • 在SQL中计算两个日期之间的差异,不包括周末

    我想构建一个 SQL 查询来计算两个日期之间的差异 而不计算结果中的周末天数 有没有办法格式化日期以获得这个结果 以 Oracle 数据库为例 select sysdate creation dttm from the table 你应该尝
  • 在 Objective-C 中使用 C 函数(适用于 iPhone)

    大家好 我自称是 iPhone 编程新手 拥有更长的 Perl 和 Web 背景 30 年 但上周我冒险买了几本好书 在死记硬背并阅读了 1000 多页之后 并且对它有了很好的理解之后 我已经朝着第一个优秀的原生 iPhone 应用程序迈进