jw_cad 外部変形 - (860) pythonで2線の交角を計算する -

外部変形は データのやり取りをテキストファイルで行うので プログラム言語は 自由に選ぶことができます。図形は機能的かつシンプルなため、数多くのユーザーに受け入れられています。

 

pythonで2線の交角を計算する

:pythonで2線の交角を計算する
@echo off
if not exist %~dpn0.py (
  for /f "delims=:" %%n in ('findstr /n "^#!" %0') do (
    more +%%n %0 > %~dpn0.py
  )
)
copy jwc_temp.txt myfiles > nul
python %~dpn0.py > jwc_temp.txt
goto:eof

REM #jww
REM #1%dln 線を指示してください
REM #2%dln 線を指示してください
REM #bz
REM #e

#!この次の行からプログラムを書いてください
# coding: shift_jis
def lnlength(x):
  x1, y1, x2, y2 = x
  return hypot(x2 - x1, y2 - y1)

def lnslope(x):
  x1, y1, x2, y2 = x
  return atan2(y2 - y1, x2 - x1)

def ln_hpsnap(x, p):
  t = ln_hpdist(x, p)
  d = lnslope(x)
  x1, y1 = p
  return ( x1 + t*sin(d), y1 - t*cos(d) )

def ln_hpdist(x, p):
  y = p + x[0:2]
  return lnlength(y) * sin( lnslope(x) - lnslope(y) )

def line_x_poi(ln1, ln2):
  x1, y1, x2, y2 = ln1
  dx1 = x2 - x1
  dy1 = y2 - y1
  m1 = dx1 == 0 and 1e20 or dy1 / dx1
  x3, y3, x4, y4 = ln2
  dx2 = x4 - x3
  dy2 = y4 - y3
  m2 = dx2 == 0 and 1e20 or dy2 / dx2
  aa = m1 - m2
  if abs(aa) < 1e-10:
    aa = 0
  if aa != 0:
    b1 = y1 - m1 * x1
    b2 = y3 - m2 * x3
    return ( (b2 - b1) / aa, (m1 * b2 - m2 * b1) / aa)
  else:
    sys.exit()

import sys,re
from math import *

hp = [(0,0)]*5
ln = [(0,0,0,0)]*5
try :
  f = open("myfiles", "r")
  for line in f:
    F = line.split()
    if re.compile("^hp[12]").search(line):
      i = int( re.sub("hp|ln|ci|ch|-","",F[0]) )
      hp[i] = tuple(map(float, F[1:3]))
    if re.compile("^hhp[12]ln").search(line):
      strg = re.sub("ln|-","",line.rstrip())
      lnn = int( strg[3:] )
    if re.compile("^\s+").search(line):
      ln[lnn] = tuple(map(float, F))
  f.close()
except :
  sys.exit()

pc = line_x_poi(ln[1], ln[2])
p1 = ln_hpsnap(ln[1], hp[1])
p2 = ln_hpsnap(ln[2], hp[2])
d1 = lnslope(pc + p1)
d2 = lnslope(pc + p2)
xang = (d2 - d1) * 180 / pi
while xang >  180: xang -= 360
while xang < -180: xang += 360
print("h#2線の交角 = ∠%.3f゚ : d1=%.3f゚ : d2=%.3f゚" % (xang, d1 * 180 / pi, d2 * 180 / pi))