制作将点围绕另一个点平移的函数 [英] making a function that translates a point around another point

查看:106
本文介绍了制作将点围绕另一个点平移的函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

给出了我的程序理论上应该得到的一系列点,找到了彼此之间最远的两个点.然后计算这两个点与x轴所成的角度.然后,将阵列中的所有点绕所有点的平均中心旋转该角度.由于某种原因,我绕中心旋转所有点的平移功能无法正常工作,这给了我意外的值.我相当确定我使用的数学方法是正确的,因为我使用Wolfram alpha测试了我使用的公式并将点绘制在desmos上.我不确定我的代码出了什么问题,因为它不断给我带来意想不到的输出.任何帮助将不胜感激. 这是转换数组的代码:

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)

解决方案

就地旋转时,这是一个常见错误:

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 

given an array of points my program should in theory, Find the two furthest points from each other. Then calculate the angle that those two points make with the x axis. Then in rotate all the points in the array around the averaged center of all the points by that angle. For some reason my translation function to rotate all the points around the center is not working it is giving me unexpected values. I am fairly sure the math I am using to do this is accurate since I tested the formula I am using using wolfram alpha and plotted the points on desmos. I am not sure what's wrong with my code because it keeps giving me unexpected output. Any help would greatly be appreciated. This is the code to translate the array:

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   

This is the code I am using to test it. tortose is what I set turtle graphics name as

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()

find center code finds the center of all points in array don't worry about z axis since it is not used in translation:

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()

my expected output should be a point at (-50,150) but it is giving me a point at (-50,-99.99999999999997)

解决方案

This is a common mistake when doing in-place rotations:

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

First you update array1[i][0]. Then you update array1[i][1], but you use the new value when you should use the old value. Instead, temporarily store the old value:

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 

这篇关于制作将点围绕另一个点平移的函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆