- objective-c - iOS 5 : Can you override UIAppearance customisations in specific classes?
- iphone - 如何将 CGFontRef 转换为 UIFont?
- ios - 以编程方式关闭标记的信息窗口 google maps iOS
- ios - Xcode 5 - 尝试验证存档时出现 "No application records were found"
在 iOS 中,我试图确定一个矩形上的点,该点与从中心点到矩形周边的假想线以预定角度相交。
假设我知道中心点、矩形的大小和角度(从东边的 0 度开始,逆时针方向经过北边的 90 度、西边的 180 度和南边的 270 度,再到东边的 360 度)。我需要知道相交点的坐标。
在 Finding points on a rectangle at a given angle 上的(对我而言)有点令人困惑的数学但大概是准确的答案让我尝试下面的代码,但它不能正常工作。这个问题与那个问题类似,但我正在寻找一种更正的 Objective-C/iOS 方法,而不是一般的数学响应。
我认为部分代码问题与使用单个 0 到 360 度角(以弧度表示,不可能为负数)输入有关,但可能还有其他问题。下面的代码主要使用 the answer from belisarius 中定义的符号,包括我尝试为此处定义的四个区域计算交点。
这段代码在我的 UIImageView 子类中:
- (CGPoint) startingPointGivenAngleInDegrees:(double)angle {
double angleInRads = angle/180.0*M_PI;
float height = self.frame.size.height;
float width = self.frame.size.width;
float x0 = self.center.x;
float y0 = self.center.y;
// region 1
if (angleInRads >= -atan2(height, width) && angleInRads <= atan2(height, width)) {
return CGPointMake(x0 + width/2, y0 + width/2 * tan(angleInRads));
}
// region 2
if (angleInRads >= atan2(height, width) && angleInRads <= M_PI - atan2(height, width)) {
return CGPointMake(x0 + height / (2*tan(angleInRads)),y0+height/2);
}
// region 3
if (angleInRads >= M_PI - atan2(height, width) && angleInRads <= M_PI + atan2(height, width)) {
return CGPointMake(x0 - width/2, y0 + width/2 * tan(angleInRads));
}
// region 4
return CGPointMake(x0 + height / (2*tan(angleInRads)),y0-height/2);
}
最佳答案
我不会调试您的代码,而只是解释我将如何做到这一点。
首先,几个术语。让我们将 xRadius
定义为框架宽度的一半,将 yRadius
定义为框架高度的一半。
现在考虑框架的四个边,并将它们延伸为无限长的线。在这四条线的顶部,放置一条以您指定的角度穿过框架中心的线:
假设框架以原点为中心 - 框架的中心位于坐标 (0,0)。我们可以很容易地计算出对角线与框架右边缘相交的位置:坐标为 (xRadius
, xRadius * tan(angle)
)。我们可以很容易地计算出对角线与框架顶部边缘相交的位置:坐标是 (-yRadius/tan(angle)
, -yRadius
).
(为什么我们否定顶边交点的坐标?因为 UIView
坐标系是从正常的数学坐标系翻转过来的。在数学中,y 坐标向页面顶部增加. 在 UIView
中,y 坐标向 View 底部增加。)
所以我们可以简单地计算直线与框架右边缘的交点。如果该交点在框架之外,那么我们知道该线必须先与上边缘相交,然后再与右边缘相交。。我们如何判断右边缘交点是否越界?如果它的 y 坐标 (xRadius * tan(angle)
) 大于 yRadius
(或小于 -yRadius
),则它超出范围。
因此,为了将它们放在一个方法中,我们首先计算 xRadius
和 yRadius
:
- (CGPoint)radialIntersectionWithConstrainedRadians:(CGFloat)radians {
// This method requires 0 <= radians < 2 * π.
CGRect frame = self.frame;
CGFloat xRadius = frame.size.width / 2;
CGFloat yRadius = frame.size.height / 2;
然后我们计算与右边缘相交的 y 坐标:
CGPoint pointRelativeToCenter;
CGFloat tangent = tanf(radians);
CGFloat y = xRadius * tangent;
我们检查交点是否在框架中:
if (fabsf(y) <= yRadius) {
一旦我们知道它在框架中,我们就必须弄清楚我们想要与右边缘还是左边缘相交。如果角度小于 π/2 (90°) 或大于 3π/2 (270°),我们需要右边缘。否则我们需要左边。
if (radians < (CGFloat)M_PI_2 || radians > (CGFloat)(M_PI + M_PI_2)) {
pointRelativeToCenter = CGPointMake(xRadius, y);
} else {
pointRelativeToCenter = CGPointMake(-xRadius, -y);
}
如果右边缘交点的 y 坐标 • 是*越界,我们计算与底部边缘交点的 x 坐标。
} else {
CGFloat x = yRadius / tangent;
接下来我们要弄清楚我们是想要顶部边缘还是底部边缘。如果角度小于 π (180°),我们需要底边。否则,我们需要顶部边缘。
if (radians < (CGFloat)M_PI) {
pointRelativeToCenter = CGPointMake(x, yRadius);
} else {
pointRelativeToCenter = CGPointMake(-x, -yRadius);
}
}
最后,我们将计算出的点偏移框架的实际中心并将其返回。
return CGPointMake(pointRelativeToCenter.x + CGRectGetMidX(frame),
pointRelativeToCenter.y + CGRectGetMidY(frame));
}
在这里测试项目:https://github.com/mayoff/stackoverflow-radial-intersection
看起来像这样:
关于iphone - 在与中心点成给定角度的直线相交的 UIView 矩形上找到 CGPoint,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9526726/
这一章实现的连接线,目前仅支持直线连接,为了能够不影响原有的其它功能,尝试了2、3个实现思路,最终实测这个实现方式目前来说最为合适了。 请大家动动小手,给我一个免费的 Star 吧~ 大家
本章分享一下如何使用 Konva 绘制基础图形:矩形、直线、折线,希望大家继续关注和支持哈! 请大家动动小手,给我一个免费的 Star 吧~ 大家如果发现了 Bug,欢迎来提 Issue
本章响应小伙伴的反馈,除了算法自动画连接线(仍需优化完善),实现了可以手动绘制直线、折线连接线功能。 请大家动动小手,给我一个免费的 Star 吧~ 大家如果发现了 Bug,欢迎来提 Is
我有一条线(两点(x,y)(x1,y1))和一个带有焦点(rx,ry)的矩形。我需要帮助找出线和矩形之间的碰撞点,C++ 中的一个例子会有所帮助。 最佳答案 我不知道如何仅用“焦点”来表示矩形。您将需
让我们画一条线和一个圆: canvas.create_line(x0,y0,x1,y1) canvas.create_oval(x0,y0,x1,y1) 如何计算每个像素的像素数? 最佳答案 你不能。
本文实例讲述了php使用gd2绘制基本图形。分享给大家供大家参考,具体如下: 应用GD2函数可以绘制的图形有多种,最基本的图形包括条、圆、方形等。无论开发人员绘制多么复杂的图形,都是在这些最基本的
我已经尝试了所有改变颜色的方法: call s:h("Underlined", {"fg": s:norm, "gui": "underline", "cterm": "underline"})
为什么以下行有时会在 chrome 开发控制台中产生消息“未定义不是函数”: (callbackOrUndefined || function() {})(); 这个想法是,如果回调为真,即函数,则执
我想在 MS Chart 中实现直线(分段拟合)图表。 我知道 X 轴上的点 [最小值 = 1.4,最大值 = 2.2]。我已将所有这些点都放在折线图上。 现在的要求是我如何知道 X 轴上的点 [最小
所以我正在使用 charts.js http://www.chartjs.org/我试图使 2 个点之间的线是直线而不是弯曲的,没有明显的原因。 现在看起来是这样的 http://imgur.com/
我已将我的机器人发布到 Azure。现在我要开发自己的聊天用户界面。我想在 JavaScript 中使用 Direct Line API 来调用机器人。 如何在 JavaScript 中使用 Dire
这个有点难解释。我有一个整数列表。因此,例如,[1, 2, 4, 5, 8, 7, 6, 4, 1] - 当根据元素编号绘制时,它类似于凸图。我如何以某种方式从列表中提取此“形状”特征?它不必特别准确
我在学习 javaScript 和 jQuery 的第一周,我正在尝试制作一些动画。 基本上我想要做的就是让这些箭头从屏幕开始,从一侧进入,通过 throw 目标,然后离开屏幕的另一侧。 理想情况下,
假设我有一个向导并且有 3 个部分,假设它是这样的。 [A]----[B]----[C] 假设当前在范围内选择了 A。这是一个彩色的红色圆圈。当 B 在范围内被选中时,就可以移动一个对象(假设一条彩色
我正在使用 botframework-directlinejs NodeJS SDK 为我的机器人前端实现一个新 channel 。该 channel 将提供一些自定义反向 channel 功能;但是
我正在使用直线执行 hql 查询。该作业似乎没有出现在 HDP 2.6 上 Spark History 服务器的资源管理器中。如何让它运行在 Yarn 上? 谢谢 最佳答案 Beeline 是一个 A
我目前正在尝试找到一种如何使用 Google Maps Api V3 获得直线路线的方法。 我已经设法使用地理编码和方向服务来获取从 A 点到 B 点的路线,包括两条替代路线。我还尝试过“无高速公路”
我有一个简单的 Canvas html5。它可以通过选择选项绘制一些形状,如直线、圆形、矩形、多边形,但现在我想让所有绘制都可拖动(如果可能的话)可调整大小,没有 3 部分库,只有纯 JS。
我正在使用在 Kerberos 中添加的帐户启动 beeline 来测试 Sentry: beeline -u "jdbc:hive2://IP:10000/;principal=test_table
我正在使用普通的 html/javascript Canvas (无库)。我有一种从两点计算 Angular 方法,我的理论是,我获取 Angular 并通过循环所需的水平距离 (x) 并对该 Ang
我是一名优秀的程序员,十分优秀!