`np.array ([список, список])`, переданный в 3D-плоттер, возвращает пустой результат - PullRequest
1 голос
/ 19 октября 2019

Я просто пытаюсь сгенерировать трехмерную поверхность и плоский контур, соответствующий контуру на тех же осях, используя три списка 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], чтобы передать необходимые двумерные массивы в функции плоттера. Но результат пуст. Что не так с этим подходом?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...