def area(self): # Returns the area of the polygon, in nondimensional (normalized to chord^2) units. x = self.x() y = self.y() x_n = np.roll(x, -1) # x_next, or x_i+1 y_n = np.roll(y, -1) # y_next, or y_i+1 a = x * y_n - x_n * y # a is the area of the triangle bounded by a given point, the next point, and the origin. A = 0.5 * np.sum(a) # area return A
def area(self) -> float: """ Returns the area of the polygon. """ x = self.x() y = self.y() x_n = np.roll(x, -1) # x_next, or x_i+1 y_n = np.roll(y, -1) # y_next, or y_i+1 a = x * y_n - x_n * y # a is the area of the triangle bounded by a given point, the next point, and the origin. A = 0.5 * np.sum(a) # area return A
def centroid(self): # Returns the centroid of the polygon, in nondimensional (chord-normalized) units. x = self.x() y = self.y() x_n = np.roll(x, -1) # x_next, or x_i+1 y_n = np.roll(y, -1) # y_next, or y_i+1 a = x * y_n - x_n * y # a is the area of the triangle bounded by a given point, the next point, and the origin. A = 0.5 * np.sum(a) # area x_c = 1 / (6 * A) * np.sum(a * (x + x_n)) y_c = 1 / (6 * A) * np.sum(a * (y + y_n)) centroid = np.array([x_c, y_c]) return centroid
def centroid(self) -> np.ndarray: """ Returns the centroid of the polygon as a 1D np.ndarray of length 2. """ x = self.x() y = self.y() x_n = np.roll(x, -1) # x_next, or x_i+1 y_n = np.roll(y, -1) # y_next, or y_i+1 a = x * y_n - x_n * y # a is the area of the triangle bounded by a given point, the next point, and the origin. A = 0.5 * np.sum(a) # area x_c = 1 / (6 * A) * np.sum(a * (x + x_n)) y_c = 1 / (6 * A) * np.sum(a * (y + y_n)) centroid = np.array([x_c, y_c]) return centroid
def Ixx(self): # Returns the nondimensionalized Ixx moment of inertia, taken about the centroid. x = self.x() y = self.y() x_n = np.roll(x, -1) # x_next, or x_i+1 y_n = np.roll(y, -1) # y_next, or y_i+1 a = x * y_n - x_n * y # a is the area of the triangle bounded by a given point, the next point, and the origin. A = 0.5 * np.sum(a) # area x_c = 1 / (6 * A) * cas.sum1(a * (x + x_n)) y_c = 1 / (6 * A) * cas.sum1(a * (y + y_n)) centroid = np.array([x_c, y_c]) Ixx = 1 / 12 * np.sum(a * (y**2 + y * y_n + y_n**2)) Iuu = Ixx - A * centroid[1]**2 return Iuu
def Ixy(self): # Returns the nondimensionalized product of inertia, taken about the centroid. x = self.x() y = self.y() x_n = np.roll(x, -1) # x_next, or x_i+1 y_n = np.roll(y, -1) # y_next, or y_i+1 a = x * y_n - x_n * y # a is the area of the triangle bounded by a given point, the next point, and the origin. A = 0.5 * np.sum(a) # area x_c = 1 / (6 * A) * np.sum(a * (x + x_n)) y_c = 1 / (6 * A) * np.sum(a * (y + y_n)) centroid = np.array([x_c, y_c]) Ixy = 1 / 24 * np.sum(a * (x * y_n + 2 * x * y + 2 * x_n * y_n + x_n * y)) Iuv = Ixy - A * centroid[0] * centroid[1] return Iuv
def Iyy(self): """ Returns the nondimensionalized Iyy moment of inertia, taken about the centroid. """ x = self.x() y = self.y() x_n = np.roll(x, -1) # x_next, or x_i+1 y_n = np.roll(y, -1) # y_next, or y_i+1 a = x * y_n - x_n * y # a is the area of the triangle bounded by a given point, the next point, and the origin. A = 0.5 * np.sum(a) # area x_c = 1 / (6 * A) * np.sum(a * (x + x_n)) y_c = 1 / (6 * A) * np.sum(a * (y + y_n)) centroid = np.array([x_c, y_c]) Iyy = 1 / 12 * np.sum(a * (x**2 + x * x_n + x_n**2)) Ivv = Iyy - A * centroid[0]**2 return Ivv
def test_roll_casadi_2d(): a = np.array([[1, 2, 3], [4, 5, 6]]) b = cas.SX(a) assert np.all(cas.DM(np.roll(b, 1, axis=1)) == np.roll(a, 1, axis=1))
def test_roll_casadi(): b = np.array([[3, 1, 2]]) a = cas.SX(b) assert np.all(cas.DM(np.roll(a, 1)) == b)
def test_roll_onp(): a = [1, 2, 3] b = [3, 1, 2] assert np.all(np.roll(a, 1) == b)