#!/usr/bin/python
# coding: utf8
# ベクトルの外積から求める方法
# 2点からベクトルを求める
# 引数 p1, p2 : (x, y, z)のタプル
def get_vector(p1, p2):
x = p2[0] - p1[0]
y = p2[1] - p1[1]
z = p2[2] - p1[2]
return (x, y, z)
# 2つのベクトルから外積を求める
# 引数 v1, v2 : (x, y, z)のタプル
def get_cross_product(v1, v2):
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 main():
pa = (50, 600, 900)
pb = (385, 630, 905)
pc = (260, 30, 915)
#ベクトルをつくる
vab = get_vector(pa, pb) # a から b へ向かうベクトル
vac = get_vector(pa, pc) # a から c へ向かうベクトル
print('vab=' + str(vab))
print('vac=' + str(vac))
# 求める平面の法線ベクトル(=vabとvacの外積)を求める
vn = get_cross_product(vab, vac)
'''
法線ベクトル vn = (p, q, r), 平面上の任意の点 P0=(x0, y0, z0) とすれば
p(x-x0) + q(y-y0) + r(z-z0) = 0 が求める平面の方程式
ax + by + cz = d の形へ直すと a,b,c,d の各値は
a = p, b = q, c = r
d = p*x0 + q*y0 + r*z0
'''
d = vn[0]*pa[0] + vn[1]*pa[1] + vn[2]*pa[2] # paの値を使ってdを計算(pb,pcでも一緒)
# 結果の表示
print('a= ', str(vn[0]))
print('b= ', str(vn[1]))
print('c= ', str(vn[2]))
print('d= ', str(d))
# プログラム開始
if __name__ == '__main__':
main()
IyEvdXNyL2Jpbi9weXRob24KIyBjb2Rpbmc6IHV0ZjgKIyDjg5njgq/jg4jjg6vjga7lpJbnqY3jgYvjgonmsYLjgoHjgovmlrnms5UKCiMg77yS54K544GL44KJ44OZ44Kv44OI44Or44KS5rGC44KB44KLCiMg5byV5pWwIHAxLCBwMiA6ICh4LCB5LCB6KeOBruOCv+ODl+ODqwpkZWYgZ2V0X3ZlY3RvcihwMSwgcDIpOgogICAgeCA9IHAyWzBdIC0gcDFbMF0KICAgIHkgPSBwMlsxXSAtIHAxWzFdCiAgICB6ID0gcDJbMl0gLSBwMVsyXQogICAgcmV0dXJuICh4LCB5LCB6KQogICAgICAgIAojIO+8kuOBpOOBruODmeOCr+ODiOODq+OBi+OCieWkluepjeOCkuaxguOCgeOCiwojIOW8leaVsCB2MSwgdjIgOiAoeCwgeSwgeinjga7jgr/jg5fjg6sKZGVmIGdldF9jcm9zc19wcm9kdWN0KHYxLCB2Mik6CiAgICB4ID0gKHYxWzFdICogdjJbMl0pIC0gKHYxWzJdICogdjJbMV0pCiAgICB5ID0gKHYxWzJdICogdjJbMF0pIC0gKHYxWzBdICogdjJbMl0pCiAgICB6ID0gKHYxWzBdICogdjJbMV0pIC0gKHYxWzFdICogdjJbMF0pCiAgICByZXR1cm4gKHgsIHksIHopCgojIOODoeOCpOODswpkZWYgbWFpbigpOgogICAgcGEgPSAoNTAsIDYwMCwgOTAwKSAgIAogICAgcGIgPSAoMzg1LCA2MzAsIDkwNSkgICAgCiAgICBwYyA9ICgyNjAsIDMwLCA5MTUpCiAgICAKICAgICPjg5njgq/jg4jjg6vjgpLjgaTjgY/jgosKICAgIHZhYiA9IGdldF92ZWN0b3IocGEsIHBiKSAgICAjIGEg44GL44KJIGIg44G45ZCR44GL44GG44OZ44Kv44OI44OrCiAgICB2YWMgPSBnZXRfdmVjdG9yKHBhLCBwYykgICAgIyBhIOOBi+OCiSBjIOOBuOWQkeOBi+OBhuODmeOCr+ODiOODqwogICAgcHJpbnQoJ3ZhYj0nICsgc3RyKHZhYikpCiAgICBwcmludCgndmFjPScgKyBzdHIodmFjKSkKICAgIAogICAgIyDmsYLjgoHjgovlubPpnaLjga7ms5Xnt5rjg5njgq/jg4jjg6soPXZhYuOBqHZhY+OBruWkluepjSnjgpLmsYLjgoHjgosKICAgIHZuID0gZ2V0X2Nyb3NzX3Byb2R1Y3QodmFiLCB2YWMpCiAgICAnJycKICAgIOazlee3muODmeOCr+ODiOODqyB2biA9IChwLCBxLCByKSwg5bmz6Z2i5LiK44Gu5Lu75oSP44Gu54K5IFAwPSh4MCwgeTAsIHowKSDjgajjgZnjgozjgbAKICAgIHAoeC14MCkgKyBxKHkteTApICsgcih6LXowKSA9IDAg44GM5rGC44KB44KL5bmz6Z2i44Gu5pa556iL5byPCiAgICBheCArIGJ5ICsgY3ogPSBkIOOBruW9ouOBuOebtOOBmeOBqCBhLGIsYyxkIOOBruWQhOWApOOBrwogICAgYSA9IHAsIGIgPSBxLCBjID0gcgogICAgZCA9IHAqeDAgKyBxKnkwICsgcip6MAogICAgJycnCiAgICBkID0gdm5bMF0qcGFbMF0gKyB2blsxXSpwYVsxXSArIHZuWzJdKnBhWzJdICAgICMgcGHjga7lgKTjgpLkvb/jgaPjgaZk44KS6KiI566XKHBiLHBj44Gn44KC5LiA57eSKQoKICAgICMg57WQ5p6c44Gu6KGo56S6CiAgICBwcmludCgnYT0gJywgc3RyKHZuWzBdKSkKICAgIHByaW50KCdiPSAnLCBzdHIodm5bMV0pKQogICAgcHJpbnQoJ2M9ICcsIHN0cih2blsyXSkpCiAgICBwcmludCgnZD0gJywgc3RyKGQpKQoKIyDjg5fjg63jgrDjg6njg6Dplovlp4sKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIG1haW4oKQ==