def main(): import os import numpy as nm import matplotlib.pyplot as plt from sfepy.fem import MeshIO import sfepy.linalg as la from sfepy.mechanics.contact_bodies import (ContactPlane, plot_polygon, plot_points) conf_dir = os.path.dirname(__file__) io = MeshIO.any_from_filename(filename_mesh, prefix_dir=conf_dir) bb = io.read_bounding_box() outline = [vv for vv in la.combine(zip(*bb))] ax = plot_points(None, nm.array(outline), 'r*') for name in ['cp%d' % ii for ii in range(4)]: cpc = materials[name][0] cp = ContactPlane(cpc['.a'], cpc['.n'], cpc['.bs']) v1, v2 = la.get_perpendiculars(cp.normal) ax = plot_polygon(ax, cp.bounds) ax = plot_polygon( ax, nm.r_[cp.anchor[None, :], cp.anchor[None, :] + cp.normal[None, :]]) ax = plot_polygon(ax, nm.r_[cp.anchor[None, :], cp.anchor[None, :] + v1]) ax = plot_polygon(ax, nm.r_[cp.anchor[None, :], cp.anchor[None, :] + v2]) plt.show()
def main(): import os import numpy as nm import matplotlib.pyplot as plt from sfepy.discrete.fem import MeshIO import sfepy.linalg as la from sfepy.mechanics.contact_bodies import (ContactPlane, plot_polygon, plot_points) conf_dir = os.path.dirname(__file__) io = MeshIO.any_from_filename(filename_mesh, prefix_dir=conf_dir) bb = io.read_bounding_box() outline = [vv for vv in la.combine(zip(*bb))] ax = plot_points(None, nm.array(outline), 'r*') for name in ['cp%d' % ii for ii in range(4)]: cpc = materials[name][0] cp = ContactPlane(cpc['.a'], cpc['.n'], cpc['.bs']) v1, v2 = la.get_perpendiculars(cp.normal) ax = plot_polygon(ax, cp.bounds) ax = plot_polygon(ax, nm.r_[cp.anchor[None, :], cp.anchor[None, :] + cp.normal[None, :]]) ax = plot_polygon(ax, nm.r_[cp.anchor[None, :], cp.anchor[None, :] + v1]) ax = plot_polygon(ax, nm.r_[cp.anchor[None, :], cp.anchor[None, :] + v2]) plt.show()
def draw_arrow(ax, coors, angle=20.0, length=0.3, **kwargs): """ Draw a line ended with an arrow head, in 2D or 3D. """ color = kwargs.get('color', 'b') c0 = coors[-2] c1 = coors[-1] vd = c1 - c0 nvd = nm.linalg.norm(vd) vd /= nvd c0 = c1 - length * vd ps = get_perpendiculars(vd) rangle = nm.deg2rad(min(angle, 60.0)) plength = length * nm.arctan(rangle) if coors.shape[1] == 2: from matplotlib.patches import Polygon cx, cy = coors[:, 0], coors[:, 1] ax.plot(cx, cy, **kwargs) p0 = c0 + plength * ps p1 = c0 - plength * ps pol = Polygon([p0, p1, c1], color=color) ax.add_artist(pol) else: import mpl_toolkits.mplot3d as plt3 cx, cy, cz = coors[:, 0], coors[:, 1], coors[:, 2] ax.plot(cx, cy, cz, **kwargs) p00 = c0 + plength * ps[0] p01 = c0 - plength * ps[0] p10 = c0 + plength * ps[1] p11 = c0 - plength * ps[1] arr = plt3.art3d.Poly3DCollection([[p00, p01, c1], [p10, p11, c1]], color=color) ax.add_collection3d(arr)
# Test and draw the plane. anchor = [1, 1, 1] normal = [2, -1, 1] bounds = [[-2, 0, 0], [2, 1, 0], [4, 3, 1], [1, 3, 1], [2, 2, 1]] cp = ContactPlane(anchor, normal, bounds) pps = 2 * nm.random.rand(20, 3) mask = cp.mask_points(pps) dist = cp.get_distance(pps) v1, v2 = la.get_perpendiculars(cp.normal) ax = plot_polygon(None, cp.bounds) ax = plot_polygon(ax, nm.r_[cp.anchor[None, :], cp.anchor[None, :] + cp.normal[None, :]]) ax = plot_polygon(ax, nm.r_[cp.anchor[None, :], cp.anchor[None, :] + v1]) ax = plot_polygon(ax, nm.r_[cp.anchor[None, :], cp.anchor[None, :] + v2]) ax = plot_points(ax, cp.anchor[None, :], 'r*') ax = plot_points(ax, pps[mask], 'bs', ms=10, mec='None') ax = plot_points(ax, pps[~mask], 'go', ms=10, mec='None') mask = dist >= 0.0 ax = plot_points(ax, pps[mask], 'r^', mec='None') ax = plot_points(ax, pps[~mask], 'kv', mec='None')