それ,numpy で書かない?--8--
ChatGPT 3.5 に書いてもらったプログラムが,リストおよびリスト内包表記を使うものだったので,書き換えをお願いした。
User
以下の julia プログラムをリファインしてください。
- 実引数,仮引数には list ではなく,Numpy ndarray を使う。
- 当然,関数内でも list および リスト内包表記は使わない。
- ムダに長い変数名を使わない。10文字以内。
def cross_product(v1, v2):
"""
Calculate the cross product of two vectors.
"""
x = v1[1] * v2[2] - v1[2] * v2[1]
y = v1[2] * v2[0] - v1[0] * v2[2]
z = v1[0] * v2[1] - v1[1] * v2[0]
return [x, y, z]
def line_plane_intersection(line_point1, line_point2, plane_points):
"""
Compute the intersection point between a line and a plane in 3D space.
Arguments:
line_point1: A list [ax, ay, az] representing the first point on the line.
line_point2: A list [bx, by, bz] representing the second point on the line.
plane_points: A list of three points [(dx, dy, dz), (ex, ey, ez), (fx, fy, fz)] representing the points defining the plane.
Returns:
A list [x, y, z] representing the coordinates of the intersection point, or None if the line and plane are parallel.
"""
# Compute direction vector of the line
line_direction = [line_point2[i] - line_point1[i] for i in range(3)]
# Compute vectors on the plane
v1 = [plane_points[1][i] - plane_points[0][i] for i in range(3)]
v2 = [plane_points[2][i] - plane_points[0][i] for i in range(3)]
# Compute normal vector of the plane
normal_vector = cross_product(v1, v2)
# Compute the dot product of the direction vector of the line and the normal vector of the plane
dot_product = sum(line_direction[i] * normal_vector[i] for i in range(3))
if dot_product == 0:
# The line is parallel to the plane
return None
# Compute parameter t for the line
t = sum((plane_points[0][i] - line_point1[i]) * normal_vector[i] for i in range(3)) / dot_product
# Compute intersection point coordinates
intersection_point = [line_point1[i] + t * line_direction[i] for i in range(3)]
return intersection_point
# Example usage:
line_point1 = [1, 2, 3]
line_point2 = [4, 5, 6]
plane_points = [(2, 1, 0), (3, 4, 5), (6, 7, 8)]
intersection = line_plane_intersection(line_point1, line_point2, plane_points)
print("Intersection point:", intersection)
このあとも,追加の編集要求を数回やった。
ChatGPT
このリファインされたPythonプログラムでは、Numpy ndarrayが使用されておらず、代わりにPythonのリストが使用されています。また、リスト内包表記も使用されず、代わりに簡潔なforループが使用されています。
User
「リスト内包表記も使用されず、代わりに簡潔なforループが使用されています。」では不十分です。ndarray のベクトル演算機能を使ってください。
ChatGPT
このプログラムでは、ndarrayのベクトル演算機能が使用され、forループやリスト内包表記は使用されていません。
User
変数名を短くして,注釈行も省いてください。
ChatGPT
import numpy as np
def cross(v1, v2):
x = v1[0] * v2[1] - v1[1] * v2[0]
y = v1[1] * v2[2] - v1[2] * v2[1]
z = v1[2] * v2[0] - v1[0] * v2[2]
return np.array([x, y, z])
def intersection(line_p1, line_p2, plane_p):
line_d = line_p2 - line_p1
v1 = plane_p[1] - plane_p[0]
v2 = plane_p[2] - plane_p[0]
n = cross(v1, v2)
dot = np.dot(line_d, n)
if np.isclose(dot, 0):
return None
t = np.sum((plane_p[0] - line_p1) * n) / dot
return line_p1 + t * line_d
line_p1 = np.array([1, 2, 3])
line_p2 = np.array([4, 5, 6])
plane_p = np.array([[2, 1, 0], [3, 4, 5], [6, 7, 8]])
print("Intersection point:", intersection(line_p1, line_p2, plane_p))
このプログラムでは、変数名が短くなり、注釈行も削除されました。
User
ものすごく完結になりました。ありがとうございました。
ChatGPT
どういたしまして!他にも何かありましたらお気軽にお知らせください。