当圆周上的坐标已知时,如何获得左上坐标?

时间:2013-05-21 13:04:31

标签: ios iphone math

我有两个同心圆,两者之间的距离是一定的。 我根据在圆形部分(包括内部的黑色圆圈)中触摸时获得的角度获得最外圈圆周上的坐标。

这是UIControl的子类,我使用touches方法获取圆周上的点。

我成功地获得了精确的角度,因此得到了最外圈圆周上的精确点。

但我想在同心圆的顶部放置一个按钮,使其直径= distance_between_concentric_circles + 2 * offset。

使用此偏移使按钮边缘应位于同心圆区域之外,如下图所示。

Circle button

每次移动该按钮时,它都应该沿着圆形路径移动。

由于我不想画画,我正在使用UIButton和图像视图,而我发现很难根据外围圆周上的点来获得左上角坐标圈子和UIButton的大小。

我可以移动按钮,但没有正确放置在圆形路径上。

有人能告诉我是否有办法让左上方的坐标设置uibutton的框架?

我想在不画画的情况下这样做。

2 个答案:

答案 0 :(得分:1)

不用担心左上角可能更容易,而只是设置按钮的center属性(而不是frame属性)。计算左上角的偏移量并不难,但调整center属性更直观,恕我直言。


或者,如果您不想调整centerframe坐标,可以使用Quartz 2D在屏幕上的某个点旋转按钮:

  • 更改按钮的anchorPoint;

  • 将按钮的position设置为您要旋转的点(并且因为您设置了anchorPoint,按钮将与position正确偏移1}});以及

  • 围绕该锚点旋转它。

所以,如果你link the QuartzCore.framework to your project,那么你可以:

#import <QuartzCore/QuartzCore.h>

@interface ViewController ()

@property (nonatomic, strong) CADisplayLink *displayLink;
@property (nonatomic) CFTimeInterval startTime;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self rotateButtonAroundPoint];
}

- (void)rotateButtonAroundPoint
{
    // the point about which I'm rotating and at what radius

    CGPoint center = CGPointMake(self.view.bounds.size.width / 2.0, self.view.bounds.size.height / 2.0);
    CGFloat radius = 100.0;

    // now configure the button's layer accordingly

    self.button.layer.anchorPoint = CGPointMake(0.5, 0.5 + radius / self.button.frame.size.height);
    self.button.layer.position = center;

    // just so I can see what I'm rotating this around

    [self addCircleAt:center radius:5.0 color:[UIColor redColor]];

    // turn on display link to animate it (better than `NSTimer` for animations)

    [self startDisplayLink];
}

- (void)addCircleAt:(CGPoint)center radius:(CGFloat)radius color:(UIColor *)color
{
    CAShapeLayer *layer = [CAShapeLayer layer];
    UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center radius:radius startAngle:0 endAngle:2.0 * M_PI clockwise:YES];

    layer.path = [path CGPath];
    layer.fillColor = [color CGColor];
    [self.view.layer addSublayer:layer];
}

- (void)startDisplayLink
{
    self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(handleDisplayLink:)];
    self.startTime = CACurrentMediaTime();
    [self.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
}

- (void)stopDisplayLink
{
    [self.displayLink invalidate];
    self.displayLink = nil;
}

- (void)handleDisplayLink:(CADisplayLink *)displayLink
{
    CFTimeInterval elapsed = CACurrentMediaTime() - _startTime;

    self.button.transform = CGAffineTransformMakeRotation(elapsed * 2.0 * M_PI / 5.0); // duration = 5.0 seconds
}

我怀疑只是更改center / frame或进行翻译(而不是这种旋转)可能在计算上更便宜,但如果您希望按钮在旋转时实际旋转,这是一个选项,它享有一定的优雅(只需设置positionanchorPoint并围绕它旋转,不要担心笛卡尔坐标。

答案 1 :(得分:0)

圆心圆周上以中心为原点的任何点都由(r*cos(theta),r*sin*(theta))表示 除了原点,圆周上的任何点都是(x+r*cos(theta),y+r*sin*(theta)) (x,y)将成为圆圈的中心,因此请计算(x+r*cos(theta),y+r*sin*(theta))并设置按钮中心