スポンサーリンク

線分の交差(三次元)(改)

改めてみると間違っていた気がするのでここに修正版を置く。

あと確認のためにBlenderのスクリプトを組んで確認した。

このd1,d2を、最初の②の式に代入する。

確認用プログラム

import bpy
import mathutils


def _nearestLineLinePoints3_(A,B,C,D):
    AC = C-A
    
    n1 = B-A
    n1.normalize()
    
    n2 = D-C
    n2.normalize()
    
    AmC=A-C
    CmA=C-A
    
    ###############################################
    numerator = n2.dot(AmC) + n2.dot(n1) * ( n1.dot(CmA) / n1.dot(n1) )
    denominator = n2.dot(n2) - n1.dot(n2)**2 / n1.dot(n1)
    
    d2 = numerator / denominator
    ###############################################
    numerator = n1.dot(CmA) + n1.dot(n2) * d2
    denominator = n1.dot(n1)
    
    d1 = numerator / denominator
    ###############################################
    
    dn1 = n1 * d1
    _PAB = A + dn1
    
    dn2 = n2 * d2
    _PCD = C + dn2
    
    return _PAB,_PCD
        
    
A = mathutils.Vector((0.390268,-0.093855,-0.48373))
B = mathutils.Vector((-0.401277 ,0.95607,-0.045612))
C = mathutils.Vector((-0.475275 ,-0.448733 ,0.344921))
D = mathutils.Vector((0.231105 ,0.937974 ,-0.776157))

PAB = mathutils.Vector((0,0,0))
PCD = mathutils.Vector((0,0,0))

ret = _nearestLineLinePoints3_(A,B,C,D)
    
PAB = ret[0]
PCD = ret[1]

#############################################
print( PAB,PCD)

#頂点定義
verts = []
verts.append( A )
verts.append( B )
verts.append( C )
verts.append( D )
verts.append( PAB )
verts.append( PCD )


#面を、それを構成する頂点番号で定義
edges =[]
edges.append( [0,1] )
edges.append( [2,3] )
edges.append( [4,5] )

#頂点と頂点番号からメッシュを作成
mymesh = bpy.data.meshes.new("mymesh")
mymesh.from_pydata(verts,edges,[]) #作成部分
mymesh.update()

#オブジェクトを作成し、メッシュを登録
obj = bpy.data.objects.new("My_Object", mymesh)

#オブジェクトのマテリアルを作成
mat = bpy.data.materials.new("Mat1")
mat.diffuse_color = (0.3,0.7,0.5,1.0)
obj.active_material = mat

#オブジェクトを登録
bpy.context.scene.collection.objects.link(obj)

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: