问题背景,参数,模型和约束条件可以看我前一篇文章: C++调用CPLEX实现三位装箱.这里是只给出后面用python实现三维装箱可视化的代码。
使用python中的matplotlib库中的Axe3D方法实现多个箱子的堆叠。
以下是 代码
.
// An highlighted block
# -*- coding: utf-8 -*-
# @Author: tobby
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
cartonnum=10;
# %matplotlib inline
class Cartons:
def __init__(self, x, y, z, length, width, height, xl, zl, zh, yw):
self.x = x
self.y = y
self.z = z
self.length = length
self.width = width
self.height = height
self.xl = xl
self.zl = zl
self.zh = zh
self.yw = yw
def ifxl(self):
return bool(self.xl)
def ifzl(self):
return bool(self.zl)
def ifzh(self):
return bool(self.zh)
def ifyw(self):
return bool(self.yw)
a=[
[0 , 22 , 0 , 36 , 36 , 36 , 0 , 0 , 0 , 0],
[0 , 0 , 0 , 59 , 39 , 20 , 0 , 1 , 0 , 0],
[40 , 37 , 14 , 54 , 40 , 21 , 0 , 1 , 0 , 0],
[59 , 0 , 0 , 58 , 37 , 21 , 0 , 1 , 0 , 1],
[39 , 0 , 16 , 52 , 33 , 20 , 0 , 1 , 0 , 1],
[0 , 37 , 37 , 40 , 31 , 21 , 1 , 0 , 0 , 0],
[0 , 20 , 37 , 31 , 31 , 17 , 1 , 0 , 0 , 0],
[42 , 0 , 0 , 31 , 17 , 16 , 0 , 0 , 1 , 0],
[36 , 32 , 0 , 26 , 23 , 14 , 0 , 0 , 1 , 0],
[59 , 4 , 64 , 33 , 21 , 4 , 0 , 0 , 1 , 0]
# [27 , 0 , 17 , 61 , 47 , 32 , 0 , 1 , 0 , 0],
# [0 , 3 , 0 , 54 , 40 , 21 , 0 , 0 , 0 , 0],
# [21 , 36 , 0 , 54 , 40 , 21 , 1 , 0 , 0 , 0],
# [47 , 36 , 40 , 40 , 31 , 21 , 0 , 1 , 0 , 0],
# [0 , 36 , 49 , 40 , 31 , 21 , 1 , 0 , 0 , 0],
# [0 , 0 , 40 , 40 , 31 , 21 , 0 , 1 , 0 , 1],
# [47 , 5 , 0 , 31 , 31 , 17 , 0 , 0 , 1 , 0],
# [74 , 0 , 59 , 33 , 21 , 4 , 0 , 0 , 0 , 0]
]
carton = [Cartons(a[i][0],a[i][1],a[i][2],a[i][3],a[i][4],a[i][5],a[i][6],a[i][7],a[i][8],a[i][9]) for i in range(cartonnum)]
if __name__ == "__main__":
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, projection='3d')
for i in range(0,cartonnum):
x=carton[i].x
y=carton[i].y
z=carton[i].z
if carton[i].ifyw() and carton[i].ifzl() :#高 宽 长
dx=carton[i].height
dy=carton[i].width
dz=carton[i].length
elif(not carton[i].ifyw() )and (carton[i].ifzl()):#宽 高 长
dx=carton[i].width
dy=carton[i].height
dz = carton[i].length
elif (not carton[i].ifyw()) and (carton[i].ifxl()):#长 高 宽
dx = carton[i].length
dy = carton[i].height
dz = carton[i].width
elif (not carton[i].ifyw() )and (carton[i].ifzh() ):#宽 长 高
dx=carton[i].width
dy=carton[i].length
dz=carton[i].height
elif (not carton[i].ifzh() ) and (not carton[i].ifxl()) and(not carton[i].ifzl()):#高 长 宽
dx=carton[i].height
dy=carton[i].length
dz=carton[i].width
else:#长 宽 高
dx = carton[i].length
dy = carton[i].width
dz = carton[i].height
ax.bar3d(x, y, z, dx, dy, dz, shade=True)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z(value)')
#plt.axis('scaled')
plt.show()
上一篇还是一年前写的文章,发现有很多小伙伴问可视化图的代码,小白代码写的并不好,大家多多谅解哈哈。