создание функции, которая переводит точку вокруг другой точки - PullRequest
0 голосов
/ 08 июля 2019

учитывая массив точек, которые моя программа должна теоретически найти две самые дальние точки друг от друга. Затем вычислите угол, который эти две точки образуют с осью х. Затем поверните все точки в массиве вокруг усредненного центра всех точек на этот угол. По некоторым причинам моя функция перевода для поворота всех точек вокруг центра не работает, она дает мне неожиданные значения. Я вполне уверен, что математика, которую я использую для этого, точна, так как я проверил формулу, которую я использую, используя wolfram alpha, и нанес на карту точки на десмосе. Я не уверен, что не так с моим кодом, потому что он продолжает давать мне неожиданный вывод. Любая помощь будет принята с благодарностью. Это код для перевода массива:

def translation(array,centerArray):
    array1=array
    maxDistance=0
    point1=[]
    point2=[]
    global angle
    for i in range(len(array1)):
        for idx in range(len(array1)):
            if(maxDistance<math.sqrt(((array1[i][0]-array1[idx][0])**2)+((array1[i][1]-array1[idx][1])**2)+((array1[i][2]-array1[idx][2])**2))):
                maxDistance=math.sqrt(((array1[i][0]-array1[idx][0])**2)+((array1[i][1]-array1[idx][1])**2)+((array1[i][2]-array1[idx][2])**2))
                point1 = array1[i]
                point2 = array1[idx]
    angle=math.atan2(point1[1]-point2[1],point1[0]-point2[0]) #gets the angle between two furthest points and xaxis


    for i in range(len(array1)): #this is the problem here 
        array1[i][0]=((array[i][0]-centerArray[0])*math.cos(angle)-(array[i][1]-centerArray[1])*math.sin(angle))+centerArray[0] #rotate x cordiate around center of all points 
        array1[i][1]=((array[i][1]-centerArray[1])*math.cos(angle)+(array[i][0]-centerArray[0])*math.sin(angle))+centerArray[1] #rotate y cordiate around center of all points 

    return array1   

Это код, который я использую для проверки. tortose - это то, что я назвал графикой черепахи

tortose.color("violet")
testarray=[[200,400,9],[200,-100,9]] #array of 2 3d points but don't worry about z axis it will not be used for in function translation
print("testsarray",testarray)
for i in range(len(testarray)): #graph points in testarray
    tortose.setposition(testarray[i][0],testarray[i][1]) 
    tortose.dot()
testcenter=findCenter(testarray) # array of 1 point in the center of all the points format center=[x,y,z] but again don't worry about z
print("center",testcenter)
translatedTest=translation(testarray,testcenter) # array of points after they have been translated same format and size of testarray

print("translatedarray",translatedTest) #should give the output [[-50,150,9]] as first point but instead give output of [-50,-99.999999997,9] not sure why
tortose.color("green")
for i in range(len(testarray)): #graphs rotated points 
    tortose.setposition(translatedTest[i][0],translatedTest[i][1]) 
    tortose.dot()

print(angle*180/3.14) #checks to make sure angle is 90 degrees because it should be in this case this is working fine



tortose.color("red")
tortose.setposition(testcenter[0],testcenter[1])
tortose.dot()

найти центр кода находит центр всех точек в массиве, не беспокойтесь о оси Z, так как он не используется в переводе:

def findCenter(array):
    sumX = 0
    sumY = 0
    sumZ = 0
    for i in range(len(array)):
        sumX += array[i][0]
        sumY += array[i][1] 
        sumZ += array[i][2]
    centerX= sumX/len(array)
    centerY= sumY/len(array)
    centerZ= sumZ/len(array)
    #print(centerX)
    #print(centerY)
    #print(centerZ)
    centerArray=[centerX,centerY,centerZ]
    return centerArray

import math
import turtle
tortose = turtle.Turtle()
tortose.penup()

мой ожидаемый результат должен быть точкой в ​​(-50,150), но он дает мне точку в (-50, -99.99999999999997)

1 Ответ

2 голосов
/ 08 июля 2019

Это распространенная ошибка при ротации на месте:

array1[i][0]= ...
array1[i][1]= ... array[i][0] ...

Первое обновление array1[i][0]. Затем вы обновляете array1[i][1], но вы используете новое значение, когда вы должны использовать старое значение. Вместо этого временно сохраните старое значение:

x = array1[i][0]
array1[i][0]=((array[i][0]-centerArray[0])*math.cos(angle)-(array[i][1]-centerArray[1])*math.sin(angle))+centerArray[0] #rotate x cordiate around center of all points 
array1[i][1]=((array[i][1]-centerArray[1])*math.cos(angle)+(x-centerArray[0])*math.sin(angle))+centerArray[1] #rotate y cordiate around center of all points 
...