Я просто пытаюсь сгенерировать трехмерную поверхность и плоский контур, соответствующий контуру на тех же осях, используя три списка x
, y
и apf
следующим образом:
import numpy as np
import math
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
from matplotlib import cm
class Point(object):
def __init__(self,x,y):
self.X = x
self.Y = y
def distance(self, goal):
dx = self.X - goal.X
dy = self.Y - goal.Y
return math.hypot(dx, dy)
def move(self, xGrad, yGrad):
self.X -= xGrad*1e-2
self.Y -= yGrad*1e-2
return self
def APF(a, r, currentX, currentY, goalX, goalY, obstacles):
attr = a*math.hypot(currentX-goalX, currentY-goalY)**2
repl = 0
for item in obstacles:
repl += 1/math.hypot(currentX-item.point.X, currentY-item.point.Y)**2
repl *= r
return attr + repl
def gradX(a, r, h, currentX, currentY, goalX, goalY, obstacles):
num1 = APF(a, r, currentX+h, currentY, goalX, goalY, obstacles)
num2 = APF(a, r, currentX-h, currentY, goalX, goalY, obstacles)
return (num1-num2)/(2*h)
def gradY(a, r, h, currentX, currentY, goalX, goalY, obstacles):
num1 = APF(a, r, currentX, currentY+h, goalX, goalY, obstacles)
num2 = APF(a, r, currentX, currentY-h, goalX, goalY, obstacles)
return (num1-num2)/(2*h)
class Obstacle(object):
def __init__(self, point, radius):
self.point = point
self.radius = radius
if __name__== "__main__" :
start = Point(1.0, 1.0)
goal = Point(8.0, 8.0)
p1 = Point(3.0, 3.0)
p2 = Point(5.0, 6.0)
p3 = Point(7.0, 6.0)
obs1 = Obstacle(p1, 0.5)
obs2 = Obstacle(p2, 0.5)
obs3 = Obstacle(p3, 0.5)
obstacles = [obs1, obs2, obs3]
trajectory = [start]
trajectory2 = [start]
h = 10e-4
a = 0.5
r = 1
temp = start
x = []
y = []
apf = []
max_grad = 0
i = 0
maxiter = 1000
while temp.distance(goal)!=0 and i < maxiter:
i += 1
apf.append(APF(a, r, start.X, start.Y, goal.X, goal.Y, obstacles))
next = temp.move(gradX(a, r, h, start.X, start.Y, goal.X, goal.Y, obstacles),
gradY(a, r, h, start.X, start.Y, goal.X, goal.Y, obstacles))
trajectory.append(next)
x.append(next.X)
y.append(next.Y)
g = plt.figure()
ax2 = g.gca(projection='3d')
ax2.plot_surface(np.array([x,x]), np.array([y,y]), np.array([apf,apf]), rstride=8, cstride=8, alpha=0.3)
cset = ax2.contourf(np.array([x,x]), np.array([y,y]), np.array([apf,apf]), zdir='z', offset=-100, cmap=cm.coolwarm)
ax2.set_xlabel('X')
ax2.set_ylabel('Y')
ax2.set_zlabel('apf')
ax2.relim()
ax2.autoscale_view()
plt.show()
В частности, я рассмотрел np.array([x,x])
, np.array([y,y])
и np.array([apf,apf]
, чтобы передать необходимые двумерные массивы в функции плоттера. Но результат пуст. Что не так с этим подходом?