简体   繁体   English

获取目标C中两点之间的所有X,Y坐标

[英]Get all X,Y coordinates between two points in objective C

How to get all X,Y coordinates between two points. 如何获得两点之间的所有X,Y坐标 I want to move a UIButton in a diagonal pattern in objective C. Example. 我想在目标C中以对角线模式移动UIButton。示例。 To move UIButton from position 'Point A' towards position 'Point B'. 将UIButton从位置'Point A'移动到位置'Point B'。

                         .Point B



    . Point A

Thanks in advance. 提前致谢。

you can use Bresenham's line algorithm 你可以使用Bresenham的线算法

Here is a slightly simplified version, I have used a bunch of times 这是一个略微简化的版本,我已经使用了很多次

+(NSArray*)getAllPointsFromPoint:(CGPoint)fPoint toPoint:(CGPoint)tPoint
{
    /*Simplified implementation of Bresenham's line algoritme */
    NSMutableArray *ret = [NSMutableArray array];
    float deltaX = fabsf(tPoint.x - fPoint.x);
    float deltaY = fabsf(tPoint.y - fPoint.y);
    float x = fPoint.x;
    float y = fPoint.y;
    float err = deltaX-deltaY;

    float sx = -0.5;
    float sy = -0.5;
    if(fPoint.x<tPoint.x)
        sx = 0.5;

    if(fPoint.y<tPoint.y)
        sy = 0.5;
    do {
        [ret addObject:[NSValue valueWithCGPoint:CGPointMake(x, y)]];
        float e = 2*err;
        if(e > -deltaY)
        {
            err -=deltaY;
            x +=sx; 
        }
        if(e < deltaX)
        {
            err +=deltaX;
            y+=sy;
        }
    } while (round(x)  != round(tPoint.x) && round(y) != round(tPoint.y));
    [ret addObject:[NSValue valueWithCGPoint:tPoint]];//add final point
    return ret;
}

If you simply want to animate a UIControl from one location to another, you might want to use UIAnimation : 如果您只想将UIControl从一个位置设置为另一个位置,则可能需要使用UIAnimation

[UIView animateWithDuration:1.0f delay:0.0f options:UIViewAnimationOptionCurveLinear animations:^{
    btn.center = CGPointMake(<NEW_X>, <NEW_Y>)
} completion:^(BOOL finished) {

}];

You should really use Core Animation for this. 你应该真的使用Core Animation。 You just need to specify the new origin for your UIButton and Core Animation does the rest: 您只需要为您的UIButton指定新的原点,剩下的就是Core Animation:

   [UIView animateWithDuration:0.3 animations:^{
       CGRect frame = myButton.frame;
       frame.origin = CGPointMake(..new X.., ..new Y..);
       myButton.frame = frame;
   }];

This version of Bresenham's line algorithm works well with horizontal line: 这个版本的Bresenham线算法适用于水平线:

+ (NSArray*)getAllPointsFromPoint:(CGPoint)fPoint toPoint:(CGPoint)tPoint {

    /* Bresenham's line algorithm */

    NSMutableArray *ret = [NSMutableArray array];

    int x1 = fPoint.x;
    int y1 = fPoint.y;
    int x2 = tPoint.x;
    int y2 = tPoint.y;

    int dy = y2 - y1;
    int dx = x2 - x1;
    int stepx, stepy;

    if (dy < 0) { dy = -dy;  stepy = -1; } else { stepy = 1; }
    if (dx < 0) { dx = -dx;  stepx = -1; } else { stepx = 1; }
    dy <<= 1;        // dy is now 2*dy
    dx <<= 1;        // dx is now 2*dx

    [ret addObject:[NSValue valueWithCGPoint:CGPointMake(x1, y1)]];

    if (dx > dy)
    {
        int fraction = dy - (dx >> 1);  // same as 2*dy - dx
        while (x1 != x2)
        {
            if (fraction >= 0)
            {
                y1 += stepy;
                fraction -= dx;          // same as fraction -= 2*dx
            }
            x1 += stepx;
            fraction += dy;              // same as fraction -= 2*dy
            [ret addObject:[NSValue valueWithCGPoint:CGPointMake(x1, y1)]];

        }
    } else {
        int fraction = dx - (dy >> 1);
        while (y1 != y2) {
            if (fraction >= 0) {
                x1 += stepx;
                fraction -= dy;
            }
            y1 += stepy;
            fraction += dx;
            [ret addObject:[NSValue valueWithCGPoint:CGPointMake(x1, y1)]];
        }
    }

    return ret;
}

UPDATE : this is actually simple math find the point on the line made out of two points, here is my algo: 更新 :这实际上是简单的数学找到两点上的点,这是我的算法:

+ (NSArray*)getNumberOfPoints:(int)num fromPoint:(CGPoint)p toPoint:(CGPoint)q {

    NSMutableArray *ret = [NSMutableArray arrayWithCapacity:num];

    float epsilon = 1.0f / (float)num;
    int count = 1;

    for (float t=0; t < 1+epsilon && count <= num ; t += epsilon) {
        float x = (1-t)*p.x + t*q.x;
        float y = (1-t)*p.y + t*q.y;
        [ret addObject:[NSValue valueWithCGPoint:CGPointMake(x, y)]];
        count++;
    }

    // DDLogInfo(@"Vector: points made: %d",(int)[ret count]);
    // DDLogInfo(@"Vector: epsilon: %f",epsilon);
    // DDLogInfo(@"Vector: points: %@",ret);

    return [ret copy];

}

For Swift 3.0, 对于Swift 3.0,

    func findAllPointsBetweenTwoPoints(startPoint : CGPoint, endPoint : CGPoint) {
        var allPoints :[CGPoint] = [CGPoint]()

        let deltaX = fabs(endPoint.x - startPoint.x)
        let deltaY = fabs(endPoint.y - startPoint.y)

        var x = startPoint.x
        var y = startPoint.y
        var err = deltaX-deltaY

        var sx = -0.5
        var sy = -0.5
        if(startPoint.x<endPoint.x){
            sx = 0.5
        }
        if(startPoint.y<endPoint.y){
            sy = 0.5;
        }

        repeat {
            let pointObj = CGPoint(x: x, y: y)
            allPoints.append(pointObj)

            let e = 2*err
            if(e > -deltaY)
            {
                err -= deltaY
                x += CGFloat(sx)
            }
            if(e < deltaX)
            {
                err += deltaX
                y += CGFloat(sy)
            }
        } while (round(x)  != round(endPoint.x) && round(y) != round(endPoint.y));

        allPoints.append(endPoint) 
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM