'''
Created on 26 Mar 2015

@author: Craig
'''
import CraigIOonly as cio
import combinedLeastSqr as cbl
import numpy as np
import scipy.spatial as ss
from numpy import arccos

if __name__ == '__main__':
    pointCloud = cio.readIn("c:/scripts/PCAfield.xyz", 6,
                            False)  #can set origin within this function
    cio.WritePointstoTxt("C:/scripts/PCAfieldML.xyz", pointCloud)
예제 #2
0
def main():

    timer = True

    areaForNormals = 1
    areaIncrement = 2
    testNighbourCount = True
    showNeighboursCount = False

    np.set_printoptions(precision=6, suppress=True, linewidth=500)
    #     pointCloud=getPlanePointsGrid()

    pointCloud = cio.readIn("c:/scripts/urbancloud.csv", 3,
                            True)  #can set origin within this function
    size = pointCloud.shape[0]
    print "Point Cloud Size: " + str(size) + " Points"
    #     rotation=cbl.rotationMatrix(0, pi/4., 0)
    #     pointCloud= pointCloud*rotation

    tree, points = getKDtree(pointCloud)
    # get index of each point which distance from (x=0, y=0) is under 1

    #     a = tree.query_ball_point([1,1,1], 2)

    normals = np.zeros((len(points), 3))
    theta = np.zeros((len(points), 1))
    s = 0

    average = 0

    for point in pointCloud:
        start0 = time.clock()
        a = point[0, 0]
        b = point[0, 1]
        c = point[0, 2]
        vec = [a, b, c]

        #get nearest points

        localPoints = tree.query_ball_point(
            vec, areaForNormals)  #gives index to local points close to vec
        sz = len(localPoints)
        i = 0
        if testNighbourCount:
            while sz < 20:
                localPoints = tree.query_ball_point(
                    vec, areaForNormals +
                    (i *
                     areaIncrement))  #gives index to local points close to vec
                sz = len(localPoints)
                i += 1
        if showNeighboursCount:
            print sz

        mat = []
        for i in localPoints:
            mat.append(points[i])

        #calculate the local planes normal
#         s1=time.clock()
#         normal=cbl.solvePlane(mat, [0.1,0.1,1.1])
        normal = cbl.solvePlanePCA(mat)
        #         f1=time.clock()
        #         print s1-f1

        #         s1=time.clock()
        normal = getUnitVector(normal)
        #         f1=time.clock()
        #         print s1-f1
        #associate the normal with that point

        normals[s, 0] = normal[0]
        normals[s, 1] = normal[1]
        normals[s, 2] = normal[2]
        a = (np.dot(normal, [0, 0, 1]))
        a = float(a)
        theta[s] = (np.arccos(a)) * 180 / pi

        s += 1
        if timer:
            if (s < 100):

                finish0 = time.clock()
                average = (average + (finish0 - start0)) / 2

            else:
                print "time left:"
                print int((size - s) * (average))

#         finish0= time.clock()
#         print finish0-start0
    pointCloud = np.append(pointCloud, normals, 1)
    pointCloud = np.append(pointCloud, theta, 1)

    #print point cloud to file

    cio.WritePointstoTxt("C:/scripts/PCAfield.xyz", pointCloud)