from math import radians
from compas.geometry import Point, Vector, Line, Polyline
from compas.geometry import Rotation
from compas.geometry import centroid_points_xy
from compas.utilities import flatten
from compas_occ.geometry import OCCNurbsSurface
from compas_view2.app import App
from compas_view2.objects import Collection
points = [
[Point(0, 0, 0), Point(1, 0, 0), Point(2, 0, 0), Point(3, 0, 0)],
[Point(0, 1, 0), Point(1, 1, 2), Point(2, 1, 2), Point(3, 1, 0)],
[Point(0, 2, 0), Point(1, 2, 2), Point(2, 2, 2), Point(3, 2, 0)],
[Point(0, 3, 0), Point(1, 3, 0), Point(2, 3, 0), Point(3, 3, 0)],
]
surface = OCCNurbsSurface.from_points(points=points)
# ==============================================================================
# Intersections
# ==============================================================================
base = Point(* centroid_points_xy(list(flatten(points))))
line = Line(base, base + Vector(0, 0, 1))
Ry = Rotation.from_axis_and_angle(Vector.Yaxis(), radians(30), point=base)
line.transform(Ry)
lines = []
for i in range(30):
Rz = Rotation.from_axis_and_angle(Vector.Zaxis(), radians(i * 360/30), point=base)
lines.append(line.transformed(Rz))
intersections = []
for line in lines:
x = surface.intersections_with_line(line)
if x:
intersections.append(x[0])
# ==============================================================================
# Visualisation
# ==============================================================================
view = App(viewmode='ghosted')
for row in surface.points:
view.add(Polyline(row), show_points=True, pointsize=20, pointcolor=(1, 0, 0), linewidth=2, linecolor=(0.3, 0.3, 0.3))
for col in zip(* surface.points):
view.add(Polyline(col), show_points=True, pointsize=20, pointcolor=(1, 0, 0), linewidth=2, linecolor=(0.3, 0.3, 0.3))
view.add(Collection(intersections), size=30, color=(0, 0, 1))
for x in intersections:
view.add(Line(base, base + (x - base).scaled(1.2)), linewidth=1, color=(0, 0, 1))
view.add(surface.to_mesh(), show_edges=False)
view.run()