如何在Swift中获得所有积分?

时间:2015-03-04 12:36:42

标签: ios swift

我在Swift中编写一个程序,它需要一个使用两个CGPoints规范的方法,并返回它们之间的直线中的所有点。目前我正在尝试以下方法,但它非常小问题并且拒绝获得某些行的所有点。我只是想知道是否有更有效的方法来做到这一点?

func addPointsInLine(#start: CGPoint, end: CGPoint){

    var speed = 0
    var startNo = trackPoints.count
    var endNo = startNo

    var xDiff = start.x - end.x
    var yDiff = start.y - end.y

    var xChange = 0.0
    var yChange = 0.0

    var newPointX = start.x
    var newPointY = start.y

    var ended = false

    xChange = Double(xDiff) / Double(yDiff)
    yChange = Double(yDiff) / Double(xDiff)

    /*if(xDiff > 0){
        xChange = sqrt(xChange * xChange)
    }
    if(yDiff > 0){
        yChange = sqrt(yChange * yChange)
    }*/

    println("xc \(xChange)")
    println("yc \(yChange)")

    var y = Double(start.y)
    var x = Double(start.x)

    while !ended {
        println(trackPoints.count)
        speed++
        endNo++
        if(CGPointMake(newPointX, newPointY) == end){
            ended = true
        }

        if(yChange > xChange){
            y++
            x += xChange
            trackPoints.append(TrackPoint(x: Int(x), y: Int(y)))
            if(CGFloat(Int(y)) == end.y){
                ended = true
                println("end")
                //break
            }
           /* if(yChange > 0){
                if(CGFloat(Int(y)) > end.y){
                    ended = true
                    println("end>y")
                   // break
                }
            }
            if(yChange < 0){
                if(CGFloat(Int(y)) < end.y){
                    ended = true
                    println("end<y")
                    //break
                }
            }*/
            if(xChange > 0){
                if(CGFloat(Int(x)) >= end.x){
                    ended = true
                    println("end>x")
                    //break
                }
            }
            if(xChange < 0){
                if(CGFloat(Int(x)) <= end.x){
                    ended = true
                    println("end<x")
                    //break
                }
            }
        } else {
            x++
            y += yChange
            trackPoints.append(TrackPoint(x: Int(x), y: Int(y)))
            if(CGFloat(Int(x)) == end.x){
                ended = true
                println("end")
                //break
            }
           /* if(xChange > 0){
                if(CGFloat(Int(x)) >= end.x){
                    ended = true
                    println("end>x")
                    //break
                }
            }
            if(xChange < 0){
                if(CGFloat(Int(x)) <= end.x){
                    ended = true
                    println("end<x")
                    //break
                }
            }*/
            if(yChange > 0){
                if(CGFloat(Int(y)) > end.y){
                    ended = true
                    println("end>y")
                    // break
                }
            }
            if(yChange < 0){
                if(CGFloat(Int(y)) < end.y){
                    ended = true
                    println("end<y")
                    //break
                }
            }
        }

    }

    println("finished")

    var i = startNo
    println(startNo)
    println(endNo)
    while i < endNo {
        trackPoints[i].speed = speed
        i++
    }
    println("finish2")

}

2 个答案:

答案 0 :(得分:1)

我认为首先找不到所有点是不可能的,因为直线上有无限点。以线连接(0,0)到(1,0)为例。所有以下几点以及更多内容都在上述行(0.00001,0)(0.0000000000001,0)(0.01,0)

所以你需要限制你需要找到的点数,就像使用整数坐标所有点一样。所有积分1个单位,从起点开始等。

接下来,您可以使用一个线方程来获得点:Equations of Line

答案 1 :(得分: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)
}